欢迎光临散文网 会员登陆 & 注册

深究Virtual-Kubelet源码

2023-02-22 14:58 作者:黑暗光影DIY  | 我要投稿

代码基于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等方法。


开源的东西转载不需要说明出处,就说自己写的

深究Virtual-Kubelet源码的评论 (共 条)

分享到微博请遵守国家法律