如何用 Kubernetes 自定義資源?一文聊聊 CRD
什么是CRD
CRD的全稱為 ??CustomResourceDefinitions?
?,即自定義資源。k8s擁有一些內(nèi)置的資源,比如說Pod,Deployment,ReplicaSet等等,而CRD則提供了一種方式,使用戶可以自定義新的資源,以擴展k8s的功能。使用CRD可以在不修改k8s源代碼的基礎(chǔ)上方便的擴展k8s的功能,比如騰訊云TKE使用CRD:??logcollectors.ccs.cloud.tencent.com?
?以添加日志收集服務(wù),而Istio也大量使用到了CRD。值得一提的是,另一種擴展k8s的方式是apiservice,通過API:metrics.k8s.io自定義HPA是其最典型的應(yīng)用。可以使用??kubectl api-resources?
?命令查看集群中已定義的資源:
[root@node k8s]# kubectl api-resources
NAME SHORTNAMES APIGROUP NAMESPACED KIND
configmaps cm true ConfigMap
endpoints ep true Endpoints
events ev true Event
namespaces ns false Namespace
persistentvolumes pv false PersistentVolume
pods po true Pod
podtemplates true PodTemplate
storageclasses sc storage.k8s.io false StorageClass
...
從如上輸出中可以略窺一二,CRD至少包括如下屬性:
- NAME:CRD的復(fù)數(shù)名稱
- SHORTNAMES:cli中使用的資源簡稱
- APIGROUP:API所使用的組名稱
- NAMESPACED:是否具有namespace屬性
- KIND:資源文件需要,用以識別資源?
另外,CRD提供了定義資源的方式,不過想要讓其具有實際意義還需控制器的配合。k8s的??kube-controller-manager?
?組件提供了多種內(nèi)置控制器,比如說:??cronjob?
?,??daemonset?
?,??deployment?
?,??namespace?
?等等,它們監(jiān)聽資源的創(chuàng)建/更新/刪除,且做出相應(yīng)的動作。而對于CRD來說,也可以編寫相應(yīng)的控制器來完成對應(yīng)的功能。
CRD使用
在k8s中CRD本身也是資源,大于1.7.0版本的集群可以使用??apiextensions.k8s.io/v1beta1API?
?訪問CRD,大于1.16.0版本則可以使用??apiextensions.k8s.io/v1API?
?。
創(chuàng)建CRD
CRD資源文件示例:
# crd-test.yml
apiVersion apiextensions.k8s.io/v1beta1
kind CustomResourceDefinition
metadata
# 名稱必須符合如下格式:<plural>.<group>
name crontabs.staight.k8s.io
spec
# 組名,表示使用該API: /apis/<group>/<version>
group staight.k8s.io
# version列表,表示該CRD支持的版本
versions
name v1
# 開啟/關(guān)閉該API
servedtrue
# 有且只能有一個版本要將storage設(shè)置為true
storagetrue
# Namespaced/Cluster,表示該CRD是命令空間屬性還是集群屬性
scope Namespaced
names
# API中使用的名稱:/apis/<group>/<version>/<plural>
plural crontabs
# 單數(shù)名稱,cli中使用
singular crontab
# 往往是首字母大寫的單數(shù)名稱,資源文件中需要用到
kind CronTab
# cli中的簡稱
shortNames
ct
# 阻止無法識別的字段,集群版本1.15以上才可使用
preserveUnknownFieldsfalse
# 創(chuàng)建資源文件時需驗證的字段
validation
openAPIV3Schema
type object
properties
spec
type object
properties
cronSpec
type string
image
type string
replicas
type integer
然后創(chuàng)建該CRD:
[root@node k8s]# kubectl create -f crd-test.yml
customresourcedefinition.apiextensions.k8s.io/crontabs.staight.k8s.io created
接著就能查到該CRD:
[root@node k8s]# kubectl get crd crontabs.staight.k8s.io
NAME CREATED AT
crontabs.staight.k8s.io 2019-10-08T10:21:09Z
CRD創(chuàng)建完成??梢酝ㄟ^URL:https://169.254.128.15:60002/apis/staight.k8s.io/v1/namespaces/default/crontabs訪問到crontab資源。
創(chuàng)建自定義對象
在創(chuàng)建CRD之后,即可創(chuàng)建其資源的對象了。資源文件示例:
# crontab.yml
apiVersion"staight.k8s.io/v1"
kind CronTab
metadata
name new-crontab
spec
cronSpec"* * * * *"
image new-image
注意spec中的字段應(yīng)符合CRD的要求,創(chuàng)建它:
[root@node k8s]# kubectl create -f crontab.yml
crontab.staight.k8s.io/new-crontab created
接著即可看到該對象:
[root@node k8s]# kubectl get crontab
NAME AGE
new-crontab 28s
小結(jié)
- CRD用來自定義資源,是擴展k8s最常用的方式。
- 只創(chuàng)建CRD并沒有實際意義,想要CRD工作還需創(chuàng)建控制器,監(jiān)聽資源變動并做出相應(yīng)動作。