美文网首页Kubernetes
Kubernetes自定义资源(CRD)

Kubernetes自定义资源(CRD)

作者: 王勇1024 | 来源:发表于2020-09-24 09:26 被阅读0次

    Kubernetes系统拥有强大的高扩展功能,其中自定义资源(Custom Resource)就是一种常见的扩展方式,即可将自己定义的资源添加到Kubernetes系统中。Kubernetes系统附带了许多内置资源,但是仍有些需求需要使用自定义资源来扩展Kubernetes的功能。

    在Kubernetes系统早期,是通过ThirdPartyResource(TPR)来实现扩展自定义资源的,但自Kubernetes 1.7版本后,ThirdPartyResource功能已被弃用,并且其已根据Beta功能的弃用政策在Kubernetes 1.8中被删除,取而代之的是CustomResourceDefinitions(自定义资源定义,简称CRD)

    开发者通过CRD可以实现自定义资源,它允许用户将自己定义的资源添加到Kubernetes系统中,并像使用Kubernetes内置资源一样使用这些资源,例如,在YAML/JSON文件中带有Spec的资源定义都是对Kubernetes中的资源对象的定义,所有的自定义资源都可以与Kubernetes系统中的内置资源一样使用kubectl或client-go进行操作。

    创建 CustomResourceDefinition

    当你创建新的 CustomResourceDefinition(CRD)时,Kubernetes API 服务器会为你所指定的每一个版本生成一个 RESTful 的资源路径。CRD 可以是命名空间作用域的,也可以是集群作用域的,取决于 CRD 的 scope 字段设置。和其他现有的内置对象一样,删除 一个命名空间时,该名字空间下的所有 CRD 对象也会被删除。CustomResourceDefinition 本身是不受命名空间限制的,对所有命名空间可用。

    例如,如果你将下面的 CustomResourceDefinition 保存到 resourcedefinition.yaml 文件:

    apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:
      # 名字必需与下面的 spec 字段匹配,并且格式为 '<名称的复数形式>.<组名>'
      name: crontabs.stable.example.com
    spec:
      # 组名称,用于 REST API: /apis/<组>/<版本>
      group: stable.example.com
      # 列举此 CustomResourceDefinition 所支持的版本
      versions:
        - name: v1
          # 每个版本都可以通过 served 标志来独立启用或禁止
          served: true
          # 其中一个且只有一个版本必需被标记为存储版本
          storage: true
          schema:
            openAPIV3Schema:
              type: object
              properties:
                spec:
                  type: object
                  properties:
                    cronSpec:
                      type: string
                    image:
                      type: string
                    replicas:
                      type: integer
      # 可以是 Namespaced 或 Cluster
      scope: Namespaced
      names:
        # 名称的复数形式,用于 URL:/apis/<组>/<版本>/<名称的复数形式>
        plural: crontabs
        # 名称的单数形式,作为命令行使用时和显示时的别名
        singular: crontab
        # kind 通常是单数形式的驼峰编码(CamelCased)形式。你的资源清单会使用这一形式。
        kind: CronTab
        # shortNames 允许你在命令行使用较短的字符串来匹配资源
        shortNames:
        - ct
    

    之后创建它:

    kubectl apply -f resourcedefinition.yaml
    

    这样一个新的受名字空间约束的 RESTful API 端点会被创建在:

    /apis/stable.example.com/v1/namespaces/*/crontabs/...
    

    此端点 URL 自此可以用来创建和管理定制对象。对象的 kind 将是来自你上面创建时 所用的 spec 中指定的 CronTab。

    创建端点的操作可能需要几秒钟。你可以监测你的 CustomResourceDefinition 的 Established 状况变为 true,或者监测 API 服务器的发现信息等待你的资源出现在那里。

    创建定制对象

    在创建了 CustomResourceDefinition 对象之后,你可以创建定制对象(Custom Objects)。定制对象可以包含定制字段。这些字段可以包含任意的 JSON 数据。 在下面的例子中,在类别为 CrontTab 的定制对象中,设置了cronSpecimage 定制字段。类别 CronTab 来自你在上面所创建的 CRD 的规约。

    如果你将下面的 YAML 保存到 my-crontab.yaml

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

    并执行创建命令:

    kubectl apply -f my-crontab.yaml
    

    你就可以使用 kubectl 来管理你的 CronTab 对象了。例如:

    kubectl get crontab
    

    应该会输出如下列表:

    NAME                 AGE
    my-new-cron-object   6s
    

    使用 kubectl 时,资源名称是大小写不敏感的,而且你既可以使用 CRD 中所定义的单数 形式或复数形式,也可以使用其短名称:

    kubectl get ct -o yaml
    

    你可以看到输出中包含了你创建定制对象时在 YAML 文件中指定的定制字段 cronSpec 和 image:

    apiVersion: v1
    kind: List
    items:
    - apiVersion: stable.example.com/v1
      kind: CronTab
      metadata:
        creationTimestamp: 2017-05-31T12:56:35Z
        generation: 1
        name: my-new-cron-object
        namespace: default
        resourceVersion: "285"
        uid: 9423255b-4600-11e7-af6a-28d2447dc82b
      spec:
        cronSpec: '* * * * */5'
        image: my-awesome-cron-image
    metadata:
      resourceVersion: ""
    

    删除 CustomResourceDefinition

    当你删除某 CustomResourceDefinition 时,服务器会卸载其 RESTful API 端点,并删除服务器上存储的所有定制对象。

    kubectl delete -f resourcedefinition.yaml
    kubectl get crontabs
    
    Error from server (NotFound): Unable to list {"stable.example.com" "v1" "crontabs"}: the server could not find the requested resource (get crontabs.stable.example.com)
    
    

    如果你在以后创建相同的 CustomResourceDefinition 时,该 CRD 会一个空的结构。

    参考文档

    使用 CustomResourceDefinition 扩展 Kubernetes API
    Kubernetes CRD 系列:CRD 介绍

    相关文章

      网友评论

        本文标题:Kubernetes自定义资源(CRD)

        本文链接:https://www.haomeiwen.com/subject/pwloyktx.html