共计 2573 个字符,预计需要花费 7 分钟才能阅读完成。
导读 | CRD 的全称为 CustomResourceDefinitions,即自定义资源。k8s 拥有一些内置的资源,比如说 Pod,Deployment,ReplicaSet 等等,而 CRD 则提供了一种方式,使用户可以自定义新的资源,以扩展 k8s 的功能。 |
CRD 的全称为 CustomResourceDefinitions,即自定义资源。k8s 拥有一些内置的资源,比如说 Pod,Deployment,ReplicaSet 等等,而 CRD 则提供了一种方式,使用户可以自定义新的资源,以扩展 k8s 的功能。使用 CRD 可以在不修改 k8s 源代码的基础上方便的扩展 k8s 的功能,比如腾讯云 TKE 使用 CRD:logcollectors.ccs.cloud.tencent.com以添加日志收集服务,而 Istio 也大量使用到了 CRD。值得一提的是,另一种扩展 k8s 的方式是 apiservice,通过 API:metrics.k8s.io 自定义 HPA 是其最典型的应用。可以使用kubectl api-resources命令查看集群中已定义的资源:
[ | ]|
NAME SHORTNAMES APIGROUP NAMESPACED KIND | |
configmaps cm true ConfigMap | |
endpoints ep true Endpoints | |
events ev true Event | |
namespaces ns false Namespace | |
persistentvolumes pv false PersistentVolume | |
pods po true Pod | |
podtemplates true PodTemplate | |
storageclasses sc storage.k8s.io false StorageClass | |
... |
从如上输出中可以略窥一二,CRD 至少包括如下属性:
-
NAME:CRD 的复数名称
SHORTNAMES:cli 中使用的资源简称
APIGROUP:API 所使用的组名称
NAMESPACED:是否具有 namespace 属性
KIND:资源文件需要,用以识别资源
另外,CRD 提供了定义资源的方式,不过想要让其具有实际意义还需控制器的配合。k8s 的kube-controller-manager组件提供了多种内置控制器,比如说:cronjob,daemonset,deployment,namespace等等,它们监听资源的创建 / 更新 / 删除,且做出相应的动作。而对于 CRD 来说,也可以编写相应的控制器来完成对应的功能。
在 k8s 中 CRD 本身也是资源,大于 1.7.0 版本的集群可以使用apiextensions.k8s.io/v1beta1API访问 CRD,大于 1.16.0 版本则可以使用apiextensions.k8s.io/v1API。
CRD 资源文件示例:
# crd-test.yml | |
apiVersion: apiextensions.k8s.io/v1beta1 | |
kind: CustomResourceDefinition | |
metadata: | |
# 名称必须符合如下格式:. | |
name: crontabs.staight.k8s.io | |
spec: | |
# 组名,表示使用该 API: /apis// | |
group: staight.k8s.io | |
# version 列表,表示该 CRD 支持的版本 | |
versions: | |
- name: v1 | |
# 开启 / 关闭该 API | |
served: true | |
# 有且只能有一个版本要将 storage 设置为 true | |
storage: true | |
# Namespaced/Cluster,表示该 CRD 是命令空间属性还是集群属性 | |
scope: Namespaced | |
names: | |
# API 中使用的名称:/apis/// | |
plural: crontabs | |
# 单数名称,cli 中使用 | |
singular: crontab | |
# 往往是首字母大写的单数名称,资源文件中需要用到 | |
kind: CronTab | |
# cli 中的简称 | |
shortNames: | |
- ct | |
# 阻止无法识别的字段,集群版本 1.15 以上才可使用 | |
preserveUnknownFields: false | |
# 创建资源文件时需验证的字段 | |
validation: | |
openAPIV3Schema: | |
type: object | |
properties: | |
spec: | |
type: object | |
properties: | |
cronSpec: | |
type: string | |
image: | |
type: string | |
replicas: | |
type: integer |
然后创建该 CRD:
[root@node k8s]# kubectl create -f crd-test.yml | |
customresourcedefinition.apiextensions.k8s.io/crontabs.staight.k8s.io created |
接着就能查到该 CRD:
[root@node k8s]# kubectl get crd crontabs.staight.k8s.io | |
NAME CREATED AT | |
crontabs.staight.k8s.io 2019-10-08T10:21:09Z |
CRD 创建完成。可以通过 URL:https://169.254.128.15:60002/apis/staight.k8s.io/v1/namespaces/default/crontabs 访问到 crontab 资源。
在创建 CRD 之后,即可创建其资源的对象了。资源文件示例:
# crontab.yml | |
apiVersion: "staight.k8s.io/v1" | |
kind: CronTab | |
metadata: | |
name: new-crontab | |
spec: | |
cronSpec: "* * * * *" | |
image: new-image |
接着即可看到该对象:
[ | ]|
NAME AGE | |
new-crontab 28s |
CRD 用来自定义资源,是扩展 k8s 最常用的方式。
只创建 CRD 并没有实际意义,想要 CRD 工作还需创建控制器,监听资源变动并做出相应动作。
