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