[TOC]
Kubernetes CRDs 自定義資源
基礎簡介
Kubernetes API
REST API 是 Kubernetes 的基礎結構,所有的操作和元件間的通訊,包括外部的使用者命令,都是由 API Server 處理的 REST API 呼叫。因此,Kubernetes 中的所有事物都被視為一個 API 物件並且都有一個與之對應的 API 入口。
和API Server的互動可以採用REST API,也可以採用kubectl等命令列工具
Kubernetes 支援多個 API 版本,每個版本都在不同的 API 路徑下,例如 /api/v1 或者 /apis/extensions/v1beta1
Kubernetes 物件
Kubernetes物件是會進行持久化的,一旦建立物件,Kubernetes 系統將持續工作以確保物件存在。通過建立物件,可以有效地告知 Kubernetes 系統,所需要的叢集工作負載看起來是什麼樣子的,這就是 Kubernetes 叢集的 期望狀態。Kubernetes 物件包含如下資訊:
- 應用執行的容器是咋樣的,容器執行在哪個 Node 上
- 可以被應用使用的資源有多少
- 關於應用如何表現的策略:比如重啟策略、升級策略,以及容錯策略
對Kubernetes 物件的操作包括:建立、修改、刪除、升級等,這些都需要使用Kubernetes API 進行操作。
每個 Kubernetes 物件包含兩個巢狀的物件欄位,它們負責管理物件的配置:物件 spec 和 物件 status。spec 必須提供,它描述了物件的 期望狀態 —— 希望物件所具有的特徵。status 描述了物件的 實際狀態,它是由 Kubernetes 系統提供和更新。在任何時刻,Kubernetes 控制平面一直處於活躍狀態,管理著物件的實際狀態以與我們所期望的狀態相匹配。
Kubernetes CRD自定義資源
CRD存在於所有namespace下
CustomResourceDefinition(CRD)是v1.7+新增的無需改變程式碼就可以擴充套件Kubernetes API的機制,用來管理自定義物件。
在Kubernetes中一切都可視為資源,系統提供了很多預設資源型別,如 Pod、Deployment、Service、Volume等一系列資源,一種資源就是Kubernetes API中的一個端點,它儲存著某種API 物件的集合,自定義資源是對Kubernetes API的擴充套件,在一個執行中的叢集內,自定義資源可以通過動態註冊出現和消失,叢集管理員可以獨立於叢集本身更新自定義資源。
自定義資源本身可以進行簡單地儲存和索取結構化資料,但是隻有和控制器結合後才能成為一種真正的declarative API(宣告式API), 控制器將結構化資料解釋為使用者所期望狀態的記錄,並且不斷地採取行動來實現和維持該狀態。定製化控制器是使用者可以在執行中的叢集內部署和更新的一個控制器,它獨立於叢集本身的生命週期。 定製化控制器可以和任何一種資源一起工作,當和定製化資源結合使用時尤其有效。
CustomResourceDefinition (CRD)是一個內建的API, 它提供了一個簡單的方式來建立自定義資源。
CRD建立流程
當建立一個新的自定義資源定義(CRD)時,Kubernetes API Server 通過建立一個新的RESTful資源路徑進行應答
1,定義和建立自定義資源kind: CustomResourceDefinition
CRD
如下,首先需要先定義和建立一個自定義資源kind: CustomResourceDefinition
,指定API Group的名稱如group: networking.istio.io
,
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
annotations:
helm.sh/hook: crd-install
creationTimestamp: 2018-10-15T10:06:40Z
generation: 1
labels:
app: istio-pilot
name: virtualservices.networking.istio.io
resourceVersion: "226955722"
selfLink: /apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions/virtualservices.networking.istio.io
uid: 02eb8d88-d062-11e8-a4b4-005056b84e17
spec:
group: networking.istio.io
names:
kind: VirtualService
listKind: VirtualServiceList
plural: virtualservices
singular: virtualservice
scope: Namespaced
version: v1alpha3
status:
acceptedNames:
kind: VirtualService
listKind: VirtualServiceList
plural: virtualservices
singular: virtualservice
conditions:
- lastTransitionTime: 2018-10-15T10:06:40Z
message: no conflicts found
reason: NoConflicts
status: "True"
type: NamesAccepted
- lastTransitionTime: 2018-10-15T10:06:40Z
message: the initial names have been accepted
reason: InitialNamesAccepted
status: "True"
type: Established
複製程式碼
這樣就建立了一個新的區分名稱空間的RESTful API斷點:/apis/networking.istio.io/v1alpha3/namespaces/*/virtualservices/...
,然後可以使用此端點URL來建立和管理自定義物件,這些物件的kind就是上面建立的CRD中指定的kind: VirtualService
物件。
2,建立一個CRD的自定義物件
在CRD物件建立完成之後就建立自定義物件(instances)了,這些自定義物件例項就可以類似Kubernetes的常用物件如Deployment、Service、Pod等一樣進行CURD操作了。 自定義物件可以包含自定義的欄位,這些欄位可以包含任意的JSON,具體的欄位要根據物件去定義,主要是spec域。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: wudebao-web
spec:
hosts:
- "www.wudebao-web.com"
gateways:
- wudebao-web-gateway
http:
- match:
- uri:
exact: /wudebao
route:
- destination:
port:
number: 54321
host: wudebao-web
複製程式碼
CRD的常用命令操作
查詢所有CRD:
kubectl get crd |grep istio
複製程式碼