如何用 Kubernetes 自定義資源?

Linksla發表於2022-09-06

什麼是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 命令檢視叢集中已定義的資源:

[root@node k8s]# kubectl api-resources NAME                              SHORTNAMES   APIGROUP                       NAMESPACED   KINDconfigmaps                        cm                                          true         ConfigMapendpoints                         ep                                          true         Endpointsevents                            ev                                          true         Eventnamespaces                        ns                                          false        Namespacepersistentvolumes                 pv                                          false        PersistentVolumepods                              po                                          true         Podpodtemplates                                                                  true         PodTemplatestorageclasses                    sc           storage.k8s.io                 false        StorageClass...

從如上輸出中可以略窺一二,CRD至少包括如下屬性:

  • NAME:CRD的複數名稱
  • SHORTNAMES:cli中使用的資源簡稱
  • APIGROUP:API所使用的組名稱
  • NAMESPACED:是否具有namespace屬性
  • KIND:資原始檔需要,用以識別資源

另外,CRD提供了定義資源的方式,不過想要讓其具有實際意義還需控制器的配合。k8s的 kube-controller-manager 元件提供了多種內建控制器,比如說: cronjob daemonset deployment namespace 等等,它們監聽資源的建立/更新/刪除,且做出相應的動作。而對於CRD來說,也可以編寫相應的控制器來完成對應的功能。

CRD使用

在k8s中CRD本身也是資源,大於1.7.0版本的叢集可以使用 apiextensions.k8s.io/v1beta1API 訪問CRD,大於1.16.0版本則可以使用 apiextensions.k8s.io/v1API

建立CRD

CRD資原始檔示例:

# crd-test.ymlapiVersion: apiextensions.k8s.io/v1beta1kind: CustomResourceDefinitionmetadata:  # 名稱必須符合如下格式:<plural>.<group>  name: crontabs.staight.k8s.iospec:  # 組名,表示使用該API: /apis/<group>/<version>  group: staight.k8s.io  # version列表,表示該CRD支援的版本  versions:    - name: v1      # 開啟/關閉該API      served: true      # 有且只能有一個版本要將storage設定為true      storage: true  # Namespaced/Cluster,表示該CRD是命令空間屬性還是叢集屬性  scope: Namespaced  names:    # API中使用的名稱:/apis/<group>/<version>/<plural>    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

然後建立該CRD:

[root@node k8s]# kubectl create -f crd-test.yml customresourcedefinition.apiextensions.k8s.io/crontabs.staight.k8s.io created

接著就能查到該CRD:

[root@node k8s]# kubectl get crd crontabs.staight.k8s.ioNAME                      CREATED ATcrontabs.staight.k8s.io   2019-10-08T10:21:09Z

CRD建立完成。可以透過URL: 訪問到crontab資源。

建立自定義物件

在建立CRD之後,即可建立其資源的物件了。資原始檔示例:

# crontab.ymlapiVersion: "staight.k8s.io/v1"kind: CronTabmetadata:  name: new-crontabspec:  cronSpec: "* * * * *"  image: new-image

注意spec中的欄位應符合CRD的要求,建立它:

[root@node k8s]# kubectl create -f crontab.yml crontab.staight.k8s.io/new-crontab created

接著即可看到該物件:

[root@node k8s]# kubectl get crontabNAME          AGEnew-crontab   28s

小結

  • CRD用來自定義資源,是擴充套件k8s最常用的方式。

  • 只建立CRD並沒有實際意義,想要CRD工作還需建立控制器,監聽資源變動並做出相應動作。

來源:%E7%AE%80%E4%BB%8B/


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70013542/viewspace-2913555/,如需轉載,請註明出處,否則將追究法律責任。

相關文章