- https://atbug.com/kubelet-source-code-analysis/
kubernetes 分为控制面和数据面,kubelet 就是数据面最主要的组件,在每个节点上启动,主要负责容器的创建、启停、监控、日志收集等工作。它是一个在每个集群节点上运行的代理,负责确保节点上的容器根据PodSpec(Pod定义文件)正确运行。
Kubelet执行以下几项重要功能:
- Pod生命周期管理:Kubelet根据从API服务器接收到的PodSpecs创建、启动、终止容器。它负责启动Pod中的容器,并确保它们按预期运行。
- 节点状态监控:Kubelet定期监控节点和容器的状态,并将状态报告回集群的控制平面。这使得集群中的其他组件能够做出相应的调度决策。
- 资源管理:Kubelet负责管理分配给每个Pod的资源。这包括CPU、内存和磁盘存储资源。
- 健康检查:Kubelet可以执行容器健康检查,并根据检查结果决定是否需要重启容器。
- 与容器运行时的通信:Kubelet与容器运行时(如Docker、containerd等)通信,以管理容器的生命周期。
- 秘密和配置管理:Kubelet负责将秘密、配置映射等挂载到Pod的容器中,以便应用程序可以访问这些配置。
- 服务发现和负载均衡:尽管Kubelet本身不直接处理服务发现,但它通过设置网络规则和环境变量来支持容器内的服务发现机制。
kubelet 的架构由 N 多的组件组成,下面简单介绍下比较重要的几个:
- Sync Loop: 这是Kubelet活动的核心,负责同步Pod的状态。同步循环会定期从API服务器获取PodSpecs,并确保容器的当前状态与这些规格相匹配。
- PodConfig: 负责将各个配置源转换成 PodSpecs,可以选择的配置源包括:Kube-apiserver、本地文件、HTTP。
- PLEG(Pod Lifecycle Event Generator): 负责监测和缓存Pod生命周期事件,如创建、启动或停止容器,然后将这些事件通知 Sync Loop。
- PodWorkers: 负责管理 Pod 的生命周期事件处理。当 Pod 生命周期事件 PLEG 检测到新的事件时,PodWorkers 会被调用来处理这些事件,包括启动新的 Pod、更新现有的 Pod、或者停止和清理不再需要的 Pod。
- PodManager: 存储 Pod 的期望状态,kubelet 服务的不同渠道的 Pod。
- ContainerRuntime: 顾名思义,容器运行时。与遵循 CRI 规范的高级容器运行时进行交互。
- StatsProvider: 提供节点和容器的统计信息,有 cAdvisor 和 CRI 两种实现。
- ProbeManager: 负责执行容器的健康检查,包括 Liveness,Startup 和 Readiness 检查。
- VolumeManager: 负责管理 Pod 的卷,包括挂载和卸载卷。
- ImageManager: 负责管理镜像,包括拉取、删除、镜像 GC 等。
- DeviceManager: 负责管理设备,包括 GPU、RDMA 等。
- PluginManager: PluginManager 运行一组异步循环,根据此节点确定哪些插件需要注册/取消注册并执行。如 CSI 驱动和设备管理器插件(Device Plugin)。
- CertificateManager: 处理证书轮换。
- OOMWatcher: 从系统日志中获取容器的 OOM 日志,将其封装成事件并记录。
首先在 中使用传入命令行参数的方式初始化配置,然后创建 中的 Bootstrap inferface, kubelet struct 实现了这个接口, 然后调用 方法启动 kubelet。
讯享网
讯享网
方法:
- GetConfiguration: 获取 kubelet 的配置
- BirthCry: 打印 kubelet 启动信息
- StartGarbageCollection: 启动垃圾回收
- ListenAndServe: 启动 kubelet 服务
- ListenAndServeReadOnly: 启动只读服务
- ListenAndServePodResources: 启动 pod 资源服务
- Run: 启动 kubelet 的同步循环
- RunOnce: 启动一次同步循环
大致的流程为使用 启动容器垃圾回收,当ImageGCHighThresholdPercent 为100时,不启动镜像垃圾回收,否则使用 启动镜像垃圾回收。
讯享网
大致作用为从 中获取 PodUpdate,然后调用 方法,该方法会调用 方法启动 Pod。
代码的流程为:
- 检查是否需要创建日志服务器 如果需要则创建
- 启动云提供商同步管理器
- 初始化模块,如果出错则打印日志并退出
- 启动卷管理器
- 启动两个 goroutine 来更新状态,一个是定时更新,一个是在初始化时更新
- 启动同步租约的goroutine
- 定期更新RuntimeUp状态的goroutine
- 设置iptables规则
- 启动组件同步循环
- 如果启用了RuntimeClasses,则启动RuntimeClasses同步循环
- 启动Pod Lifecycle Event Generator
- 如果启用了EventedPLEG特性,则启动EventedPLEG
- 启动 syncloop

讯享网
代码流程为:
- 从 pleg 获取 update 事件 他是一个 channel
- 进入循环 如果 runtimeState 有错误 sleep 一会儿然后跳过
- 执行 syncLoopIteration
syncLoopIteration
首先解释一下这个函数的参数:
- configCh: 将配置更改的 Pod 分派给适当的处理程序回调函数
- plegCh: 更新运行时缓存;同步 Pod
- syncCh: 同步所有等待同步的 Pod
- housekeepingCh: 触发 Pod 的清理
- health manager: 同步失败的 Pod 或其中一个或多个容器的健康检查失败的 Pod
代码流程为:
- 如果 updates channel 有消息 则使用 handler 调用对应方法做处理
- 如果 plegCh 有消息 则使用 handler 的 HandlePodSyncs 做同步
- 如果 syncCh 有消息 代表到了同步时间 做同步操作
- 如果是 三种 probe 的更新 则使用 handleProbeSync 做同步
- 如果 housekeepingCh 有消息 则使用 handler 的 HandlePodCleanups 做清理
讯享网
handleProbeSync也是使用 handler 的 HandlePodSyncs 做同步
也是 kubelet struct 实现了这个接口
讯享网
可以看到这些函数基本都是把pod交给 podWorkers 去处理
上文中的 updates channel 是从 podconfig 中获取的 那就来看看 podconfig 是怎么工作的
这里定义了接口 接口提中可以存储多个 source 那么有什么 source 呢

讯享网
可以看到代码简单 就是 watrch apiserver 的 pod 然后把 pods 传给 updates channel
讯享网
http source 是 kubelet 本身开启 http 服务 通过调用 kubelet 的 http 接口来管理 pod 这个主要的作用是 给那些不想部署集群 只想使用 kubelet 的需求提供的
PLEG(Pod Lifecycle Event Generator)是 Kubernetes 中的一个关键组件,它负责监视和处理 Pod 的生命周期事件。PLEG 运行在每个节点上,并与 kubelet 组件紧密配合工作。
PLEG 的主要功能包括:
- 监控容器状态:PLEG 监控每个节点上正在运行的容器的状态,并根据其状态变化生成相应的事件。
- 生成事件:当容器的状态发生变化时,PLEG 会生成相应的事件,例如容器的创建、启动、停止、退出等事件。
- 同步状态:PLEG 通过与 kubelet 进行交互,将容器的状态信息同步给 kubelet,使 kubelet 能够了解容器的当前状态。
- 故障处理:PLEG 检测容器的状态变化,并在发现容器失败或异常时生成相应的事件,以便 kubelet 采取适当的故障处理措施。
PLEG 的设计目标是提供高效可靠的容器生命周期事件处理。它使用操作系统的文件系统事件和容器运行时的状态查询机制来监视容器的状态变化,从而及时地生成相应的事件。这些事件对于监控、日志记录、故障排除和自动恢复等方面非常重要。
kubelet 中实现了两种 PLEG,分别是:
- 通用 PLEG:用于处理普通容器的生命周期事件。使用轮询机制监控容器的状态变化,因此可能会有一定的延迟。而且耗费资源较多,不适合大规模部署。
- Event PLEG:用于处理事件容器的生命周期事件。使用事件机制监控容器的状态变化,因此响应速度较快。但是,他需要 container runtime 支持事件机制。
讯享网
可以看到 GenericPLEG 会定时从 runtime 获取 pods 然后和缓存中的旧的 pod 进行对比 然后生成事件发送给 eventChannel
从代码中可以看到 EventPLEG 可以从 runtime 获取容器事件。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/191413.html