CustomResourceDefinition
CRD 示例
下面的例子会创建一个 的自定义 API:
API 创建好后,就可以创建具体的 CronTab 对象了
$ cat my-cronjob.yaml
apiVersion: "stable.example.com/v1"
kind: CronTab
metadata:
name: my-new-cron-object
spec:
cronSpec: "* * * * /5"
image: my-awesome-cron-image
$ kubectl create -f my-crontab.yaml
crontab "my-new-cron-object" created
$ kubectl get crontab
NAME KIND
my-new-cron-object CronTab.v1.stable.example.com
$ kubectl get crontab my-new-cron-object -o yaml
apiVersion: stable.example.com/v1
kind: CronTab
metadata:
creationTimestamp: 2017-07-03T19:00:56Z
name: my-new-cron-object
namespace: default
resourceVersion: "20630"
selfLink: /apis/stable.example.com/v1/namespaces/default/crontabs/my-new-cron-object
spec:
cronSpec: '* * * * /5'
image: my-awesome-cron-image
Finalizer 用于实现控制器的异步预删除钩子,可以通过 metadata.finalizers
来指定 Finalizer。
apiVersion: "stable.example.com/v1"
kind: CronTab
metadata:
- finalizer.stable.example.com
Validation
v1.8 开始新增了实验性的基于 OpenAPI v3 schema 的验证(Validation)机制,可以用来提前验证用户提交的资源是否符合规范。使用该功能需要配置 kube-apiserver 的 --feature-gates=CustomResourceValidation=true
。
比如下面的 CRD 要求
spec.cronSpec
必须是匹配正则表达式的字符串spec.replicas
必须是从 1 到 10 的整数
这样,在创建下面的 CronTab 时
apiVersion: "stable.example.com/v1"
kind: CronTab
metadata:
name: my-new-cron-object
spec:
cronSpec: "* * * *"
image: my-awesome-cron-image
replicas: 15
The CronTab "my-new-cron-object" is invalid: []: Invalid value: map[string]interface {}{"apiVersion":"stable.example.com/v1", "kind":"CronTab", "metadata":map[string]interface {}{"name":"my-new-cron-object", "namespace":"default", "deletionTimestamp":interface {}(nil), "deletionGracePeriodSeconds":(*int64)(nil), "creationTimestamp":"2017-09-05T05:20:07Z", "uid":"e14d79e7-91f9-11e7-a598-f0761cb232d1", "selfLink":"","clusterName":""}, "spec":map[string]interface {}{"cronSpec":"* * * *", "image":"my-awesome-cron-image", "replicas":15}}:
validation failure list:
spec.cronSpec in body should match '^(\d+|\*)(/\d+)?(\s+(\d+|\*)(/\d+)?){4}$'
spec.replicas in body should be less than or equal to 10
v1.10 开始 CRD 还支持 /status
和 /scale
等两个子资源(Alpha)。使用前需要在 kube-apiserver
开启 --feature-gates=CustomResourceSubresources=true
。
$ kubectl create -f resourcedefinition.yaml
$ kubectl create -f- <<EOF
apiVersion: "stable.example.com/v1"
kind: CronTab
metadata:
name: my-new-cron-object
spec:
cronSpec: "* * * * */5"
image: my-awesome-cron-image
replicas: 3
$ kubectl scale --replicas=5 crontabs/my-new-cron-object
crontabs "my-new-cron-object" scaled
$ kubectl get crontabs my-new-cron-object -o jsonpath='{.spec.replicas}'
5
Categories
Categories 用来将 CRD 对象分组,这样就可以使用 kubectl get <category-name>
来查询属于该组的所有对象。
# resourcedefinition.yaml
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: crontabs.stable.example.com
spec:
group: stable.example.com
version: v1
scope: Namespaced
names:
plural: crontabs
singular: crontab
kind: CronTab
shortNames:
- ct
# categories is a list of grouped resources the custom resource belongs to.
categories:
- all
$ kubectl create -f resourcedefinition.yaml
$ kubectl create -f my-crontab.yaml
$ kubectl get all
NAME AGE
crontabs/my-new-cron-object 3s
在使用 CRD 扩展 Kubernetes API 时,通常还需要实现一个新建资源的控制器,监听改资源的变化情况,并作进一步的处理。
- 如何注册资源
Foo
- 如何创建、删除和查询
Foo
对象 - 如何监听
Foo
资源对象的变化情况