kubernetes controller 實現

對於kubernetes中不存在的資源類型,咱們能夠經過自定義資源的方式進行擴展,首先建立customresourcedefinition對象定義資源及其schema,而後就能夠建立自定義的資源了,可是此時定義的資源是不具有生命週期的,沒法在建立或銷燬的過程當中自動執行一些操做,例如replicaSet能夠自動根據pod的數量來進行failover,若是咱們也要實現這種自動控制此時就須要編寫對應的controller, controller須要一個infromer來監聽建立刪除等事件,並執行預先定義的回調函數,代碼使用自定義的資源須要經過codegen自動生成其client-go api, 若是資源的變化須要反應在k8s event對象上(這樣咱們經過kubectl describe 就能夠看到發生了什麼)還須要利用eventRecorder來產生event.
下面是一些具體的參考資料,我就不重複造輪子了.html

CustomResourceDefinition(CRD)

Extend the Kubernetes API with CustomResourceDefinitions    git

Advanced topic:github

  • Finalizers: 用於controller刪除過程,防止hard delete,能夠在刪除的過程當中執行一些必要的操做
  • Validation: 至關於filed的schema
  • Subresources: v1.10中處於alpha版本,定義了status,scale status subresource
  • Categories: 定義group,例如kubectl get all時是否顯示

從kubernetes1.8中開始,在建立資源的時候若是指定了ower reference對象,則刪除父對象的時候其子對象也會自動刪除,因此對於有relationship的資源須要設置這個字段api

informer

Kubernetes Informer 詳解 基本用法和實現簡單介紹
work queue example demo, work queue和index的基本使用方法函數

能夠在informer中EventHandler中添加一個filter
update失敗的時候,須要retry, k8s 有 OptimisticConcurrency 機制,若是有兩個 client 都在 update 同一個,會 fail。因此寫代碼時通常會把 update 寫到 loop 裏,直到 api-server 返回 200,ok 時才肯定 update 成功。oop

controller

sample-controller 完整的官方demo,註釋很詳細
使用 client-go 控制原生及拓展的 Kubernetes API 從client-go使用到Controller的編寫,全覆蓋,由google大佬所寫
Writing Controllers寫controller的注意事項,在上面的sample-controller中會有一些工程實踐
A Deep Dive Into Kubernetes Controllers 很詳細的controller的實現步驟,推薦google

controller中的event recorder相關

Kubernetes Events介紹 上中下
event有個過時時間,默認時間是1h, 因此若是須要一直顯示給用戶的話要不斷用recorder來記錄,event是獨立存在的一種資源,當describe 其餘資源的時候會從其中獲取對應的event,.net

codegen生成client-go api

Kubernetes Deep Dive: Code Generation for CustomResources codegen的使用方式
Extend Kubernetes 1.7 with Custom Resources 這是一個不用code-gen實現的controllercode

最後發現一篇類似的博文開發operator擴展kubernetes 調研整理,內容有些重複,哈哈orm

相關文章
相關標籤/搜索