kubelet源码分析 podManager和podWorkers、workQueue
· 7 min read
在 Kubelet 源码分析工作原理中介绍过, Kubelet 中有两个核心的数据结构字段, podManager 和 podWorkers, 现在我们来一探究竟。
podManager 和 podWorkers 里面保存的 Pod 内容可能不一样,比如:
- 强制删除
Pod时,会把podManager中的记录删除掉,但是**podWorkers** 中的Pod会执行正常的删除流程;此时就出现podManager不存在**,podWorkers** 存在的问题**。** - 新创建的
Pod会先保存到podManager中,启动时再保存到podWorkers中。
它们要做的就是无限趋近于一样。
MirrorPod
在 PodManager 中存在 podByFullName 和 mirrorPodByFullName 的两个字段,分别保存 Pod 信息和 MirrorPod 的。
podByFullName map[string]*v1.Pod
mirrorPodByFullName map[string]*v1.Pod
pod 来源分为 file http apiserver 三个 source , 其中 apiserver 中的 pod 称为普通pod,其他来源的 pod 称为 static pod, 为了管理 pod 方便, kubelet 会在 apiserver 上为static pod 生成对应的 pod,这类型 pod 称为 mirror pod .
即可以理解是这个 pod 的替身, 基本上跟 static pod一模一样,只有 uid 不一样和 annotations 里多 了 kubernetes.io/config.mirror .
mirror pod 是保存在 apiserver 中的 static pod 的一个镜像,但是操作 mirror pod 对 static pod 的影响是不一样的。

如果要删除 static pod ,比如是从文件创建的,则需要删除文件才能删除这个 static pod 和 mirror pod .
static pod移除流程:
podConfig感知到static文件的移除,触发SyncLoop REMOVEpodWoker执行syncTerminatingPod(执行停止容器和sandbox)PLEG感知到sanbox和container的退出podWoker执行syncTerminatedPod(移除cgroup,更新mirror pod的status,等待pod 的volume umount完成)- 感知到
mirror pod的status更新 housekeeping触发,执行清理工作(podWorker的移除mirror pod的删除pod volume目录移除)- 感知到
mirror pod的删除和从apiserver上移除 garbageCollector执行sandbox和容器的清理,并移除pod日志目录
