天天看點

Kubernetes必備知識: Kubernetes的核心——控制器模式

所屬技術領域:

K8s

|名詞定義|

一個永不終止的控制循環,它持續管理着叢集的狀态,通過apiserver擷取系統的狀态,并且不斷嘗試以達到預期狀态,比如副本控制器,namespace控制器,serviceaccounts控制器。

|技術特點|

  1. 控制循環

    控制型模式最核心的就是控制循環的概念。在控制循環中包括了控制器、被控制的系統,以及能夠觀測系統的傳感器,三個邏輯元件。

當然這些元件都是邏輯的,外界通過修改資源 spec 來控制資源,控制器比較資源 spec 和 status,進而計算一個 diff,diff 最後會用來決定執行對系統進行什麼樣的控制操作,控制操作會使得系統産生新的輸出,并被傳感器以資源 status 形式上報,控制器的各個元件将都會是獨立自主地運作,不斷使系統向 spec 表示終态趨近。

  1. Sensor

    控制循環中邏輯的傳感器主要由 Reflector、Informer、Indexer 三個元件構成。

Reflector 通過 List 和 Watch K8s server 來擷取資源的資料。List 用來在 Controller 重新開機以及 Watch 中斷的情況下,進行系統資源的全量更新;而 Watch 則在多次 List 之間進行增量的資源更新;Reflector 在擷取新的資源資料後,會在 Delta 隊列中塞入一個包括資源對象資訊本身以及資源對象事件類型的 Delta 記錄,Delta 隊列中可以保證同一個對象在隊列中僅有一條記錄,進而避免 Reflector 重新 List 和 Watch 的時候産生重複的記錄。

Informer 元件不斷地從 Delta 隊列中彈出 delta 記錄,然後把資源對象交給 indexer,讓 indexer 把資源記錄在一個緩存中,緩存在預設設定下是用資源的命名空間來做索引的,并且可以被 Controller Manager 或多個 Controller 所共享。之後,再把這個事件交給事件的回調函數

控制循環中的控制器元件主要由事件處理函數以及 worker 組成,事件處理函數之間會互相關注資源的新增、更新、删除的事件,并根據控制器的邏輯去決定是否需要處理。對需要處理的事件,會把事件關聯資源的命名空間以及名字塞入一個工作隊列中,并且由後續的 worker 池中的一個 Worker 來處理,工作隊列會對存儲的對象進行去重,進而避免多個 Woker 處理同一個資源的情況。

Worker 在處理資源對象時,一般需要用資源的名字來重新獲得最新的資源資料,用來建立或者更新資源對象,或者調用其他的外部服務,Worker 如果處理失敗的時候,一般情況下會把資源的名字重新加入到工作隊列中,進而友善之後進行重試。

  1. 控制循環例子-擴容

    這裡舉一個簡單的例子來說明一下控制循環的工作原理。

ReplicaSet 是一個用來描述無狀态應用的擴縮容行為的資源, ReplicaSet controler 通過監聽 ReplicaSet 資源來維持應用希望的狀态數量,ReplicaSet 中通過 selector 來比對所關聯的 Pod,在這裡考慮 ReplicaSet rsA 的,replicas 從 2 被改到 3 的場景。

首先,Reflector 會 watch 到 ReplicaSet 和 Pod 兩種資源的變化,為什麼我們還會 watch pod 資源的變化稍後會講到。發現 ReplicaSet 發生變化後,在 delta 隊列中塞入了對象是 rsA,而且類型是更新的記錄。

Informer 一方面把新的 ReplicaSet 更新到緩存中,并與 Namespace nsA 作為索引。另外一方面,調用 Update 的回調函數,ReplicaSet 控制器發現 ReplicaSet 發生變化後會把字元串的 nsA/rsA 字元串塞入到工作隊列中,工作隊列後的一個 Worker 從工作隊列中取到了 nsA/rsA 這個字元串的 key,并且從緩存中取到了最新的 ReplicaSet 資料。

Worker 通過比較 ReplicaSet 中 spec 和 status 裡的數值,發現需要對這個 ReplicaSet 進行擴容,是以 ReplicaSet 的 Worker 建立了一個 Pod,這個 pod 中的 Ownereference 取向了 ReplicaSet rsA。

然後 Reflector Watch 到的 Pod 新增事件,在 delta 隊列中額外加入了 Add 類型的 deta 記錄,一方面把新的 Pod 記錄通過 Indexer 存儲到了緩存中,另一方面調用了 ReplicaSet 控制器的 Add 回調函數,Add 回調函數通過檢查 pod ownerReferences 找到了對應的 ReplicaSet,并把包括 ReplicaSet 命名空間和字元串塞入到了工作隊列中。

ReplicaSet 的 Woker 在得到新的工作項之後,從緩存中取到了新的 ReplicaSet 記錄,并得到了其所有建立的 Pod,因為 ReplicaSet 的狀态不是最新的,也就是所有建立 Pod 的數量不是最新的。是以在此時 ReplicaSet 更新 status 使得 spec 和 status 達成一緻。

|資料來源|

名詞定義:

https://blog.csdn.net/weixin_43181696/article/details/84304319