最近将kubelet的代码整体过了一遍,其实也没有想象中复杂。代码涉及到的细枝末节较多,如果先前对kubernetes的产品功能不够了解的话,可能直接上源码分析会云里雾里。我的建议是“先把握框架和主干,然后再逐步深入到各个细节”,做架构要有分层的思想,读代码也如此。写这篇文章一方面是为了记录下当下转瞬即逝的一些思路,另一方面如果后续有人在网上爬到,也希望它能对你有一点点帮助!
言归正传,下面先总体上谈谈kubelet代码的框架,然后分别介绍kubelet的各主要模块。
概况
下面是大图(确实很大!看细节请自行放大),简要汇总了kubelet从初始化到Run成功后,整个都处于运行中的goRoutines。就是靠这些goRoutine的紧密协作,保障了pod整个生命周期中,完全按照我们的要求来运行。
初始化
从图上可以看到,RunKubelet
在启动最终启动kubelet的之前,通过CreateAndInitKubelet
来做了很多初始化工作,包括container和image的GC也是在这个阶段就被启动起来了。我简单的分了一下类,这里重点需要掌握的是下面两个服务:
Config
kubelet所处理pod的配置来源逻辑,主要包含对三种来源:API-Server、URL和File的监听和操作对象的处理GarbageCollection(GC)
对节点上容器和镜像的垃圾回收逻辑
主要模块
然后,终于进入核心区域,kubelet的Run函数就是源码的重点了,这里我使用红色背景列出了各个重要角色。
updateRuntimeUp
主要涉及eviction操作syncNodeStatus
将节点注册到k8s集群,并收集节点信息定期上报到api-servervolumeManager
容器的镜像挂载、解绑等逻辑,保障存储与容器状态一致probeManager
主要涉及liveness和readiness的逻辑syncNetworkStatus
从CNI plugin获取状态podKiller
用于pod销毁的goRoutinestatusManager
负责将Pod状态及时更新到Api-Serverpleg
全称是Pod Lifecycle Event Generator,主要负责将Pod状态变化记录event以及触发Pod同步syncNetworkUtil
配置节点的防火墙和MasqueradesyncLoop
kubelet的核心主循环,响应各个模块的channel消息,并集中处理pod状态
在接下来的几篇文章中,我将基于这几个核心领域,分别介绍其大致作用和工作流程。