Kubernetes v1.7新特性解析-CustomResourceDefinition

CustomResourceDefinition(CRD)是v1.7+新增的無需改變代碼就可以擴展Kubernetes API的機制,用來管理自定義對象。它實際上是ThirdPartyResources(TPR)的升級版本,TPR將在v1.8中刪除。

CRD示例

下面的例子會創建一個/apis/http://stable.example.com/v1/namespaces/<namespace>/crontabs/...的API

apiVersion: apiextensions.k8s.io/v1beta1nkind: CustomResourceDefinitionnmetadata:n # name must match the spec fields below, and be in the form: <plural>.<group>n name: crontabs.stable.example.comnspec:n # group name to use for REST API: /apis/<group>/<version>n group: stable.example.comn # version name to use for REST API: /apis/<group>/<version>n version: v1n # either Namespaced or Clustern scope: Namespacedn names:n # plural name to be used in the URL: /apis/<group>/<version>/<plural>n plural: crontabsn # singular name to be used as an alias on the CLI and for displayn singular: crontabn # kind is normally the CamelCased singular type. Your resource manifests use this.n kind: CronTabn # shortNames allow shorter string to match your resource on the CLIn shortNames:n - ctn

API創建好後,就可以創建具體的CronTab對象了

$ cat my-cronjob.yamlnapiVersion: "stable.example.com/v1"nkind: CronTabnmetadata:n name: my-new-cron-objectnspec:n cronSpec: "* * * * /5"n image: my-awesome-cron-imagenn$ kubectl create -f my-crontab.yamlncrontab "my-new-cron-object" creatednn$ kubectl get crontabnNAME KINDnmy-new-cron-object CronTab.v1.stable.example.comn$ kubectl get crontab my-new-cron-object -o yamlnapiVersion: stable.example.com/v1nkind: CronTabnmetadata:n creationTimestamp: 2017-07-03T19:00:56Zn name: my-new-cron-objectn namespace: defaultn resourceVersion: "20630"n selfLink: /apis/stable.example.com/v1/namespaces/default/crontabs/my-new-cron-objectn uid: 5c82083e-5fbd-11e7-a204-42010a8c0002nspec:n cronSpec: * * * * /5n image: my-awesome-cron-imagen

Finalizer

Finalizer用於實現控制器的非同步預刪除鉤子,可以通過metadata.finalizers來指定Finalizer。

apiVersion: "stable.example.com/v1"nkind: CronTabnmetadata:n finalizers:n - finalizer.stable.example.comnspec:n group: stable.example.comn version: v1n scope: Namespacedn names:n plural: crontabsn singular: crontabn kind: CronTabn shortNames:n - ctn

Finalizer指定後,客戶端刪除對象的操作只會設置metadata.deletionTimestamp而不是直接刪除。這會觸發正在監聽CRD的控制器,控制器執行一些刪除前的清理操作,從列表中刪除自己的finalizer,然後再重新發起一個刪除操作。此時,被刪除的對象才會真正刪除。

從ThirdPartyResources遷移

1. 首先將TPR資源重定義為CRD資源,比如下面這個ThirdPartyResource資源

apiVersion: extensions/v1beta1nkind: ThirdPartyResourcenmetadata:n name: cron-tab.stable.example.comndescription: "A specification of a Pod to run on a cron style schedule"nversions:n- name: v1n

需要重新定義為

apiVersion: apiextensions.k8s.io/v1beta1nkind: CustomResourceDefinitionnmetadata:n name: crontabs.stable.example.comnspec:n scope: Namespacedn group: stable.example.comn version: v1n names:n kind: CronTabn plural: crontabsn singular: crontabn

2. 創建CustomResourceDefinition定義後,等待CRD的Established條件:

$ kubectl get crd -o custom-columns=NAME:{.metadata.name},ESTABLISHED:{.status.conditions[?(@.type=="Established")].status}nNAME ESTABLISHEDncrontabs.stable.example.com Truen

3. 停止使用TPR的客戶端和TPR Controller,啟動新的CRD Controller。

4. 備份數據

$ kubectl get crontabs --all-namespaces -o yaml > crontabs.yamln$ kubectl get thirdpartyresource cron-tab.stable.example.com -o yaml --export > tpr.yamln

5. 刪除TPR定義,TPR資源會自動複製為CRD資源

$ kubectl delete thirdpartyresource cron-tab.stable.example.comn

6. 驗證CRD數據是否以前成功,如果有失敗發生,可以從備份的TPR數據恢復

$ kubectl create -f tpr.yamln

7. 重啟客戶端和相關的控制器或監聽程序,它們的數據源會自動切換到CRD(即訪問TPR的API會自動轉換為對CRD的訪問)。

本文已發布到《Kubernetes指南》開源書,歡迎關注。

推薦閱讀:

如何使用 Spinnaker 和 Kubernetes 進行資料庫變更發布?
Kubernetes Handbook v1.0發布附pdf下載地址- jimmysong.io
kubernetes的網路實現

TAG:Kubernetes | Docker | 容器 |