初步體驗 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:         大家好,今年園子正在加快建設的步伐,我們將全面提升產品的用戶體驗,我們將做一些有趣的產品功能,我們將以雲為中心探索商業化道路。。。我們將挖掘出技術社區發展的康庄大道。
  Publishdate:  2021-03-02 16:28
  Title:        助園一臂之力:發布博客園贊助者計划
  URL:          https://www.cnblogs.com/cmt/p/14469606.html
Events:         <none>

體驗完畢。

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM