天天看點

k8s學習-自定義資源

參考官方文檔:​​​CustomResourceDefinition 擴充 Kubernetes API​​​ ​

建立 CustomResourceDefinition 

CustomResourceDefinition(CRD)時,Kubernetes API 伺服器會為你所 指定的每一個版本生成一個 RESTful 的 資源路徑。CRD 可以是名字空間作用域的,也可以 是叢集作用域的,取決于 CRD 的 ​

​scope​

​ 字段設定。和其他現有的内置對象一樣,删除 一個名字空間時,該名字空間下的所有定制對象也會被删除。CustomResourceDefinition 本身是不受名字空間限制的,對所有名字空間可用。

建立CRD,​​代碼​​

kubectl create -f crd.yaml
(venv) ➜  v1 git:(master) ✗ kubectl get crd
NAME                                   CREATED AT
crontabs.stable.example.com            2022-05-03T06:36:22Z
stars.cnstar.kubecto-kubernetes.info   2022-05-03T08:11:02Z      

建立定制對象

在建立了 CustomResourceDefinition 對象之後,你可以建立定制對象(Custom Objects)。定制對象可以包含定制字段。這些字段可以包含任意的 JSON 資料。 在下面的例子中,在類别為 ​

​CrontTab​

​​ 的定制對象中,設定了​

​cronSpec​

​​ 和 ​

​image​

​​ 定制字段。類别 ​

​CronTab​

​ 來自你在上面所建立的 CRD 的規約。

建立CR,​​代碼​​

kubectl create -f example.yaml
(venv) ➜  v1 git:(master) ✗ kubectl get star
NAME           SCHEDULE               COMMAND                        AGE   REPLICAS   PHASE
example-star   2022-05-03T16:13:00Z   echo Kubernetes native star!   38m   3          Running

//用簡寫檢視st
(venv) ➜  v1 git:(master) ✗ kubectl get st
NAME           SCHEDULE               COMMAND                        AGE   REPLICAS   PHASE
example-star   2022-05-03T16:13:00Z   echo Kubernetes native star!   39m   3          Running

//檢視資源和版本資訊
(venv) ➜  v1 git:(master) ✗ kubectl api-resources | grep star
stars                             st           cnstar.kubecto-kubernetes.info/v1      true         Star

(venv) ➜  v1 git:(master) ✗ kubectl get crontab
NAME                 AGE
my-new-cron-object   134m(venv) ➜  v1 git:(master) ✗ kubectl get ct
NAME                 AGE
my-new-cron-object   134m      

分類

分類(Categories)是定制資源所歸屬的分組資源清單(例如,​

​all​

​​)。 你可以使用 ​

​kubectl get <分類名稱>​

​ 來列舉屬于某分類的所有資源。

下面的示例在 CustomResourceDefinition 中将 ​

​all​

​​ 添加到分類清單中, 并展示了如何使用 ​

​kubectl get all​

​ 來輸出定制資源:

//categories 是定制資源所歸屬的分類資源清單
(venv) ➜  v1 git:(master) ✗ kubectl get all | grep star
star.cnstar.kubecto-kubernetes.info/example-star   2022-05-03T16:13:00Z   echo Kubernetes native star!   40m   3          Running      

設定結構化的模式

CustomResource 對象在定制字段中儲存結構化的資料,這些字段和内置的字段 ​

​apiVersion​

​​、​

​kind​

​​ 和 ​

​metadata​

​​ 等一起存儲,不過内置的字段都會被 API 伺服器隐式完成合法性檢查。有了 ​​OpenAPI v3.0 檢查​​ 能力之後,你可以設定一個模式(Schema),在建立和更新定制對象時,這一模式會被用來 對對象内容進行合法性檢查。參閱下文了解這類模式的細節和局限性。

在 ​

​apiextensions.k8s.io/v1​

​ 版本中,CustomResourceDefinition 的這一結構化模式 定義是必需的。 在 CustomResourceDefinition 的 beta 版本中,結構化模式定義是可選的。

  1. 為對象根(root)設定一個非空的 type 值(藉由 OpenAPI 中的​

    ​type​

    ​​),對每個 object 節點的每個字段(藉由 OpenAPI 中的​

    ​properties​

    ​​ 或​

    ​additionalProperties​

    ​​)以及 array 節點的每個條目(藉由 OpenAPI 中的​

    ​items​

    ​)也要設定非空的 type 值, 除非:
  • 節點包含屬性​

    ​x-kubernetes-int-or-string: true​

  • 節點包含屬性​

    ​x-kubernetes-preserve-unknown-fields: true​

  1. 對于 object 的每個字段或 array 中的每個條目,如果其定義中包含​

    ​allOf​

    ​​、​

    ​anyOf​

    ​​、​

    ​oneOf​

    ​​ 或​

    ​not​

    ​,則模式也要指定這些邏輯組合之外的字段或條目(試比較例 1 和例 2)。
  2. 在​

    ​allOf​

    ​​、​

    ​anyOf​

    ​​、​

    ​oneOf​

    ​​ 或​

    ​not​

    ​​ 上下文内不設定​

    ​description​

    ​​、​

    ​type​

    ​​、​

    ​default​

    ​​、​

    ​additionalProperties​

    ​​ 或者​

    ​nullable​

    ​​。此規則的例外是​

    ​x-kubernetes-int-or-string​

    ​ 的兩種模式(見下文)。
  3. 如果​

    ​metadata​

    ​ 被設定,

删除 CustomResourceDefinition 

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)