k8s 自定义资源CRD——筑梦之路

CRD是什么?

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命令查看集群中已定义的资源。

CRD至少包括如下属性:

  • NAME:CRD的复数名称

  • SHORTNAMES:cli中使用的资源简称

  • APIGROUP:API所使用的组名称

  • NAMESPACED:是否具有namespace属性

  • KIND:资源文件需要,用以识别资源

另外,CRD提供了定义资源的方式,不过想要让其具有实际意义还需控制器的配合。k8s的kube-controller-manager组件提供了多种内置控制器,比如说:cronjobdaemonsetdeploymentnamespace等等,它们监听资源的创建/更新/删除,且做出相应的动作。而对于CRD来说,也可以编写相应的控制器来完成对应的功能。

使用CRD

在k8s中CRD本身也是资源,大于1.7.0版本的集群可以使用apiextensions.k8s.io/v1beta1API访问CRD,大于1.16.0版本则可以使用apiextensions.k8s.io/v1API

创建CRD

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
kubectl create -f crd-test.yml 

kubectl get crd crontabs.staight.k8s.io

CRD创建完成。可以通过URL:https://192.168.100.100: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

注意spec中的字段应符合CRD的要求,创建它:

kubectl create -f crontab.yml

kubectl get crontab



  • CRD用来自定义资源,是扩展k8s最常用的方式。

  • 只创建CRD并没有实际意义,想要CRD工作还需创建控制器,监听资源变动并做出相应动作

你可能感兴趣的:(云计算,虚拟化,linux系统运维,kubernetes,docker,容器)