Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Extend the Kubernetes API with CRD and Custom A...

Kyle Bai
January 26, 2018

Extend the Kubernetes API with CRD and Custom API Server

Kyle Bai

January 26, 2018
Tweet

More Decks by Kyle Bai

Other Decks in Technology

Transcript

  1. Job R&D @ inwinSTACK Description 早期在校主要撰寫 java 與 objc 程式語⾔言,並專注於

    iOS Mobile 應⽤用程式開發,具備四年年開發經驗。次要研讀 Hadoop 與 Spark 資料運算框架,以及 Linux 相關技術。 研所與⼯工作期間則專注於 OpenStack、Ceph 與 Kubernetes 等雲原⽣生相關技術開源專案,閒暇之餘會參參加 相關專案社區及貢獻,並利利⽤用部落落格、GitHub 與 GitBook 進⾏行行筆記記錄。 Drink Coffee Good! Phone #7727 Love Buttocks kairen([email protected]) https://kairen.github.io/ About Me Kyle Bai
  2. Kubernetes 47% Containers remain the top emerging technology of interest

    to users. Among those currently deploying container orchestration or platform services on OpenStack, 47% are using Kubernetes. Why Kubernetes? Kubernetes API Server Extend the Kubernetes with CRD Extend the Kubernetes with apiserver-builder Agenda Today I will talk about
  3. Kubernetes Pros 資源監控 Monitoring 滾動升級 Rolling-update ⾼高可靠性 High-availability ⾃自我修復 Self-healing

    雲端⽀支援 Cloud Provider 持久性儲存 Persistent Volumes 組態檔案 Configmap 安全性 Secret Kubernetes 管理理跨區域與主機的容器節點,提供基本部署、維運、管 理理,以及執⾏行行各項應⽤用程式,並具備多種特性。
  4. Kubernetes API driven Kubernetes API 是以 JSON 作為其主要序列列化模型的 HTTP API,且能夠⽀支

    援協定快取區,並⽤用於叢集內部溝通使⽤用。 • 通過 API 完成節點之間溝通進⾏行行 CRUD 操作,或是授權、認證與註冊等。 • Kubernetes 有明確定義與規範 API。⽀支援 OpenAPI。 • 使⽤用 gRPC 進⾏行行 Remote Procedure Call。 • 可擴展的 API。 • CRD(Custom Resource Definitions) • API server aggregation • Custom resources and controllers
  5. API Levels 在 Kubernetes 中,不同版本的 API 意味著不同層級穩定度與⽀支援度: • Alpha level:在預設下是⼤大多情況禁⽌止使⽤用狀狀態,這些功能有可能隨時在下⼀一

    版本被遺棄,因此只適⽤用於測試⽤用,Example: v1alpha1。 • Beta level: 在這級別⼀一般預設會啟⽤用,這表⽰示該功能已經過很好的測試項 ⽬目,但是物件內容可能會在後續版本或穩定版本發⽣生變化。Example: v1beta2。 • Stable level:在這級別表⽰示該功能已經穩定,會很長的時間⼀一直存在。 Example: v1。
  6. API Terminology(1/2) • Kind:是⼀一個實體(Entity)的類型,每個 Kubernetes 物件都會有⼀一個欄欄位 Kind。 1. 物件表⽰示系統中的⼀一個持久實體,如 Pod

    與 Namespace。 2. ⼀一個多種實體的資源集合列列表,如 PodLists, NodeLists。 3. 特殊⽤用途類型⽤用於物件與非持久實體的特 定操作,如 /binding, /status 這些⽤用來來取得 API Group 與 Resource 的錯誤狀狀態。
  7. API Terminology(2/2) • API Group:是邏輯上相關的種類集合,如 Job 與 CronJob 都屬於批次處理理功能相 關。

    • Version: 每個 API Group 存在多個版本,這些版本區分不同穩定度層級,⼀一般功能會 從 v1alpha1 升級到 v1beta1,然後在 v1 成為穩定版本。 • Resource: 資源是透過 HTTP 發送與檢索的系統實體,其以 JSON 來來表⽰示。可以是 單⼀一或者多個資源。
  8. Request Flow and Processing(1/4) https://github.com/kubernetes/apiserver/blob/master/pkg/server/config.go • 在 DefaultBuildHandlerChain() 做 操作過濾處理理。

    • 透過 Multiplexer 來來依據 HTTP 路路 徑將請求路路由到對應 Handlers。 • 利利⽤用 Routes 來來將 HTTP 路路徑與 Handlers 進⾏行行連接。 • Handlers 獲取 HTTP 請求與上下⽂文 ( User, Auth 等),並從儲存中取得 物件實體。
  9. Validation and Admission • Admission:透過驗證叢集的全域約束來來檢查是否建立或更更新 API 物件,在 Kubernetes 中有很多這樣功能。幾個約束範例例: •

    NamespaceLifecycle: 如果命名空間不存在,則拒絕該所有請求。 • ResourceQuota:為叢集的當前使⽤用者強制執⾏行行額度限制。 • Validation:檢查傳入的物件(建立與更更新過程)的格式是否符合。例例如: • 檢查所有的字串串是否是有效的格式。 • 檢查是否有設定⽭矛盾欄欄位。
  10. CustomResourceDefinitions(CRD) CustomResourceDefinition(CRD) 是 v1.7+ 版本新加入的 Kubernetes API 擴 展機制,⽬目標是無需修改核⼼心程式碼就能對 Kubernetes

    進⾏行行擴展,⽽而 CRD 更更 是 ThirdPartyResources(TPR) 的升級版。 • 使⽤用⾃自定義物件進⾏行行擴展 Kubernetes API. • CRDs 能夠沿⽤用熟係的 UX ⼯工具,ex: kubectl. • 能夠與 Controllers 進⾏行行結合. • ⽀支援 SubResources(v1.9). P.S. TPR 在 v1.8 版本已被遺棄。
  11. Use case - rook.io(3/3) Rook 使⽤用 CRD 來來定義建立 Pool 與

    Filesystem 資源,以提供 Rook operator 存取並建立對應服務。
  12. apiserver-builder apiserver-builder 是⼀一個實作快速建構 Kubernetes apiserver 與⾃自定義資源類 型的⼯工具與函式庫,該⼯工具具備了了以下幾個特性: • 能夠⼀一次建立新資源類型、控制器、測試函式與⽂文件。 •

    能夠建構與執⾏行行於 Standalone, Minikube 與遠端叢集。 • 能夠簡單地從控制器(Controller)來來觀看與更更新 Kubernetes API 資源類型。 • 很簡單的加入新資源與⼦子資源。 • 為⼤大多數欄欄位提供預設值,且能夠被覆蓋。
  13. apiserver-builder cmd # 初始化 $ cd GOPATH/src/github.com/my-org/my-project $ apiserver-boot init

    repo --domain <your-domain> # 建立資源 $ apiserver-boot create group version resource --group <group> --version <version> --kind <Kind> # 編譯執⾏行行檔 $ apiserver-boot build executables $ apiserver-boot build docs # 在 local 執⾏行行 $ apiserver-boot run local # 在叢集執⾏行行 $ apiserver-boot run in-cluster --name nameofservicetorun --namespace default --image gcr.io/myrepo/ myimage:mytag $ kubectl create -f sample/<type>.yaml