服务器之家:专注于服务器技术及软件下载分享
分类导航

服务器资讯|IT/互联网|云计算|区块链|软件资讯|操作系统|手机数码|百科知识|免费资源|头条新闻|

服务器之家 - 新闻资讯 - 云计算 - 如何用 Kubernetes 自定义资源?一文聊聊 CRD

如何用 Kubernetes 自定义资源?一文聊聊 CRD

2023-08-15 12:00未知服务器之家 云计算

什么是CRD CRD的全称为 CustomResourceDefinitions ,即自定义资源。k8s拥有一些内置的资源,比如说Pod,Deployment,ReplicaSet等等,而CRD则提供了一种方式,使用户可以自定义新的资源,以扩展k8s的功能。 使用CRD可以在不修改k8s源代码的基础

什么是CRD

CRD的全称为 CustomResourceDefinitions ,即自定义资源。k8s拥有一些内置的资源,比如说Pod,Deployment,ReplicaSet等等,而CRD则提供了一种方式,使用户可以自定义新的资源,以扩展k8s的功能。
使用CRD可以在不修改k8s源代码的基础上方便的扩展k8s的功能,比如腾讯云TKE使用CRD: logcollectors.ccs.cloud.tencent.com 以添加日志收集服务,而Istio也大量使用到了CRD。
值得一提的是,另一种扩展k8s的方式是apiservice,通过API:metrics.k8s.io自定义HPA是其最典型的应用。
可以使用 kubectl api-resources 命令查看集群中已定义的资源:

[root@nodek8s]#kubectlapi-resourcesNAMESHORTNAMESAPIGROUPNAMESPACEDKINDconfigmapscmtrueConfigMapendpointseptrueEndpointseventsevtrueEventnamespacesnsfalseNamespacepersistentvolumespvfalsePersistentVolumepodspotruePodpodtemplatestruePodTemplatestorageclassesscstorage.k8s.iofalseStorageClass...

从如上输出中可以略窥一二,CRD至少包括如下属性:

  • NAME:CRD的复数名称
  • SHORTNAMES:cli中使用的资源简称
  • APIGROUP:API所使用的组名称
  • NAMESPACED:是否具有namespace属性
  • KIND:资源文件需要,用以识别资源

另外,CRD提供了定义资源的方式,不过想要让其具有实际意义还需控制器的配合。k8s的 kube-controller-manager 组件提供了多种内置控制器,比如说: cronjob daemonset deployment namespace 等等,它们监听资源的创建/更新/删除,且做出相应的动作。而对于CRD来说,也可以编写相应的控制器来完成对应的功能。

CRD使用

在k8s中CRD本身也是资源,大于1.7.0版本的集群可以使用 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资源。

创建自定义对象

在创建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工作还需创建控制器,监听资源变动并做出相应动作。

来源:%E7%AE%80%E4%BB%8B/


延伸 · 阅读

精彩推荐