參考官方文檔: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 版本中,結構化模式定義是可選的。
- 為對象根(root)設定一個非空的 type 值(藉由 OpenAPI 中的
),對每個 object 節點的每個字段(藉由 OpenAPI 中的type
或properties
)以及 array 節點的每個條目(藉由 OpenAPI 中的additionalProperties
)也要設定非空的 type 值, 除非:items
- 節點包含屬性
x-kubernetes-int-or-string: true
- 節點包含屬性
x-kubernetes-preserve-unknown-fields: true
- 對于 object 的每個字段或 array 中的每個條目,如果其定義中包含
、allOf
、anyOf
或oneOf
,則模式也要指定這些邏輯組合之外的字段或條目(試比較例 1 和例 2)。not
- 在
、allOf
、anyOf
或oneOf
上下文内不設定not
、description
、type
、default
或者additionalProperties
。此規則的例外是nullable
的兩種模式(見下文)。x-kubernetes-int-or-string
- 如果
被設定,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)