参考官方文档:CustomResourceDefinition 扩展 Kubernetes API
创建 CustomResourceDefinition
CustomResourceDefinition(CRD)时,Kubernetes API 服务器会为你所 指定的每一个版本生成一个 RESTful 的 资源路径。CRD 可以是名字空间作用域的,也可以 是集群作用域的,取决于 CRD 的
scope
字段设置。和其他现有的内置对象一样,删除 一个名字空间时,该名字空间下的所有定制对象也会被删除。CustomResourceDefinition 本身是不受名字空间限制的,对所有名字空间可用。
创建CRD,代码
kubectl create -f crd.yaml
(venv) ➜ v1 git:(master) ✗ kubectl get crd
NAME CREATED AT
crontabs.stable.example.com 2022-05-03T06:36:22Z
stars.cnstar.kubecto-kubernetes.info 2022-05-03T08:11:02Z
创建定制对象
在创建了 CustomResourceDefinition 对象之后,你可以创建定制对象(Custom Objects)。定制对象可以包含定制字段。这些字段可以包含任意的 JSON 数据。 在下面的例子中,在类别为
CrontTab
的定制对象中,设置了
cronSpec
和
image
定制字段。类别
CronTab
来自你在上面所创建的 CRD 的规约。
创建CR,代码
kubectl create -f example.yaml
(venv) ➜ v1 git:(master) ✗ kubectl get star
NAME SCHEDULE COMMAND AGE REPLICAS PHASE
example-star 2022-05-03T16:13:00Z echo Kubernetes native star! 38m 3 Running
//用简写查看st
(venv) ➜ v1 git:(master) ✗ kubectl get st
NAME SCHEDULE COMMAND AGE REPLICAS PHASE
example-star 2022-05-03T16:13:00Z echo Kubernetes native star! 39m 3 Running
//查看资源和版本信息
(venv) ➜ v1 git:(master) ✗ kubectl api-resources | grep star
stars st cnstar.kubecto-kubernetes.info/v1 true Star
(venv) ➜ v1 git:(master) ✗ kubectl get crontab
NAME AGE
my-new-cron-object 134m(venv) ➜ v1 git:(master) ✗ kubectl get ct
NAME AGE
my-new-cron-object 134m
分类
分类(Categories)是定制资源所归属的分组资源列表(例如,
all
)。 你可以使用
kubectl get <分类名称>
来列举属于某分类的所有资源。
下面的示例在 CustomResourceDefinition 中将
all
添加到分类列表中, 并展示了如何使用
kubectl get all
来输出定制资源:
//categories 是定制资源所归属的分类资源列表
(venv) ➜ v1 git:(master) ✗ kubectl get all | grep star
star.cnstar.kubecto-kubernetes.info/example-star 2022-05-03T16:13:00Z echo Kubernetes native star! 40m 3 Running
设置结构化的模式
CustomResource 对象在定制字段中保存结构化的数据,这些字段和内置的字段
apiVersion
、
kind
和
metadata
等一起存储,不过内置的字段都会被 API 服务器隐式完成合法性检查。有了 OpenAPI v3.0 检查 能力之后,你可以设置一个模式(Schema),在创建和更新定制对象时,这一模式会被用来 对对象内容进行合法性检查。参阅下文了解这类模式的细节和局限性。
在
apiextensions.k8s.io/v1
版本中,CustomResourceDefinition 的这一结构化模式 定义是必需的。 在 CustomResourceDefinition 的 beta 版本中,结构化模式定义是可选的。
- 为对象根(root)设置一个非空的 type 值(藉由 OpenAPI 中的
),对每个 object 节点的每个字段(藉由 OpenAPI 中的type
或properties
)以及 array 节点的每个条目(藉由 OpenAPI 中的additionalProperties
)也要设置非空的 type 值, 除非:items
- 节点包含属性
x-kubernetes-int-or-string: true
- 节点包含属性
x-kubernetes-preserve-unknown-fields: true
- 对于 object 的每个字段或 array 中的每个条目,如果其定义中包含
、allOf
、anyOf
或oneOf
,则模式也要指定这些逻辑组合之外的字段或条目(试比较例 1 和例 2)。not
- 在
、allOf
、anyOf
或oneOf
上下文内不设置not
、description
、type
、default
或者additionalProperties
。此规则的例外是nullable
的两种模式(见下文)。x-kubernetes-int-or-string
- 如果
被设置,metadata
删除 CustomResourceDefinition
kubectl delete -f resourcedefinition.yaml
kubectl get crontabs
Error from server (NotFound): Unable to list {"stable.example.com" "v1" "crontabs"}: the server could not find the requested resource (get crontabs.stable.example.com)