Kubernetes 源码分析之 kubelet(三)
k8s 版本 v1.18.3 (后续系列都以这个版本)
syncPod
pkg/kubelet/pod_workers.go
下的 managePodLoop
函数中被调用,在触发前会先调用 podCache.GetNewerThan
来获取最新的 kubecontainer.PodStatus
删除 pod (updateType == SyncPodKill) 创建更新同步 pod
删除 pod 的逻辑相对比较简单,暂时不深入分析了,将关注点集中在另一种情况时。
根据 container runtime 实际情况生成期望的 api PodStatus statusManager 获取当前的 api PodStatus (从 apiserver) statusManager 更新 api PodStatus containerManager 处理 Cgroups 相关操作 volumeManager 处理 volume 相关功能 获取镜像 pullSecret, 调用 container runtime 去 SyncPod
总的来说本文关注以下几个部分
期望的 api PodStatus 如何生成 containerManager 是什么 volumeManager 是什么 以及最重要的 container runtime 相关的功能和实现
期望的 api PodStatus 如何生成?
kl.generateAPIPodStatus
这个函数,这个函数有两个参数,一个是当前的 pod,一个是 podCache 中获取的 kubecontainer.PodStatus
pkg/kubelet/container/cache.go
下,可以发现 podCache 只是一个简单的 cache 层,用于维护最新的 kubecontainer.PodStatus
,而 cache 的更新操作在 pkg/kubelet/pleg/generic.go
的 relist
函数中被调用。kubecontainer.PodStatus
被更新,syncPod
就会被触发,进而生成 api PodStatuscontainerManager 是什么?
containerManager 定义在 pkg/kubelet/cm/container_manager.go
中,整个接口的定义比较杂乱,总的来说整个 manager 是用来管理一些 cgroups 相关的操作和结构。
了解这部分代码前可以先了解一下 kubernetes 管理下整个 cgroups 的结构树,详细的内容之后再深入讨论。
volumeManager
volumeManager 定义在 pkg/kubelet/volumemanager/volume_manager.go
,负责 kubelet 和 volume 的交互。
整个 volume 的功能实现也是一个非常大的模块,也涉及到了 kubernetes 的核心扩展 CSI(container storage interface),之后了解 CSI 的时候再深入讨论这部分代码。
container runtime
containerRuntime 定义在 pkg/kubelet/container/runtime.go
中,containerRuntime 负责和容器运行时交互的所有操作,也就是整个 kubelet 中最核心的部分。
目前 containerRuntime 的实现定义在 pkg/kubelet/kuberuntime/kuberuntime_manager.go
下篇文章讲讲 kuberuntime 如何和 kubernetes 最核心的扩展 CRI(container runtime interface) 交互,以及 CRI 相关的内容
最后
本次分析解决了一些问题
pleg
模块到底做了什么syncPod
做了一些什么
带来了如下问题
containerManager 以及 pod 的 cgroups 结构
volumeManager 以及 CSI
containerRuntime 以及 CRI
剩余
为什么需要定时触发 syncCh
为什么需要 housekeeping
containerManager 以及 pod 的 cgroups 结构 volumeManager 以及 CSI containerRuntime 以及 CRI
敬请期待 Kubernetes 源码分析之 kubelet(四)