kubelet 源码分析-1-整体架构

2024-07-22  本文已影响0人  梅_梅

简介
从官方的架构图中很容易就能找到 kubelet
执行 kubelet -h 看到 kubelet 的功能介绍:

架构

image.png

kubelet 的架构由 N 多的组件组成,下面简单介绍下比较重要的几个:

PLEG

Pod Lifecycle Event Generator,字面意思 Pod 生命周期事件(ContainerStartedContainerDiedContainerRemovedContainerChanged)生成器。

其维护着 Pod 缓存;定期通过 ContainerRuntime 获取 Pod 的信息,与缓存中的信息比较,生成如上的事件;将事件写入其维护的通道(channel)中。

PodWorkers

处理事件中 Pod 的同步。核心方法 managePodLoop() 间接调用 kubelet.syncPod() 完成 Pod 的同步:

PodManager

存储 Pod 的期望状态,kubelet 服务的不同渠道的 Pod

StatusProvider

提供节点和容器的统计信息,有 cAdvisorCRI 两种实现。

ContainerRuntime

顾名思义,容器运行时。与遵循 CRI 规范的高级容器运行时进行交互。

Deps.PodConfig

PodConfig 是一个配置多路复用器,它将许多 Pod 配置源合并成一个单一的一致结构,然后按顺序向监听器传递增量变更通知。

配置源有:文件、apiserver、HTTP

syncloop

接收来自 PodConfig 的 Pod 变更通知、定时任务、PLEG 的事件,以及 ProbeManager 的事件,将 Pod 同步到期望状态

PodAdmitHandlers

Pod admission 过程中调用的一系列处理器,比如 eviction handler(节点内存有压力时,不会驱逐 QoS 设置为 BestEffort 的 Pod)、shutdown admit handler(当节点关闭时,不处理 pod 的同步操作)等。

OOMWatcher

从系统日志中获取容器的 OOM 日志,将其封装成事件并记录。

VolumeManager

VolumeManager 运行一组异步循环,根据在此节点上调度的 pod 确定需要附加/挂载/卸载/分离哪些卷并执行操作。

CertificateManager

处理证书轮换。

ProbeManager

实际上包含了三种 Probe,提供 probe 结果缓存和通道。

EvictionManager

监控 Node 节点的资源占用情况,根据驱逐规则驱逐 Pod 释放资源,缓解节点的压力。

PluginManager

PluginManager 运行一组异步循环,根据此节点确定哪些插件需要注册/取消注册并执行。如 CSI 驱动和设备管理器插件(Device Plugin)。

CSI

Container Storage Interface,由存储厂商实现的存储驱动。

DevicePlugin

Kubernetes 提供了一个 设备插件框架,你可以用它来将系统硬件资源发布到 Kubelet。

供应商可以实现设备插件,由你手动部署或作为 DaemonSet 来部署,而不必定制 Kubernetes 本身的代码。目标设备包括 GPU、高性能 NIC、FPGA、 InfiniBand 适配器以及其他类似的、可能需要特定于供应商的初始化和设置的计算资源。

生命周期事件生成器PLEG

image.png

对于 Pod来说,Kubelet 会从多个数据来源(api、file以及http) watch Pod spec 中的变化。对于容器来说,Kubelet 会定期轮询容器运行时,以获取所有容器的最新状态。随着 Pod 和容器数量的增加,轮询会产生较大开销,带来的周期性大量并发请求会导致较高的 CPU 使用率峰值,降低节点性能,从而降低节点的可靠性。为了降低 Pod 的管理开销,提升 Kubelet 的性能和可扩展性,引入了 PLEG(Pod Lifecycle Event Generator)。改进了之前的工作方式:

  1. 减少空闲期间的不必要工作(例如 Pod 的定义和容器的状态没有发生更改)。

  2. 减少获取容器状态的并发请求数量。

为了进一步降低损耗,社区推出了基于event实现的PLEG,当然也需要CRI运行时支持。

它定期检查节点上 Pod 运行情况,如果发现感兴趣的变化,PLEG 就会把这种变化包 装成 Event 发送给 Kubelet 的主同步机制 syncLoop 去处理。

syncLoop

Kubelet启动后通过syncLoop进入到主循环处理Node上Pod Changes事件,监听来自file,apiserver,http三类的事件并汇聚到kubetypes.PodUpdate Channel(Config Channel)中,由syncLoopIteration不断从kubetypes.PodUpdate Channel中消费。

image.png
上一篇 下一篇

猜你喜欢

热点阅读