iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 29
0
Software Development

分散式系統 - 在分散的世界中保持一致系列 第 29

Day 29 - Cloud Computing - Platform as a Service - Kubernetes (下)

  • 分享至 

  • xImage
  •  

前言

昨天介紹了Kubernetes的運作與設計原理,了解到最主要的運作模式就是靠etcd、APIServer、Controller的合作完成了K8s上面所有任務。

今天我們就來介紹這個Controller裡面是長什麼樣子吧

Operator Pattern

每一個K8s裡面的Controller一定都會搭配一個Resource,也就是API Server裡面REST API的那個Object。
而每一個Controller也就只負則管理相對應Object的生命週期。

在K8s 1.10版本以後
使用者正式可以在K8s透過創建一個Custom Resource Definition (CRD) 來自定義自己的Resource並註冊在API Server中。

接著也可以基於Controller的設計原理開發自己的Custom Controller

而搭配了 CRDCustom Controller 的客製化運作模式就叫做Operator Pattern,由CoreOS發起與推廣。

Controller

而Controller到底內部有什麼?
下圖就是一個Controller的組成

  • Informers: Informer的任務就是訂閱Resource的Add/Update/Delete事件,並接收事件的主要元件。透過HTTP Watch/List方法,取得事件與物件後,放進一個Delta Queue裡

    • 觸發Controller針對Add/Update/Delete自主設計的Callback function
      • OnAdd
      • OnUpdate
      • OnDelete
    • 將物件在Local端建立Cache,當Controller需要Get/List目前的物件狀態時,可以直接從Cache拿取,減少對API Server的請求且因為該Cache是由Informer List/Watch維護,因此跟API Server那邊的訊息Consistent的。
  • Workqueue: 前面提到的callback function當然可以獨立寫成三個相對應的function去執行動作。但是也提供另一種方法是,三個callback function皆是將物件放進Workqueue中,另外撰寫一個Controller Infinite Loop不斷從Queue中取得物件來進行 Real World = Desired World 的維護狀態邏輯

    • 因為物件可能因為一連串Add/Update/Delete事件被觸發而重複放進Queue中好幾次,因此Queue維護了一個Set,避免後面Controller平行的Goroutines同時處理了同一個物件。
    • 如下圖呼叫Queue API的流程圖

  • Controller: 實際執行Real World = Desired World 的維護狀態邏輯。可以平行開好幾個Goroutines增加效能。

而除了Informer K8s的client-go library已經幫你維護好了以外,Workqueue與Controller皆是開發者可以自行設計的部分。

範例

以下用程式碼描述Controller從Workqueue到Control Loop的邏輯。

一個Controller會有

  1. Informer
  2. Cache
  3. Workqueue

這邊撰寫時,針對三個Callback Functions皆直接將物件放進Queue中。

啟動Controller,可以自定義threadiness來平行啟動好幾個Goroutines來處理Queue中的物件。

而每一個Goroutine皆執行runWorker這個函式,其實動作就從Queue中取出物件執行 Real World = Desired World 的邏輯。

裡面可以看到很多對應前面Queue API的流程圖,表示從Queue中取出物件處理。

而最重要的就是syncHandler,就是比對現實系統中這個物件的狀態與他的Spec,並呼叫K8s API來完成狀態的維護。

比方說

  1. 目前這個Deployment需要5個pod replicas
  2. 透過Get可以知道現在系統中只有4個pods
  3. 使用K8s Client呼叫K8s API,Create Pod 使得系統中是5個pods。
  4. Update Deployment物件的Status,如果你執行 kubectl describe deployment/XXXXX 會發現他的Status出現 pod id5 has been created 這個就是在這個邏輯中完成加上去的。

總結

以上就是K8s Controller的設計與實作,更詳細的實作可以直接參考K8s官方的像是Job Controller/Deployment Controller

或是參考一些Custom Controller像是etcd Operatorrook Operator都是很好的參考對象。

透過CRD+Custom Controller,開發者可以把一整個分散式系統應用當作一個Resource Unit像是Pod那樣來做部署與維護。是一個很強大的設計。


上一篇
Day 28 - Cloud Computing - Platform as a Service - Kubernetes (上)
下一篇
Day 30 - 為什麼學分散式系統?
系列文
分散式系統 - 在分散的世界中保持一致30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言