做者:Hiro OSAKI翻譯:Bach(才雲)git
校對:星空下的文仔(才雲)、bot(才雲)github
CRD(Custom Resource Definition)是 Kubernetes 中的特殊資源。若是咱們只是以常規方式使用 Kubernetes,那就沒必要建立該資源,所以,CRD 對於許多用戶而言並不那麼重要。但它會常常出如今前沿的博客文章、kubernetes.io 的文檔和社區討論中。本文就簡單介紹一下 CRD 是什麼?咱們何時使用?一旦須要,要如何建立?數據庫
K8sMeetupapi
CRD 是什麼?app
CRD 就是一個數據庫表。舉個例子,咱們在數據庫中建立一個名爲 Fruit 的表,該表包含了許多記錄(record),例如 apple 、banana 和 orange。這些記錄有不少列(column),如「甜度」、「味道」和「重量」,來顯示水果的特性。CRD 就像一個 Fruit 表。工具
CR(Custom Resource,自定義資源)的每一個記錄(record)都相似於 apple。ui
建立 CRD(表)以後,咱們能夠添加或刪除 CR(記錄)。spa
爲何須要 CRD?由於愈來愈多的用戶熟悉了 Kubernetes 的用法後,但願更普遍地使用它。他們將更多數據輸入 Kubernetes 來使用,這些數據格式互不相同,並且不是 Kubernetes 本來就有定義的,所以他們在 Kubernetes 中建立表的種類,並設置自定義的列名或類型,就像在數據庫中那樣定義表,這就是 CRD 的由來。命令行
K8sMeetup翻譯
如何建立 CRD?
如上所述,CRD 是一個表,建立表時,咱們須要定義表的格式,例如列名和類型,這些元素在 CRD 文件中以 YAML 或 JSON 格式描述。
CR 以 YAML 或 JSON 格式描述記錄(record)的每一個值。
這是 CRD 內部詳細信息。
CRD 格式分爲三個部分。
name: "fruit-crd"
等)。apiVersion
和 kind
也是必需的。kind: "Fruit"
)、命令行的小寫名稱(simpler: "fruit"
)、複數形式(plural: "fruits"
)"sweetness"
)、列類型("boolean"、"string"、"integer"、"object")、Nested Object(props: <child object name and columns>
)。這些格式遵循 OpenAPISpecification v3。更多詳細信息能夠參閱官方文檔:
https://kubernetes.io/docs/ta...
K8sMeetup
檢驗 CRD 功能
CRD 真的是表嗎?下面讓咱們來驗證一下。
有人可能不記得 CRD 的格式,這裏介紹一個建立 CRD 的更簡單方法,即便沒有編寫 CRD,只有一個「表」的定義,咱們仍然能夠用 Operator(CRD 自動建立工具)生成 CRD。表並不複雜,其中 columns
包含了列名稱和類型。
簡單定義一個「表」
在將此表安裝到 Kubernetes 中以後,Operator 會自動生成如下 CRD。若是不想用 Operator,咱們也能夠本身生成它。若是要安裝 Operator,運行如下命令:
kubectl apply -f
https://raw.githubusercontent...
成功安裝 Operator 以後,用如下命令檢查容器是否在運行:
kubectl get pod -n k8sasdb-system
NAME READY STATUS RESTARTS AGE
k8sasdb-controller-manager-9dbf54b4f-hzrt9 2/2 Running 0 8s
生成 CRD:
CRD(左:常規部分和表級信息,右:列級信息)
而後添加如下 CR:
CR "Fruit"
下面檢驗表和記錄操做的結果:
建立表
kubectl create -f fruit.yaml
→ Success(已安裝 CRD = 已建立表)
這等於 SQL 的 CREATE TABLE fruits;
。
建立記錄(record)
kubectl create -f apple.yaml
→Success(已安裝 CR = 已建立記錄)
這等於 INSERT INTO fruits values('apple', ...);。
獲取記錄列表
kubectl get fruits
→Success(列出 2 個 CR,並顯示每列)
這就像 SQL 查詢 SELECT * FROM fruits;
結果。
獲取記錄
kubectl get fruit apple
→Success,這至關於 SELECT * FROM fruits WHERE name = 'apple';
。
刪除記錄
kubectl get fruit apple
刪除後,整個列表的檢查命令沒有顯示「apple」。
→Success。這就是 DELETE FROM fruits WHERE name = 'banana';
。
K8sMeetup
總結