文章目录
1. CRD 简介
Custom resources:是对K8S API的扩展,代表了一个特定的kubetnetes的定制化安装。在一个运行中的集群中,自定义资源可以动态注册到集群中。注册完毕以后,用户可以通过kubelet创建和访问这个自定义的对象,类似于操作pod一样。
Custom controllers:Custom resources可以让用户简单的存储和获取结构化数据。只有结合控制器才能变成一个真正的declarative API(被声明过的API)。控制器可以把资源更新成用户想要的状态,并且通过一系列操作维护和变更状态。定制化控制器是用户可以在运行中的集群内部署和更新的一个控制器,它独立于集群本身的生命周期。
定制化控制器可以和任何一种资源一起工作,当和定制化资源结合使用时尤其有效。
Operator模式 是一个customer controllers和Custom resources结合的例子。它可以允许开发者将特殊应用编码至kubernetes的扩展API内。
2. 使用场景
其实crd在很多k8s周边开源项目中有使用,比如ingress-controller 、istio 、hpa和众多的operator。
如何添加一个Custom resources到我的kubernetes集群呢? kubernetes提供了两种方式将Custom resources添加到集群。
- Custom Resource Definitions (CRDs):更易用、不需要编码。但是缺乏灵活性。
- API Aggregation:需要编码,允许通过聚合层的方式提供更加定制化的实现。
本文重点讲解Custom Resource Definitions (CRD)的使用方法。
3. 操作环境
基于 rancher 2.2 构建的 v1.11 kubernetes 集群
4. 自定义资源
这里假设大家对k8s 相关的基础资源已经了解;
创建自定义资源,即自定义 restful api
准备 crontab_crd.yml
apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: # 称必须与下面的spec字段匹配,格式为: <plural>.<group> name: crontabs.crd.test.com spec: # 用于REST API的组名称: /apis/<group>/<version> group: crd.test.com versions: - name: v1 # 每个版本都可以通过服务标志启用/禁用。 served: true # 必须将一个且只有一个版本标记为存储版本。 storage: true scope: Namespaced # 指定crd资源作用范围在命名空间或集群 names: # URL中使用的复数名称: /apis/<group>/<version>/<plural> plural: crontabs # 在CLI(shell界面输入的参数)上用作别名并用于显示的单数名称 singular: crontab kind: CronTab # 短名称允许短字符串匹配CLI上的资源,意识就是能通过kubectl 在查看资源的时候使用该资源的简名称来获取。 shortNames: - ct
创建crd:
- kubectl 创建: kubectl apply -f crontab_crd.yml
- rancher ui 操作: 导入yml即可
查看crd
kubectl get crd | grep crontab
查看api
准备 test_crontab.yml
apiVersion: crd.test.com/v1 kind: CronTab metadata: name: my-test-crontab spec: cronSpec: "* * * * */10" image: my-test-image replicas: 2
创建
- kubectl : kubectl apply -f test_crontab.yml
- rancher ui 操作:
查看 ct
kubectl get ct
删除自定义对象:
kubectl delete ct my-test-crontab
删除crd:
kubectl delete crd crontabs.crd.test.com
5. 自定义资源-validations
validation这个验证是为了在创建好自定义资源后,通过该资源创建对象的时候,对象的字段中存在无效值,则创建该对象的请求将被拒绝,否则会被创建。我们可以在crd文件中添加“validation:”字段来添加相应的验证机制。
准备 crontab_crd_validation.yml
主要改动为validation部分
apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: # 称必须与下面的spec字段匹配,格式为: <plural>.<group> name: crontabs.crd.test.com spec: # 用于REST API的组名称: /apis/<group>/<version> group: crd.test.com versions: - name: v1 # 每个版本都可以通过服务标志启用/禁用。 served: true # 必须将一个且只有一个版本标记为存储版本。 storage: true scope: Namespaced # 指定crd资源作用范围在命名空间或集群 names: # URL中使用的复数名称: /apis/<group>/<version>/<plural> plural: crontabs # 在CLI(shell界面输入的参数)上用作别名并用于显示的单数名称 singular: crontab kind: CronTab # 短名称允许短字符串匹配CLI上的资源,意识就是能通过kubectl 在查看资源的时候使用该资源的简名称来获取。 shortNames: - ct validation: openAPIV3Schema: properties: spec: properties: cronSpec: #必须是字符串、符合正则规则 type: string pattern: '^(d+|*)(/d+)?(s+(d+|*)(/d+)?){4}$' replicas: #设置副本数的限制 type: integer minimum: 1 maximum: 10
创建不符合的对象:
apiVersion: crd.test.com/v1 kind: CronTab metadata: name: my-test-crontab spec: cronSpec: "* * * * */10" image: my-test-image replicas: 15
上面的replicas为15 所以创建报错限制的最大值为10;
6. 自定义资源-additionalPrinterColumns
从Kubernetes 1.11开始,kubectl使用服务器端打印。服务器决定由kubectl get命令显示哪些列即在我们获取一个内置资源的时候会显示出一些列表信息(比如:kubectl get nodes)。这里我们可以使用CustomResourceDefinition自定义这些列,当我们在查看自定义资源信息的时候显示出我们需要的列表信息。通过在crd文件中添加“additionalPrinterColumns:”字段,在该字段下声明需要打印列的的信息
准备crontab_crd_additionalPrinterColumns.yml
apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: # 称必须与下面的spec字段匹配,格式为: <plural>.<group> name: crontabs.crd.test.com spec: # 用于REST API的组名称: /apis/<group>/<version> group: crd.test.com versions: - name: v1 # 每个版本都可以通过服务标志启用/禁用。 served: true # 必须将一个且只有一个版本标记为存储版本。 storage: true scope: Namespaced # 指定crd资源作用范围在命名空间或集群 names: # URL中使用的复数名称: /apis/<group>/<version>/<plural> plural: crontabs # 在CLI(shell界面输入的参数)上用作别名并用于显示的单数名称 singular: crontab kind: CronTab # 短名称允许短字符串匹配CLI上的资源,意识就是能通过kubectl 在查看资源的时候使用该资源的简名称来获取。 shortNames: - ct validation: openAPIV3Schema: properties: spec: properties: cronSpec: #必须是字符串、符合正则规则 type: string pattern: '^(d+|*)(/d+)?(s+(d+|*)(/d+)?){4}$' replicas: #设置副本数的限制 type: integer minimum: 1 maximum: 10 additionalPrinterColumns: - name: Replicas type: integer JSONPath: .spec.replicas - name: Age type: date JSONPath: .metadata.creationTimestamp
准备test_crontab.yml
apiVersion: crd.test.com/v1 kind: CronTab metadata: name: my-test-crontab spec: cronSpec: "* * * * */10" image: my-test-image replicas: 2
7. 自定义资源-subresources
一般我们要是没有在自定义资源当中配置关于资源对象的伸缩和状态信息的一些相关配置的话,那么在当我们通过该自定义资源创建对象后,又想通过“kubectl scale”来弹性的扩展该对象的容器的时候就会无能为力。而CRD可以允许我们添加该方面的相关配置声明,从而达到我们可以对自定义资源对象的伸缩处理。添加“ subresources:”字段来声明状态和伸缩信息。
准备crontab_crd_subresources.yml
apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: # 称必须与下面的spec字段匹配,格式为: <plural>.<group> name: crontabs.crd.test.com spec: # 用于REST API的组名称: /apis/<group>/<version> group: crd.test.com versions: - name: v1 # 每个版本都可以通过服务标志启用/禁用。 served: true # 必须将一个且只有一个版本标记为存储版本。 storage: true scope: Namespaced # 指定crd资源作用范围在命名空间或集群 names: # URL中使用的复数名称: /apis/<group>/<version>/<plural> plural: crontabs # 在CLI(shell界面输入的参数)上用作别名并用于显示的单数名称 singular: crontab kind: CronTab # 短名称允许短字符串匹配CLI上的资源,意识就是能通过kubectl 在查看资源的时候使用该资源的简名称来获取。 shortNames: - ct validation: openAPIV3Schema: properties: spec: properties: cronSpec: #必须是字符串、符合正则规则 type: string pattern: '^(d+|*)(/d+)?(s+(d+|*)(/d+)?){4}$' replicas: #设置副本数的限制 type: integer minimum: 1 maximum: 10 additionalPrinterColumns: - name: Replicas type: integer JSONPath: .spec.replicas - name: Age type: date JSONPath: .metadata.creationTimestamp subresources: scale: specReplicasPath: .spec.replicas statusReplicasPath: .status.replicas
准备test_crontab.yml
apiVersion: crd.test.com/v1 kind: CronTab metadata: name: my-test-crontab spec: cronSpec: "* * * * */10" image: my-test-image replicas: 2
测试:
kubectl scale --replicas=5 crontabs/my-test-crontab
总结:
crd 还是很重要的希望大家好好了解,一般的在扩展功能基本基于crd实现。