Kubernetes CRD(Custom Resource Definition)
    k8s中默认的有几类资源,Deploment、StatefulSet、Service、CronJob等等。k8s为了让用户拥有完全的定制化需求,它允许用户制造一个自己想要的资源类型。这一概念就是CRD(Custom Resource Definition)。我们不需要修改原有的API源码就能实现,该功能大大地提高了k8s的可扩展能力。
    
    当一个新的自定义CRD创建时,k8s api服务器将为你指定的每一个版本创建一个新的Restful资源路径,我们可以根据该api路径来创建一些我们自定义的类型资源。CRD可以是集群级别的,也可以是namespace级别的。

     以下是一个新的资源定义yaml。

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  # name must match the spec fields below, and be in the form: <plural>.<group>
  name: crontabs.stable.example.com
spec:
  # group name to use for REST API: /apis/<group>/<version>
  group: stable.example.com
  # list of versions supported by this CustomResourceDefinition
  versions:
    - name: v1
      # Each version can be enabled/disabled by Served flag.
      served: true
      # One and only one version must be marked as the storage version.
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                cronSpec:
                  type: string
                image:
                  type: string
                replicas:
                  type: integer
  # either Namespaced or Cluster
  scope: Namespaced
  names:
    # plural name to be used in the URL: /apis/<group>/<version>/<plural>
    plural: crontabs
    # singular name to be used as an alias on the CLI and for display
    singular: crontab
    # kind is normally the CamelCased singular type. Your resource manifests use this.
    kind: CronTab
    # shortNames allow shorter string to match your resource on the CLI
    shortNames:
    - ct

    上面是定义了一个CronTab类型的资源,scope: Namespaced代表是命名空间级别的。

     在k8s中生成这种新资源的声明:

kubectl apply -f resourcedefinition.yaml

    创建 一个CronTab资源:

apiVersion: "stable.example.com/v1"
kind: CronTab
metadata:
  name: my-new-cron-object
spec:
  cronSpec: "* * * * */5"
  image: my-awesome-cron-image

参考文档:  Extend the Kubernetes API with CustomResourceDefinitions | Kubernetes

CRD让某个属性兼容所有自定义结构体struct

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  # 名字必需与下面的 spec 字段匹配,并且格式为 '<名称的复数形式>.<组名>'
  name: crontabs.stable.example.com
scope: Cluster
names:
  # 名称的复数形式,用于 URL:/apis/<组>/<版本>/<名称的复数形式>
  plural: crontabs
  # 名称的单数形式,作为命令行使用时和显示时的别名
  singular: crontab
spec:
  # 组名称,用于 REST API: /apis/<组>/<版本>
  group: stable.example.com
  # 列举此 CustomResourceDefinition 所支持的版本
  versions:
    -name: v1
    schema:
      openAPlV3Schema:
        properties:
          apiVersion:
            type: string
          kind:
            type: string
          metadata:
            type: object
          spec:
            type: object
            x-kubernetes-preserve-unknown-fields: true
          type: object
        served: true
        storage: true
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐