Kubernetes 源码分析之 kubelet(三)

k8s技术圈

共 2169字,需浏览 5分钟

 · 2021-01-11

Version

k8s 版本 v1.18.3 (后续系列都以这个版本)

syncPod

syncPod 会在 pkg/kubelet/pod_workers.go 下的 managePodLoop 函数中被调用,在触发前会先调用 podCache.GetNewerThan 来获取最新的 kubecontainer.PodStatus
然后 syncPod 会处理以下两种情况
  • 删除 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 如何生成?

可以发现 pod status 的生成调用了 kl.generateAPIPodStatus 这个函数,这个函数有两个参数,一个是当前的 pod,一个是 podCache 中获取的 kubecontainer.PodStatus
上述 podCache 定义在 pkg/kubelet/container/cache.go 下,可以发现 podCache 只是一个简单的 cache 层,用于维护最新 kubecontainer.PodStatus,而 cache 的更新操作在 pkg/kubelet/pleg/generic.go  relist 函数中被调用。
这里可以发现 pleg 模块会定时从 container runtime 中获取状态,并且和当前 pod/container 状态对比,然后生成一些 pod 的生命周期事件,最终触发相关操作。
 kubecontainer.PodStatus 被更新,syncPod 就会被触发,进而生成 api PodStatus


containerManager 是什么?

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(四)



 点击屏末  | 即刻学习

浏览 60
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报