共计 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命令查看集群中已定义的资源:
[root@node k8s]# 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
接着即可看到该对象:
[root@node k8s]# kubectl get crontab
NAME AGE
new-crontab 28s
CRD 用来自定义资源,是扩展 k8s 最常用的方式。
只创建 CRD 并没有实际意义,想要 CRD 工作还需创建控制器,监听资源变动并做出相应动作。