Akemi

CRD自定义API资源介绍与使用官方案例

2024/12/08

CRD是一种k8s的自定义资源,可以通过yaml文件指定新的资源类型,包括资源的属性、版本、范围等

在自定义了资源之后,就可以使用这种资源,创建控制器来管理一些服务

但它的自定义,其实并不是从头开始的自定义,而是使用官方预先准备好的工具,我们定义CRD,其实是使用了官方提供的扩展

使用自定义CRD 官方示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
apiVersion: apiextensions.k8s.io/v1 # 指定使用的Kubernetes API版本,这里是用于扩展API的v1版本。
kind: CustomResourceDefinition # 声明这是一个CustomResourceDefinition对象。
metadata:
name: crontabs.stable.example.com # CRD的全局唯一名称,格式为<plural>.<group>。
spec:
group: stable.example.com # 自定义资源的API组名。
versions: # 定义CRD的不同版本。
- name: v1 # 版本的名称。
served: true # 表示该版本是活跃的,可以被API服务器服务。
storage: true # 表示该版本是存储版本,Kubernetes将使用这个版本存储CRD的数据。
schema: # 定义CRD对象的结构。
openAPIV3Schema: # 使用OpenAPI v3规范定义结构。
type: object # 根类型是对象。
properties: # 定义对象的属性。
spec: # 定义spec属性。
type: object # spec的类型是对象。
properties: # 定义spec对象的属性。
cronSpec: # cron表达式属性。
type: string # cron表达式的类型是字符串。
image:
type: string # 镜像的类型是字符串。
replicas:
type: integer # 副本数量的类型是整数。
scope: Namespaced # 定义CRD的作用域,这里是命名空间作用域,意味着CRD实例将绑定到特定的命名空间。
names:
plural: crontabs # 复数形式的名称,用于API路径中。
singular: crontab # 单数形式的名称。
kind: CronTab # CRD的类别名称,用于标识资源类型。
shortNames: # 定义CRD的简短名称列表。
- ct # 简短名称之一,允许用户以更短的命令引用CRD。

kubectl apply -f CRD-crontab.yaml

像上面这个自定义资源,其实只有spec.versions.schema.properties.spec.properties中的
字段是真正定义了创建资源时要自己写的字段,其余基本都是一些版本和名字的定义

kubectl api-versions | grep stable
[stable.example.com/v1](http://stable.example.com/v1)
此时可以看到我刚刚定义的这个group名已经可以查询到了

cat > CRD-crontab-example.yaml <<EOF
apiVersion: "stable.example.com/v1"
kind: CronTab
metadata:
name: my-new-cron-object
spec:
cronSpec: "* * * * * */5"
image: busybox
EOF
kubectl apply -f CRD-crontab-example.yaml

kubectl get ct
NAME AGE
my-new-cron-object 29s
CATALOG
  1. 1. 使用自定义CRD 官方示例