一旦定义了CRD,可以通过Kubernetes API服务器创建和管理自定义资源的实例,就像处理任何其他本机资源一样。这意味着您可以使用熟悉的Kubernetes工具如kubectl或Kubernetes控制器与管理您的自定义资源进行交互。
CRD提供了一种扩展Kubernetes平台以适应特定要求的方式,并能够构建自定义的运算符或控制器来自动化管理自定义资源。运算符可以监视自定义资源的更改并相应地采取操作,例如提供额外的资源、扩展或执行自定义操作。
CRD已成为扩展Kubernetes的流行机制,在Kubernetes生态系统中的各种项目和框架中广泛使用,如Prometheus、Istio和Knative。
CRD示例:
1、定义YAML
$ cat > crd-example.yaml << EOF
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: myresources.example.com
spec:
group: example.com
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
description: Define CronTab YAML Spec
type: object
properties:
spec:
type: object
properties:
name:
type: string
age:
type: integer
scope: Namespaced
names:
plural: myresources
singular: myresource
kind: MyResource
shortNames:
- mr
EOF
上面参数说明:
- apiVersion:指定所使用的 CRD API 的版本,此示例使用了 apiextensions.k8s.io/v1 版本。
- kind:定义资源类型为 CustomResourceDefinition。
- metadata:定义元数据,其中 name 字段指定了 CRD 的名称为 myresources.example.com。
- spec:定义了 CRD 的规范。
- group:指定 CRD 所属的 API 组,此示例中为 example.com。
- versions:定义 CRD 的版本列表。
- name:指定版本的名称,此示例中为 v1。
- served:指定此版本是否由 API 服务器提供服务,设为 true 表示提供服务。
- storage:指定此版本是否持久化存储数据,设为 true 表示持久化存储。
- openAPIV3Schema: 指定自定义资源的 OpenAPI v3 架构定义
- type:定义类型
- properties:定义对象属性
- name/age:自定义具体属性的名字
- scope:指定资源的作用域,此示例中为 Namespaced,表示资源在命名空间级别进行管理。
- names:定义了资源的名称相关信息。
- plural:指定资源的复数形式名称,此示例中为 myresources。
- singular:指定资源的单数形式名称,此示例中为 myresource。
- kind:指定资源的类型名称,此示例中为 MyResource。
- shortNames:指定资源的缩略名称列表,此示例中只包含一个缩略名称 mr。
和我们定义普通的资源对象比较类似,这里可以随意定义一个自定义的资源对象,但是在创建资源的时候,肯定不是任由我们随意去编写 YAML 文件的,当我们把上面的 CRD 文件提交给 Kubernetes 之后,Kubernetes 会对我们提交的声明文件进行校验,从定义可以看出 CRD 是基于 OpenAPI v3 schem 进行规范的。
2、应用YAML
$ k apply -f crd-example.yaml
3、查看crd
$ k get crd | grep myresources
myresources.example.com 2023-10-05T10:54:38Z
4、一旦创建完自定义的CRD,那么就会生成一个自定义的API
/apis/example.com/v1/namespaces/*/myresources/...
MR示例:
1、创建自定义资源实例,基于前面CRD定义的资源
$ cat > myresource-instance.yaml <<EOF
apiVersion: example.com/v1
kind: MyResource ##和上面CRD里相对应
metadata:
name: myresource-instance
spec: ##以下两个key必须在CRD中有过定义
name: example
age: 25
EOF
2、应用
$ k apply -f myresource-instance.yaml
3、查看MyResource
$ k get mr
NAME AGE
myresource-instance 77s
以上定义的CRD,仅仅是写入到了etcd中,并没有其它用处,要想让它有进一步作用,还得去定义Controller
而Controller更多的是开发范畴的事情。
4、恢复
$ k delete -f myresource-instance.yaml,crd-example.yaml