当前位置: 首页 > 科技观察

如何使用Kubernetes自定义资源?这篇文章讲的是CRD

时间:2023-03-16 01:54:38 科技观察

是什么。CRDCRD的全称是CustomResourceDefinitions,即自定义资源。k8s内置了一些资源,如Pod、Deployment、ReplicaSet等,CRD提供了一种方式让用户自定义新的资源来扩展k8s的功能。使用CRD可以在不修改k8s源码的情况下轻松扩展k8s的功能。比如腾讯云TKE使用CRD:logcollectors.ccs.cloud.tencent.com来增加日志采集服务,Istio也被广泛应用到CRD中。值得一提的是,另一种扩展k8s的方式是apiservice,通过API定制HPA:metrics.k8s.io是其最典型的应用。可以使用kubectlapi-resources命令查看集群中定义的资源:[root@nodek8s]#kubectlapi-resourcesNAMESHORTNAMESAPIGROUPNAMESPACEDKINDconfigmapscmtrueConfigMapendpointseptrueEndpointseventsevtrueEventnamespacesnsfalseNamespacepersistentVolumespvfalseepodersistentpotruePodpodtemplatestruePodTemplatesstorageclassesscstorage.k8s.iofalseStorageClass...从上面的输出我们可以看出CRD至少包括以下属性:NAME:CRD的复数名称SHORTNAMES:cli中使用的资源的缩写APIGROUP:API使用的组名NAMESPACED:是否有namespace属性KIND:需要资源文件来标识资源另外,CRD提供了定义资源的方式,但是要让它有意义,k8s的kube-controller-manager组件需要配合controller提供各种内置Controller,如cronjob、daemonset、deployment、namespace等,监听资源的创建/更新/删除,并采取相应的动作。对于CRD,你也可以编写相应的控制器来完成相应的功能。k8s中使用了CRD。CRD本身也是一种资源。大于1.7.0版本的集群可以使用apiextensions.k8s.io/v1beta1API访问CRD,大于1.16.0版本可以使用apiextensions.k8s.io/v1API。创建CRDCRD资源文件示例:#crd-test.ymlapiVersion:apiextensions.k8s.io/v1beta1kind:CustomResourceDefinitionmetadata:#名称必须符合以下格式:.name:crontabs.staight.k8s。iospec:#组名,表示使用的API:/apis//group:staight.k8s.io#版本列表,表示CRDversions:-name:v1#enable/disabletheAPIserved:true#yes并且只有一个版本需要将storage设置为truestorage:true#Namespaced/Cluster,表示CRD是命名空间属性还是集群属性scope:Namespacednames:#API中使用的名称:/apis///plural:crontabs#单数名称,在cli中使用singular:crontab#通常是首字母大写的单数名称,资源文件需要使用kind:CronTab#cli中的缩写shortNames:-ct#无法阻止Recognizedfields,只有集群版本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:09ZCRD创建完成,可以通过URL访问:https://169.254.128.15:60002/apis/staight.k8s.io/v1/namespaces/default/crontabs访问crontab资源。创建自定义对象创建CRD后,您可以为其资源创建对象。资源文件示例:#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工作,你需要创建一个控制器来监控资源的变化并采取相应的行动。