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命令查看集群中已定义的资源:从如上输出中可以略窥一二,CRD至少包括如下属性:[]NAME SHORTNAMES APIGROUP NAMESPACED KINDconfigmaps cm true ConfigMapendpoints ep true Endpointsevents ev true Eventnamespaces ns false Namespacepersistentvolumes pv false PersistentVolumepods po true Podpodtemplates true PodTemplatestorageclasses sc storage.k8s.io false StorageClass...
kube-controller-manager组件提供了多种内置控制器,比如说:cronjob,daemonset,deployment,namespace等等,它们监听资源的创建/更新/删除,且做出相应的动作。而对于CRD来说,也可以编写相应的控制器来完成对应的功能。apiextensions.k8s.io/v1beta1API访问CRD,大于1.16.0版本则可以使用apiextensions.k8s.io/v1API。CRD资源文件示例:
# crd-test.ymlapiVersion: apiextensions.k8s.io/v1beta1kind: CustomResourceDefinitionmetadata:# 名称必须符合如下格式:. name: crontabs.staight.k8s.iospec:# 组名,表示使用该API: /apis// group: staight.k8s.io# version列表,表示该CRD支持的版本versions:- name: v1# 开启/关闭该APIserved: true# 有且只能有一个版本要将storage设置为truestorage: true# Namespaced/Cluster,表示该CRD是命令空间属性还是集群属性scope: Namespacednames:# API中使用的名称:/apis// / 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@node k8s]# kubectl create -f crd-test.ymlcustomresourcedefinition.apiextensions.k8s.io/crontabs.staight.k8s.io created
接着就能查到该CRD:
[root@node k8s]# kubectl get crd crontabs.staight.k8s.ioNAME CREATED ATcrontabs.staight.k8s.io 2019-10-08T1009Z
CRD创建完成。可以通过URL:https://169.254.128.15:60002/apis/staight.k8s.io/v1/namespaces/default/crontabs访问到crontab资源。
# crontab.ymlapiVersion: "staight.k8s.io/v1"kind: CronTabmetadata:name: new-crontabspec:cronSpec: "* * * * *"image: new-image
注意spec中的字段应符合CRD的要求,创建它:
[]crontab.staight.k8s.io/new-crontab created
接着即可看到该对象:
[]NAME AGEnew-crontab 28s
CRD用来自定义资源,是扩展k8s最常用的方式。
只创建CRD并没有实际意义,想要CRD工作还需创建控制器,监听资源变动并做出相应动作。
全部0条评论
快来发表一下你的评论吧 !