Kubernetes Scheduler Cache 架構設計源碼閱讀

作者:楊鼎睿,華北電力大學大四學生。

本文研究了 Kubernetes 中 Scheduler Cache 部分的源碼,通過畫圖表現其設計思想,希望讀者能自行配備源碼進行進一步理解,學會自己進行相關設計。

Nodes

Nodes 中保存了 Node.Name 到 nodeInfoListItem 鏈表的映射。每個 nodeInfoListItem 對應一個 NodeInfo 實例,實例中保存了 Node 信息及相關的 Pod 信息。

AddNode

AddNode 方法執行時,需要傳入一個 Node 實例。首先,根據 Node.Name 是否存在於 nodes 中來判斷執行路徑。如果 Node.Name 不存在,那麼創建一個新的 nodeInfoListItem 並存入 nodes 中。如果已經存在,那麼獲取對應的鏈表第一個對象,使用該對象包含的 Node 節點進行鏡像清理,需要注意,這裏並沒有刪除鏡像,只是在 imageStates 中移除鏡像名。

然後,將最近修改的 Node 對應的鏈表項移動至 headNode 表頭,如下圖所示,這樣也解釋了爲什麼一個 Node 對應的 Key 會關聯一個鏈表。事實上,一個 Key 只有一個鏈表項,通過 headNode 關聯起來的是最近使用順序。

接着,將 Node 添加至 nodeTree 中,過程如下圖

完成後,將 Node 中關聯的鏡像添加至 imageStates 中,關於 imageState 的清理操作,前面已詳細說明,添加操作不再深入。

Pod

AddPod

當 podStates 中對應 Pod Key 中存儲的 Pod 的 NodeName 與新 Pod 的 NodeName 不一致時,會執行 removePod 操作,其代碼如下

隨後,再執行 addPod,這裏不再描述,前面的圖中已詳細繪製。

UpdatePod

Schedule

Update Snapshot

總結

本文研究了 Kubernetes 中 Scheduler Cache 部分的源碼,進度在 1/5,接下來將整理 Kubernetes 1.18 版本下的全部源碼設計圖。預計會有五個大模塊,分別是 API Server,Client,Proxy,Controllers 和 Scheduler,和一些輔助工具如 Docker,Go Basic 和 Network 方面統共 123 張源碼設計圖。敬請期待吧。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Rx7z6UrhV849aWUj5TUo8Q