深究Virtual-Kubelet源碼
代碼基于v1.5.0
文檔:https://virtual-kubelet.io/docs/
源碼:https://github.com/virtual-kubelet/virtual-kubelet
1?簡介和概要

Virtul-Kubelet實現(xiàn)了Kubelet的基本功能,但與Kubelet南向?qū)覥RI不同,Virtual-Kubelet通過Provider對接南向的容器實例或其他容器相關(guān)服務(wù),如下圖示意

主流的Provider如下,國內(nèi)的Ali ECI,Huawei CCI

virtual-kubelet包含一條主命令和3條子命令,啟動virtual-kubelet進(jìn)程使用主命令,如下:
virtual-kubelet項目本身是一個框架,并沒有實際功能,通過provider項目實現(xiàn)provider功能才具備實際能力。下面主要分析如何實現(xiàn)一個Provider及其工作流程。
看類圖,主要包括NodeController和PodController,NodeController主要功能是向KubeapiServer同步Node狀態(tài),維護(hù)corev1.Node對象,主要邏輯是由virtual-kubelet項目實現(xiàn)。

2 Provider項目實現(xiàn)和關(guān)鍵流程
tensile-kube https://github.com/virtual-kubelet/tensile-kube 是一個南向?qū)覭ubernetes的Provider項目,tensile-kube采用node-cli作為腳手架,實現(xiàn)了啟動和加載流程,其核心是生成NodeController和PodController對象,并啟動協(xié)程,執(zhí)行Run方法,NodeController不需要Provider項目實現(xiàn),我們主要分析PodController和Provider邏輯。VirtualK8S實現(xiàn)了virtual-kubelet框架中所需接口。

PodController.Run是關(guān)鍵啟動加載和邏輯處理流程入口,核心邏輯包括:
調(diào)用Provider.NotifyPods,實現(xiàn)Provider Pods狀態(tài)變化反向通知觸發(fā)狀態(tài)同步
注冊podsInformer EventHandler,對KubeapiServer中Pod變化進(jìn)行處理,分發(fā)到對應(yīng)的處理隊列
刪除Provider中懸垂的Pod
啟動syncPodsFromKubernetes/syncPodStatusFromProvider/deletePodsFromKubernets隊列進(jìn)行對應(yīng)邏輯處理

以syncPodFromKubernetesHandler為代表分析流程,核心業(yè)務(wù)是同步Provider中的Pod,如果Pod刪除,調(diào)用進(jìn)入delete流程,否則進(jìn)入創(chuàng)建或更新流程,在createOrupdate中,首先調(diào)用GetPod查詢provider中是否存在Pod,如果存在則調(diào)用UpdatePod執(zhí)行更新,如果不存在則執(zhí)行CreatePod執(zhí)行創(chuàng)建操作。

對于tensile-kube Provider項目,則調(diào)用VirtualK8S.GetPod/UpdatePod/CreatePod/DeletePod/NotifyPods等方法。
開源的東西轉(zhuǎn)載不需要說明出處,就說自己寫的