crd
CRD
目录
[toc]
1、什么是CRD
Custom Resource Define 简称 CRD,是 Kubernetes(v1.7+)为提高可扩展性,让开发者去自定义资源的一种方式。CRD 资源可以动态注册到集群中,注册完毕后,用户可以通过 kubectl 来创建访问这个自定义的资源对象,类似于操作 Pod 一样。不过需要注意的是: CRD 仅仅是资源的定义而已,需要一个 Controller 去监听 CRD 的各种事件来添加自定义的业务逻辑。
2、CRD的定义
如果说只是对 CRD 资源本身进行 CRUD 操作的话,不需要 Controller 也是可以实现的,相当于就是只有数据存入了 etcd 中,而没有对这个数据的相关操作而已。
- 比如我们可以定义一个如下所示的 CRD 资源清单文件:
#crd-demo.yamlapiVersion:apiextensions.k8s.io/v1kind:CustomResourceDefinitionmetadata:# name 必须匹配下面的spec字段:<plural>.<group>name:crontabs.stable.example.comspec:# group 名用于 REST API 中的定义:/apis/<group>/<version>group:stable.example.com# 列出自定义资源的所有 API 版本versions:- name:v1beta1# 版本名称,比如 v1、v2beta1 等等served:true# 是否开启通过 REST APIs 访问 `/apis/<group>/<version>/...`storage:true# 必须将一个且只有一个版本标记为存储版本schema:# 定义自定义对象的声明规范openAPIV3Schema:description:Define CronTab YAML Spectype:objectproperties:spec:type:objectproperties:cronSpec:type:stringimage:type:stringreplicas:type:integer# 定义作用范围:Namespaced(命名空间级别)或者 Cluster(整个集群)scope:Namespacednames:# kind 是 sigular 的一个驼峰形式定义,在资源清单中会使用kind:CronTab# plural 名字用于 REST API 中的定义:/apis/<group>/<version>/<plural>plural:crontabs# singular 名称用于 CLI 操作或显示的一个别名singular:crontab# shortNames 相当于缩写形式shortNames:- ct
需要注意的是 v1.16 版本以后已经 GA 了,使用的是 v1 版本,之前都是 v1beta1,定义规范有部分变化,所以要注意版本变化。
这个地方的定义和我们定义普通的资源对象比较类似,我们说我们可以随意定义一个自定义的资源对象,但是在创建资源的时候,肯定不是任由我们随意去编写 YAML 文件的,当我们把上面的 CRD 文件提交给 Kubernetes 之后,Kubernetes 会对我们提交的声明文件进行校验,从定义可以看出 CRD 是基于 OpenAPI v3 schem进行规范的。当然这种校验只是对于字段的类型进行校验,比较初级,如果想要更加复杂的校验,这个时候就需要通过 Kubernetes 的 admission webhook来实现了**(所以,一般情况下,我们可能把CRD和admission来结合使用)**。关于校验的更多用法,可以前往官方文档查看。
- 同样现在我们可以直接使用 kubectl 来创建这个 CRD 资源清单:
[root@master1 ~]#kubectl apply -f crd-demo.yamlcustomresourcedefinition.apiextensions.k8s.io/crontabs.stable.example.comcreated
- 这个时候我们可以查看到集群中已经有我们定义的这个 CRD 资源对象了:
[root@master1 ~]#kubectl get crdNAMECREATEDATcrontabs.stable.example.com2021-12-05T00:13:50Z
- 这个时候一个新的 namespace 级别的 RESTful API 就会被创建:
/apis/stable/example.com/v1beta1/namespaces5"image:my-awesome-cron-image
- 我们可以直接创建这个对象:
[root@master1 ~]#kubectl apply -f crd-crontab-demo.yamlcrontab.stable.example.com/my-new-cron-objectcreated
- 然后我们就可以用 kubectl 来管理我们这里创建 CronTab 对象了,比如:
[root@master1 ~]#kubectl get ctNAMEAGEmy-new-cron-object36s[root@master1 ~]#kubectl get crontabNAMEAGEmy-new-cron-object39s[root@master1 ~]#kubectl get crontabsNAMEAGEmy-new-cron-object41s[root@master1 ~]#
在使用 kubectl 的时候,资源名称是不区分大小写的,我们可以使用 CRD 中定义的单数或者复数形式以及任何简写。
- 我们也可以查看创建的这个对象的原始 YAML 数据:
[root@master1 ~]#kubectl get ct -oyamlapiVersion:v1items:-apiVersion:stable.example.com/v1beta1kind:CronTabmetadata:annotations:kubectl.kubernetes.io/last-applied-configuration:|{"apiVersion":"stable.example.com/v1beta1","kind":"CronTab","metadata":{"annotations":{},"name":"my-new-cron-object","namespace":"default"},"spec":{"cronSpec":"*****/5","image":"my-awesome-cron-image"}}creationTimestamp:"2021-12-05T00:30:24Z"generation:1name:my-new-cron-objectnamespace:defaultresourceVersion:"797893"uid:ad00b100-f2a3-473e-bb35-2f55c052a2e9spec:cronSpec:'*****/5'image:my-awesome-cron-imagekind:Listmetadata:resourceVersion:""selfLink:""[root@master1 ~]#
我们可以看到它包含了上面我们定义的 cronSpec
和 image
字段。
3、Controller
就如上面我们说的,现在我们自定义的资源创建完成了,但是也只是单纯的把资源清单数据存入到了 etcd 中而已,并没有什么其他用处,因为我们没有定义一个对应的 Controller 来处理他。
官方提供了一个自定义 Controller 的示例:https: 版权:此文章版权归 One 所有,如有转载,请注明出处! 链接:可点击右上角分享此页面复制文章链接
上次更新时间: