kubernetes controller 實現


對於kubernetes中不存在的資源類型,我們可以通過自定義資源的方式進行擴展,首先創建customresourcedefinition對象定義資源及其schema,然后就可以創建自定義的資源了,但是此時定義的資源是不具備生命周期的,無法在創建或銷毀的過程中自動執行一些操作,例如replicaSet可以自動根據pod的數量來進行failover,如果我們也要實現這種自動控制此時就需要編寫對應的controller, controller需要一個infromer來監聽創建刪除等事件,並執行預先定義的回調函數,代碼使用自定義的資源需要通過codegen自動生成其client-go api, 如果資源的變化需要反應在k8s event對象上(這樣我們通過kubectl describe 就可以看到發生了什么)還需要利用eventRecorder來產生event.
下面是一些具體的參考資料,我就不重復造輪子了.

CustomResourceDefinition(CRD)

Extend the Kubernetes API with CustomResourceDefinitions    

Advanced topic:

  • 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的資源需要設置這個字段

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 成功。

controller

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

controller中的event recorder相關

Kubernetes Events介紹 上中下
event有個過期時間,默認時間是1h, 所以如果需要一直顯示給用戶的話要不斷用recorder來記錄,event是獨立存在的一種資源,當describe 其他資源的時候會從其中獲取對應的event,

codegen生成client-go api

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

最后發現一篇相似的博文開發operator擴展kubernetes 調研整理,內容有些重復,哈哈


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM