初步体验 Kubernetes 的 Custom Resource Definition

CRD(Custom Resource Definition) 是 kubernetes 强大扩展能力的一处体现,联系到编程场景,CRD 相当于是类(class),custom resource 相当于是对象或者实例,通过 CRD 可以创建自己定义的资源类型,api server 会直接支持,可以通过 kubectl 命令创建对应的资源并对资源进行删/查/改的操作,资源对象会被保存在 etcd 中,可以像操作 pod 那样操作自己创建的 resouce。

这篇随笔以发布博文场景为例体验一下 kubernetes 的 CRD,对应的 custom resource 就是 BlogPost。

首先,编写 BlogPost 的 CRD 清单文件 blogpost-crd.yaml,给 BlogPost 定义了3个属性:title, pushishdate, body,从编程角度就是创建了一个 BlogPost 类

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: blogposts.kube.cnblogs.com
spec:
  group: kube.cnblogs.com
  scope: Namespaced
  names:
    kind: BlogPost
    singular: blogpost
    plural: blogposts
    listKind: BlogPostList
  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:
              title:
                type: string
              url:
                type: string
              publishdate:
                 type: string
              body:
                type: string

编写清单注意事项:

  • metadata.namespec.names.plural + “.” + spec. group 的组合,如果写 blogposts.kube.cnblogs.com,会包下面的错误 metadata.name: Invalid value: "blogpost.kube.cnblogs.com": must be spec.names.plural+"."+spec.group
  • scope 有2种,一种是 Cluster,一种是 Namespaced,比如 node 资源的 scope 是 Cluster,pod 资源的 scope 是 Namespaced,Cluster 资源的 url 路径是 /clusters/{cluster}/{plural},Namespaced 资源的 url 路径是 /clusters/{cluster}/namespaces/{namespace}/{plural}
  • 属性不支持日期类型,只支持 “array”, “boolean”, “integer”, “number”, “object”, “string” 五种类型。

然后,基于清单文件创建 CRD

$ kubectl create -f blogpost-crd.yaml
customresourcedefinition.apiextensions.k8s.io/blogposts.kube.cnblogs.com created

查看已创建的 CRD

kubectl get crd | grep blogposts
blogposts.kube.cnblogs.com                    2021-03-08T08:28:17Z

接下来基于创建好的 CRD 创建 BlogPost 资源,从编程角度就是 new 一个 BlogPost 对象,从需求角度就是发布一篇博文。

编写清单文件 blogpost-1.yaml

apiVersion: kube.cnblogs.com/v1
kind: BlogPost
metadata:
  name: blogpost-1
spec:
  title: "助园一臂之力:发布博客园赞助者计划"
  url: "https://www.cnblogs.com/cmt/p/14469606.html"
  publishdate: "2021-03-02 16:28"
  body: "大家好,今年园子正在加快建设的步伐,我们将全面提升产品的用户体验,我们将做一些有趣的产品功能,我们将以云为中心探索商业化道路。。。我们将挖掘出技术社区发展的康庄大道。"

创建资源

$ kubectl create -f blogpost-1.yaml
blogpost.kube.cnblogs.com/blogpost-1 created

创建成功之后就可以用 kubectl 命令操作 blogposts 资源

列出资源

$ kubectl get blogposts
NAME         AGE
blogpost-1   94s

查看资源

kubectl describe blogposts  blogpost-1

输出如下

kubectl describe blogposts blogpost-1
Name:         blogpost-1
Namespace:    production
Labels:       <none>
Annotations:  <none>
API Version:  kube.cnblogs.com/v1
Kind:         BlogPost
Metadata:
  Creation Timestamp:  2021-03-08T09:09:51Z
  Generation:          2
  Managed Fields:
    API Version:  kube.cnblogs.com/v1
    Fields Type:  FieldsV1
    fieldsV1:
      f:spec:
        .:
        f:body:
        f:publishdate:
        f:title:
    Manager:      kubectl-create
    Operation:    Update
    Time:         2021-03-08T09:09:51Z
    API Version:  kube.cnblogs.com/v1
    Fields Type:  FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .:
          f:kubectl.kubernetes.io/last-applied-configuration:
      f:spec:
        f:url:
    Manager:         kubectl-client-side-apply
    Operation:       Update
    Time:            2021-03-08T09:16:31Z
  Resource Version:  151288200
  UID:               75930e48-0c1a-4450-b9ef-e010201b154a
Spec:
  Body:         &#x5927;&#x5BB6;&#x597D;&#xFF0C;&#x4ECA;&#x5E74;&#x56ED;&#x5B50;&#x6B63;&#x5728;&#x52A0;&#x5FEB;&#x5EFA;&#x8BBE;&#x7684;&#x6B65;&#x4F10;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;&#x5168;&#x9762;&#x63D0;&#x5347;&#x4EA7;&#x54C1;&#x7684;&#x7528;&#x6237;&#x4F53;&#x9A8C;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;&#x505A;&#x4E00;&#x4E9B;&#x6709;&#x8DA3;&#x7684;&#x4EA7;&#x54C1;&#x529F;&#x80FD;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;&#x4EE5;&#x4E91;&#x4E3A;&#x4E2D;&#x5FC3;&#x63A2;&#x7D22;&#x5546;&#x4E1A;&#x5316;&#x9053;&#x8DEF;&#x3002;&#x3002;&#x3002;&#x6211;&#x4EEC;&#x5C06;&#x6316;&#x6398;&#x51FA;&#x6280;&#x672F;&#x793E;&#x533A;&#x53D1;&#x5C55;&#x7684;&#x5EB7;&#x5E84;&#x5927;&#x9053;&#x3002;
  Publishdate:  2021-03-02 16:28
  Title:        &#x52A9;&#x56ED;&#x4E00;&#x81C2;&#x4E4B;&#x529B;&#xFF1A;&#x53D1;&#x5E03;&#x535A;&#x5BA2;&#x56ED;&#x8D5E;&#x52A9;&#x8005;&#x8BA1;&#x5212;
  URL:          https://www.cnblogs.com/cmt/p/14469606.html
Events:         <none>
</none></none></none>

体验完毕。

Original: https://www.cnblogs.com/dudu/p/14494823.html
Author: dudu
Title: 初步体验 Kubernetes 的 Custom Resource Definition

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/547403/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球