天天看點

帶你讀《雲原生應用開發 Operator原理與實踐》第三章 Kubebuilder 原理3.1 Kubebuilder 介紹與架構(一)

3.1.1         什麼是  Kubebuilder

通過前面章節的介紹,我們了解到 Kubebuilder是一個用 Go語言建構 KubernetesAPIs的架構,通過使用Kubebuilder,使用者可以遵循一套簡單的程式設計架構,使用 CRD建構 API、Controllers和 AdmissionWebHooks,實作對 k8s的擴充。

Kubebuilder中 的 主 要 組 件 包 含 Manager、Cache、Client與 Finalizers。 其 中,Manager元件主要實作管理外層,負責初始化Controller、Cache、Client的工作;Cache元件負責生成SharedInformer,Watch關注的GVK下的GVR 的變化(增、删、改),以觸發 Controller的 Reconcile邏輯;Client元件在工作中實作對資源進行 CURD操作,CURD操作封裝到 Client 中進行,其中的寫操作(增、删、改)直接通路 APIServer,讀操作(查)對接的是本地的 Cache;Finalizers元件主要用于處理 Kubernetes資源的預删除邏輯,保障資源被删除後能夠從 Cache中讀取到,清理相關的其他資源。

3.1.2       Kubebuilder 架構

Kubebuilder 這 種“ 腳手架”工具,将 Kubernetes的可擴充能力 CRD 進 行了簡化封裝, 那麼它是如何實作的呢? 下面來介紹Kubebuilder的架構及實作原理。Kubebuilder架構如圖 3-1所示。

Kubebuil-der 總體上将它涉及的資源所屬位置劃分為四大塊:UserDefined、APIScaffolds、ControllerRuntime、

Kubernetes叢集。                                            

KubebuilderScaffolds是實作這個腳手架最核心的邏輯,它借助 APIScaffolder對象子產品,實作了 CRD的 Template和 Controller的核心代碼塊。

CRD的定義和 Controller 兩個最核心的内容建構完成後,Userdefined 的子產品開始發揮作用,主要是使用者根據實際場景,設計 CRD的結構定義,當然這裡的 CRD的數量可以有多個;另外,使用者需要實作 Reconcile的邏輯,Reconcile 有什麼用?為什麼要實作它?這是我們即将介紹的ControllerRuntime子產品的重點工作。這裡,首先了解 Reconcile的含義,使用者自定義了CRD結構,而在 Kubernetes叢集中,想要實作這樣的 CRD 結構定義,Reconcile 需要協調邏輯。舉例來說,假設使用者定義了 MysqlCluster{Name:demo,Num:3} 這樣的結構體,而希望在系統中建立MySQL的叢集,而構造 MySQL 叢集的構造過程,就是 Reconcile過程做的工作。

使用者自定義的部分能工作的前提是要有一個 Kubernetes叢集,即架構中最下面的部分,它負責安裝 CRD及運作 Controller。而如何運作 Controller及其核心邏輯?通過ControllerRuntime庫可以實作。

在 ControllerRuntime子產品中,Kubebuilder建構出來的 CRD會注冊到 Scheme子產品,它提供了 Kinds與對應的 GoType的映射,即給定了 GoType,就能夠知道它的GKV(GroupKindVerision),這也是Kubernetes所有資源的注冊模式。舉例來說,我們給定了一個Scheme,“demo1.example.org/v1”.Demo{},這個GoType映射到demo1. example.org/v1的 DemoGVK,從 Kubernetes的 APIServer擷取的部分 JSON内容見代碼清單 3-1。

{

"apiVersion":"demo1.example.org/v1","kind":"Demo",

"metadata":{

...

}

通過這個 GoType,能夠正确地擷取 GVR的資訊,進而提供給 Controller, 擷取期望的狀态,即協調的邏輯。而在ControllerRuntime中Controller最依賴的除了Scheme之外,還包括 Manager 的初始化、安裝和啟動工作。Manager 的初始化依賴 ControllerRuntime庫初始化 Manager對象,包括 Client、Cache 等子產品的生成工作。然後 Client就可以實作對CRD的“增、删、改、查”,即建立、删除、更新、查詢等過程,而查詢的邏輯是通過本地的Cache 子產品實作的。這裡的Cache 負責監聽CRD 的變化,它是通過監聽Scheme,進而收集所有與 Controller有關的GVR 資源,并建立對應的監聽器,進而實作當監聽到Kubernetes叢集中的CRD發生變化觸發 Controller的協調程序Reconcile工作。

除此之外,Kuberbuilder工具生成的内容還包括 Finalizer,它用于處理   Kubernetes資源的預删除邏輯,保障資源被删除後能夠從 Cache中讀取到,清理相關的其他資源;OwnerReference用于清理資源時, 對于任何一個對象, 若它的 OwnerReference字段值為待删除對象,則這個對象也會被清理,支援對象的變更,也會觸發 Owner對象的Controller 的協調過程;Index 用于提供資源的緩存,提升用戶端資源的查詢效率。