天天看點

Kubelet 運作機制分析 Pod 管理

kubelet

通過以下

幾種方式擷取自身 Node 上所要運作的 Pod 清單

(1)檔案:

kubelet

啟動

參數

“一

config

”指定的配置檔案目錄下的檔案(預設目錄為“

etc/

kubernetes

manifests/)

。通過

file-check-frequency

設定檢查該檔案目錄的時

間間, 

預設為

20s。

staticPodPath: /etc/kubernetes/manifests      

(2)

HTTP

端點

CURL

):通過“一

manifest-url

”參數設定

。通

過一

http-check-frequency

設定

檢查該

HTTP

端點資料的時間間隔,預設為

20S。

(3)

API

Server: 

kubelet

通過

API

Server

監聽

etcd

目錄,同步

Pod

表。

以非 API Server方式建立的 Pod 

所有以非 API Server方式建立的 Pod 都叫作 Static Pod

, 

kubelet将Static Pod 的狀态彙報給

API Server

API Server 為該 Static Pod 建一個 Mirror Pod 其相比對。 Mirror Pod 的狀态将真

實反映 Static Pod 的狀态。

Static

Pod

被删除時與之相對應的

Mirror

Pod

會被删除。

API Server方式建立的 Pod  

我們隻讨論通過 API

Server

獲得

Pod

清單的方式。

kubelet

通過

API

S

erver 

Client

使用

Watch 

List 的方式監聽“

registry/

nodes/$ 

目前節點

的名稱” 和 “/

registry/p

ods

”目錄,将擷取的資訊

同步到本地緩存中。

kubelet

監聽 e

tcd ,

所有針對

Pod

操作将會被

kubelet

監聽到

。如果發現有新的綁定到本節點的

Pod

,則

按照

Pod

清單的要求建立該

Pod。

如果發現本地的

Pod

被修改

,則

kubelet

會做出相應的修改

,比如删除

Pod

中的

某個容器時

則通過 Docker

Client

删除該容器。

如果發現删除本節點的 Pod

,則删除相應的

Pod

,并通過

Docker

Client

Pod

中的

容器。

kubelet

讀取監聽到的資訊,如果是建立和修改

Pod

,則做如

下處理。

(1

)為該

Pod

建立

個資料目錄

(2

)從

API

Server

讀取該

Pod

清單。

(3

)為該

Pod

挂載外部卷

Extemal

Volume

(4

)下載下傳

Pod

用到的

Secret

(5

)檢查己經運作在節點中的

Pod

,如果該

Pod

沒有容器或

Pause

容器(“

kubernetes/pause

鏡像建立的容器)沒有啟動,則先停止

Pod

裡所有容器的程序。如果在

Pod

中有需要删除的容

器,則删除這些容器。

(6

)用“

kubemetes/pause

”鏡像為每個

Pod

建立一個容器。該

Pause

容器用于接管

Pod所有其他容器的網絡。每建立

個新的

Pod,

kubelet

都會先建立

Pause

容器,然後建立其他容器。kubernetes/pause

”鏡像大概為

200KB

,是

個非常小的容器鏡像。

  • 為容器計算一個 hash 值,然後用容器的名字去查詢對應 Docker 容器的 hash 值。若查找到容器,且兩者的 hash 值不同,則停止 Docker 中容器的程序,井停止與之關聯的Pause 容器的程序;若兩者相同,則不做任何處理
  • 如果容器被終止了,且容器沒有指定的 restartPolicy (重新開機政策〉,則不做任何處理。
  • 調用 Docker Client 下載下傳容器鏡像,調用 Docker Client 運作容器