This page looks best with JavaScript enabled

Kubernetes Controller 設計挖掘之路

 ·  ☕ 3 min read

前幾章節,我針對 Kubernetes work queue 進行了大部分解,回頭看看這幾篇文之後我發現一個問題,讀者可能沒辦法體會為什麼我們要了解 kubernetes work queue 的原理與機制以及要 work queue 怎麼使用,不是按照 example controller 抄一抄改一改就好了嗎?或是採用某一種框架與架構例如非常有名的 operator framework 或是 metacontroller 還有很多不同的框架族繁不及備載。

本篇文章將會提出為什麼需要了解 kubernetes work queue,以及其他在撰寫 controller 時候需要了解的元件。

如果有見解錯誤的地方,還麻煩觀看本文的大大們提出,感謝!

controller example

這是透過 client go 撰寫 kubernetes controller 官方所提供的範例,從中我們可以了解搭建一個最基本的 controller 需要什麼元件。
source code

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Controller demonstrates how to implement a controller with client-go.
type Controller struct {
	indexer  cache.Indexer                        //幫忙儲放資料的元件
	queue    workqueue.RateLimitingInterface      //幫忙資料排隊的元件
	informer cache.Controller                     //幫忙向api server 拿資料的元件
}


//上述三個組合於 Controller 資料結構都是 interface , 只要傳入有實作的物件就好


// NewController creates a new Controller.
//傳入實作 Rate Limiting queue interface 的物件
//傳入實作 interface 的物件
//傳入實作 Controller interface 的物件
//那麼就得到了一個堪用的 kubernetes controller 了
func NewController(queue workqueue.RateLimitingInterface, indexer cache.Indexer, informer cache.Controller) *Controller {
	return &Controller{
		informer: informer,
		indexer:  indexer,
		queue:    queue,
	}
}

架構圖

看到官方提供的範例,再回頭看前些日子我針對 kubernetes controller 其中的 queue 的分析,我們可以對應著架構圖來看,會方便我們理解!
大致可以拆成三塊來看

  1. work queue

  2. indexer

  3. informer

上述三個拆分的方式是我個人的理解,如果有誤希望有大大可以指點QQ

  • informer

    • Reflector
      從 api server 拉到 kubernetes 的資料(Pod, Deployment e.t.c)進行反序列化丟給Delta queue處理
    • Handle Deltas
      拿到 Queue 吐出的資料(Object Key)進行處理,分派給其他 work 等
    • Get By Key
      Worker 透過 Obejct Key 像 Indexer 取得資料(Pod, Deployment e.t.c)
  • work queue

    • Reflector為生產者
      • 產出object key 放入work queue按照特定規則排序(如delaying等)
    • Controller為消費者
      • 從work queue 中拿出 object key
  • Indexer

    • key / value形態的local cache
      • 存放object key跟反序列化後的obejct value(Pod, Deployment e.t.c)

小結

從架構圖上我們可以看到有幾好幾個部分需要了解例如 Work queue 、 Indexer 、 Informer 。

先前的章節我們了解了 Work queue 的各種變化,例如最基礎的 Common work queue 、 Delaying work queue 、 Ratelimite work queue 等。

後續會逐步介紹 Indexer 其中的奧妙與設計理念, Kubernetes 如何在本地端進行 cache 以及提供其他元件透過 Object key 進行查詢。

個人認為複雜與難以理解的 informer 放到最後一個章節,這邊牽扯的東西非常多也很雜論需要前面幾張的鋪成,可能會比較好理解吧 xD

最後檢視官方的的 deployment controller 是如何撰寫得,把整篇文章的思路與脈絡打通。

文章中若有錯誤或是有疑問的地方歡迎提出,讓我們互相學習成長,謝謝!


Meng Ze Li
WRITTEN BY
Meng Ze Li
Kubernetes / DevOps / Backend

What's on this Page