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 REMOVE
podWoker
执行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
日志目录