当你创建新的 CustomResourceDefinition(CRD)时,Kubernetes API 服务器会为你所指定的每个版本生成一个新的 RESTful 资源路径。 基于 CRD 对象所创建的自定义资源可以是名字空间作用域的,也可以是集群作用域的, 取决于 CRD 对象 spec.scope 字段的设置。
与其它的内置对象一样,删除名字空间也将删除该名字空间中的所有自定义对象。 CustomResourceDefinitions 本身是无名字空间的,可在所有名字空间中访问。
例如,如果你将下面的 CustomResourceDefinition 保存到 resourcedefinition.yaml 文件:
- apiVersion: apiextensions.k8s.io/v1
- kind: CustomResourceDefinition
- metadata:
- # 名字必需与下面的 spec 字段匹配,并且格式为 '<名称的复数形式>.<组名>'
- name: crontabs.stable.example.com
- spec:
- # 组名称,用于 REST API: /apis/<组>/<版本>
- group: stable.example.com
- # 列举此 CustomResourceDefinition 所支持的版本
- versions:
- - name: v1
- # 每个版本都可以通过 served 标志来独立启用或禁止
- served: true
- # 其中一个且只有一个版本必需被标记为存储版本
- storage: true
- schema:
- openAPIV3Schema:
- type: object
- properties:
- spec:
- type: object
- properties:
- cronSpec:
- type: string
- image:
- type: string
- replicas:
- type: integer
- # 可以是 Namespaced 或 Cluster
- scope: Namespaced
- names:
- # 名称的复数形式,用于 URL:/apis/<组>/<版本>/<名称的复数形式>
- plural: crontabs
- # 名称的单数形式,作为命令行使用时和显示时的别名
- singular: crontab
- # kind 通常是单数形式的帕斯卡编码(PascalCased)形式。你的资源清单会使用这一形式。
- kind: CronTab
- # shortNames 允许你在命令行使用较短的字符串来匹配资源
- shortNames:
- - ct
之后创建它:
kubectl apply -f resourcedefinition.yaml
这样一个新的受名字空间约束的 RESTful API 端点会被创建在:
/apis/stable.example.com/v1/namespaces/*/crontabs/...
此端点 URL 自此可以用来创建和管理定制对象。对象的 kind 将是来自你上面创建时 所用的 spec 中指定的 CronTab。
创建端点的操作可能需要几秒钟。你可以监测你的 CustomResourceDefinition 的 Established 状况变为 true,或者监测 API 服务器的发现信息等待你的资源出现在 那里。
在创建了 CustomResourceDefinition 对象之后,你可以创建定制对象(Custom Objects)。定制对象可以包含定制字段。这些字段可以包含任意的 JSON 数据。 在下面的例子中,在类别为 CronTab 的定制对象中,设置了cronSpec 和 image 定制字段。类别 CronTab 来自你在上面所创建的 CRD 的规约。
如果你将下面的 YAML 保存到 my-crontab.yaml:
- apiVersion: "stable.example.com/v1"
- kind: CronTab
- metadata:
- name: my-new-cron-object
- spec:
- cronSpec: "* * * * */5"
- image: my-awesome-cron-image
并执行创建命令:
kubectl apply -f my-crontab.yaml
你就可以使用 kubectl 来管理你的 CronTab 对象了。例如:
kubectl get crontab
应该会输出如下列表:
- NAME AGE
- my-new-cron-object 6s
使用 kubectl 时,资源名称是大小写不敏感的,而且你既可以使用 CRD 中所定义的单数 形式或复数形式,也可以使用其短名称:
kubectl get ct -o yaml
你可以看到输出中包含了你创建定制对象时在 YAML 文件中指定的定制字段 cronSpec 和 image:
- apiVersion: v1
- items:
- - apiVersion: stable.example.com/v1
- kind: CronTab
- metadata:
- annotations:
- kubectl.kubernetes.io/last-applied-configuration: |
- {"apiVersion":"stable.example.com/v1","kind":"CronTab","metadata":{"annotations":{},"name":"my-new-cron-object","namespace":"default"},"spec":{"cronSpec":"* * * * */5","image":"my-awesome-cron-image"}}
- creationTimestamp: "2021-06-20T07:35:27Z"
- generation: 1
- name: my-new-cron-object
- namespace: default
- resourceVersion: "1326"
- uid: 9aab1d66-628e-41bb-a422-57b8b3b1f5a9
- spec:
- cronSpec: '* * * * */5'
- image: my-awesome-cron-image
- kind: List
- metadata:
- resourceVersion: ""
- selfLink: ""
当你删除某 CustomResourceDefinition 时,服务器会卸载其 RESTful API 端点,并删除服务器上存储的所有定制对象。
- 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)
如果你在以后创建相同的 CustomResourceDefinition 时,该 CRD 会是一个空的结构。