什么是CRD
CustomResourceDefinitions
,即自定义资源。k8s拥有一些内置的资源,比如说Pod,Deployment,ReplicaSet等等,而CRD则提供了一种方式,使用户可以自定义新的资源,以扩展k8s的功能。
logcollectors.ccs.cloud.tencent.com
以添加日志收集服务,而Istio也大量使用到了CRD。
kubectl api-resources
命令查看集群中已定义的资源:[root@nodek8s]#kubectlapi-resourcesNAMESHORTNAMESAPIGROUPNAMESPACEDKINDconfigmapscmtrueConfigMapendpointseptrueEndpointseventsevtrueEventnamespacesnsfalseNamespacepersistentvolumespvfalsePersistentVolumepodspotruePodpodtemplatestruePodTemplatestorageclassesscstorage.k8s.iofalseStorageClass...
-
NAME:CRD的复数名称 -
SHORTNAMES:cli中使用的资源简称 -
APIGROUP:API所使用的组名称 -
NAMESPACED:是否具有namespace属性 -
KIND:资源文件需要,用以识别资源
kube-controller-manager
组件提供了多种内置控制器,比如说:
cronjob
,
daemonset
,
deployment
,
namespace
等等,它们监听资源的创建/更新/删除,且做出相应的动作。而对于CRD来说,也可以编写相应的控制器来完成对应的功能。CRD使用
apiextensions.k8s.io/v1beta1API
访问CRD,大于1.16.0版本则可以使用
apiextensions.k8s.io/v1API
。创建CRD
CRD资源文件示例:
#crd-test.ymlapiVersion:apiextensions.k8s.io/v1beta1kind:CustomResourceDefinitionmetadata:#名称必须符合如下格式:<plural>.<group>name:crontabs.staight.k8s.iospec:#组名,表示使用该API:/apis/<group>/<version>group:staight.k8s.io#version列表,表示该CRD支持的版本versions:-name:v1#开启/关闭该APIserved:true#有且只能有一个版本要将storage设置为truestorage:true#Namespaced/Cluster,表示该CRD是命令空间属性还是集群属性scope:Namespacednames:#API中使用的名称:/apis/<group>/<version>/<plural>plural:crontabs#单数名称,cli中使用singular:crontab#往往是首字母大写的单数名称,资源文件中需要用到kind:CronTab#cli中的简称shortNames:-ct#阻止无法识别的字段,集群版本1.15以上才可使用preserveUnknownFields:false#创建资源文件时需验证的字段validation:openAPIV3Schema:type:objectproperties:spec:type:objectproperties:cronSpec:type:stringimage:type:stringreplicas:type:integer
然后创建该CRD:
[root@nodek8s]#kubectlcreate-fcrd-test.ymlcustomresourcedefinition.apiextensions.k8s.io/crontabs.staight.k8s.iocreated
接着就能查到该CRD:
[root@nodek8s]#kubectlgetcrdcrontabs.staight.k8s.ioNAMECREATEDATcrontabs.staight.k8s.io2019-10-08T10:21:09Z
CRD创建完成。可以通过URL: 访问到crontab资源。
创建自定义对象
#crontab.ymlapiVersion:"staight.k8s.io/v1"kind:CronTabmetadata:name:new-crontabspec:cronSpec:"*****"image:new-image
注意spec中的字段应符合CRD的要求,创建它:
[root@nodek8s]#kubectlcreate-fcrontab.ymlcrontab.staight.k8s.io/new-crontabcreated
接着即可看到该对象:
[root@nodek8s]#kubectlgetcrontabNAMEAGEnew-crontab28s
小结
-
CRD用来自定义资源,是扩展k8s最常用的方式。
-
只创建CRD并没有实际意义,想要CRD工作还需创建控制器,监听资源变动并做出相应动作。