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 運作容器