k8s CRD相关
1、CRD的意義
????????Kubernetes 1.7之后,提供了CRD(CustomResourceDefinitions)自定義資源的二次開發能力來擴展kubernetes API,通過此擴展可以向kubernetes API中增加新的資源類型,會比修改kubernetes apiserver的源代碼或創建自定義的apiserver來的更加的簡潔和容易,
2、在k8s上創建資源的過程
????????用戶創建一個資源,實際上是把k8s抽象的資源根據資源清單(yaml文件)做實例化。具體過程如下:
????????(1)用戶的資源請求發送給apiserver,通過apiserver的認證、授權、準入控制以后,通過apiserver把對應的資源定義信息存放在etcd中;
????????(2)對應資源類型的控制器一般被稱為 controller或operator,controller通過watch機制監聽apiserver上的資源變動,通過對應資源變動事件觸發對應類型資源的控制器從etcd中讀取對應資源的定義,并將對應資源創建出來,并通過控制器內部的和解循環(control loop)監控著對應資源狀態是否和用戶定義的期望狀態一樣;如果發現不一樣,內部和解循環就會被觸發,對應的控制器會向apiserver發起創建資源的請求,將對應資源重建,讓對應資源的狀態始終滿足用戶期望的狀態。
????????對于etcd來說,它是就一個kv數據庫,可以存儲任意類型的kv數據,但在k8s上,apiserver將不同類型的資源定義抽象成不同的資源,使得用戶創建對應資源必須是滿足對應類型資源定義的規范,然后將資源定義存放在etcd中。簡單講就是存入etcd中的數據必須是滿足對應apiserver接口定義的規范。
3、k8s擴展資源類型的方式
????????在k8s上擴展資源類型的方式有三種:
????????第一種是CRD,crd是k8s內置的資源類型,通過crd資源可以將用戶自定義資源類型轉換為k8s上資源類型;
????????第二種是自定義apiserver,這種方式是復用 Kubernetes 的一些特性的同時,自由度最高的方式。可以自定義存儲等,同時保有一定程度的公共特性。Cloud TiDB 的實現就是通過自定義 API server 進行的;
????????第三種方式就是修改現有k8s apiserver的源碼,讓其支持對應用戶自定義資源類型;
????????另外,進行自定義資源類型,只能把對應資源類型的定義信息寫入到etcd中,不能讓對應自定義類型資源實例化為一個自定義資源對象,它不能真正的跑起來,要想真正的跑起來,我們還需要一個自定義控制器,將對應資源實例化為k8s上的資源對象,并專門負責監聽對應的資源類型的資源變化。
????????因此需要(1)自定義資源類型CRD;+(2)對應自定義資源類型的控制器controller;
????????controller的作用是通過API Server提供的接口實時的對指定的resource進行監聽和執行的動作(watch,diff,action)。
備注:
k8s api = k8s資源 = pod、service、PV等
5種控制器類型:Deployment;StatefulSet;DaemonSet;Job;CronJob
crd和operator的區別:
所有的Operator都是基于Controller模式,Operator是使用CRD實現的定制化的Controller. 它與內置K8S Controller遵循同樣的運行模式(比如 watch, diff, action);operator的邏輯也是創建一個crd資源,再創建一個控制器。
即Kubernetes CRD Operator = kubernetes CRD+ custom controller
?
總結
- 上一篇: fmt.Println、fmt.Prin
- 下一篇: k8s创建pod的步骤