深究Virtual-Kubelet源码
代码基于v1.5.0
文档:https://virtual-kubelet.io/docs/
源码:https://github.com/virtual-kubelet/virtual-kubelet
1 简介和概要

Virtul-Kubelet实现了Kubelet的基本功能,但与Kubelet南向对接CRI不同,Virtual-Kubelet通过Provider对接南向的容器实例或其他容器相关服务,如下图示意

主流的Provider如下,国内的Ali ECI,Huawei CCI

virtual-kubelet包含一条主命令和3条子命令,启动virtual-kubelet进程使用主命令,如下:
virtual-kubelet项目本身是一个框架,并没有实际功能,通过provider项目实现provider功能才具备实际能力。下面主要分析如何实现一个Provider及其工作流程。
看类图,主要包括NodeController和PodController,NodeController主要功能是向KubeapiServer同步Node状态,维护corev1.Node对象,主要逻辑是由virtual-kubelet项目实现。

2 Provider项目实现和关键流程
tensile-kube https://github.com/virtual-kubelet/tensile-kube 是一个南向对接Kubernetes的Provider项目,tensile-kube采用node-cli作为脚手架,实现了启动和加载流程,其核心是生成NodeController和PodController对象,并启动协程,执行Run方法,NodeController不需要Provider项目实现,我们主要分析PodController和Provider逻辑。VirtualK8S实现了virtual-kubelet框架中所需接口。

PodController.Run是关键启动加载和逻辑处理流程入口,核心逻辑包括:
调用Provider.NotifyPods,实现Provider Pods状态变化反向通知触发状态同步
注册podsInformer EventHandler,对KubeapiServer中Pod变化进行处理,分发到对应的处理队列
删除Provider中悬垂的Pod
启动syncPodsFromKubernetes/syncPodStatusFromProvider/deletePodsFromKubernets队列进行对应逻辑处理

以syncPodFromKubernetesHandler为代表分析流程,核心业务是同步Provider中的Pod,如果Pod删除,调用进入delete流程,否则进入创建或更新流程,在createOrupdate中,首先调用GetPod查询provider中是否存在Pod,如果存在则调用UpdatePod执行更新,如果不存在则执行CreatePod执行创建操作。

对于tensile-kube Provider项目,则调用VirtualK8S.GetPod/UpdatePod/CreatePod/DeletePod/NotifyPods等方法。
开源的东西转载不需要说明出处,就说自己写的