内容提要
本文分析 Kubernetes v1.28 中 kubelet 的 Pod 驱逐机制:kubelet 监控节点内存、磁盘等资源,超过阈值即主动终止 Pod 回收资源。驱逐管理器的 Start 启动异步循环,核心 synchronize 方法依次获取运行中 Pod 与资源用量、判断阈值、按驱逐优先级排序,再按资源排序选出 Pod 并调用 evictPod 终止。内存阈值还可借助 CGroup 内核通知机制提升精度与性能。
延伸解读
驱逐流程的固定工作流
synchronize 方法每次同步都按固定顺序执行:获取运行中 Pod 列表、采集节点资源用量、更新阈值、判断是否超限、按驱逐优先级排序、再按资源排序选出 Pod 并调用 evictPod。值得注意的是,每次最多只驱逐一个 Pod,然后等待清理完成再进入下一轮,这种串行设计避免了同时终止多个 Pod 造成资源剧烈波动。
内存阈值的内核通知机制
当开启 KernelMemcgNotification 时,kubelet 会为内存阈值创建基于 CGroup 的 notifier,通过 eventfd、epoll 等文件描述符监听内核事件,阈值触发时立即回调 synchronize。相比纯轮询,这种方式精度更高、性能更好。但文章也指出,目前只实现了内存事件通知,其他资源仍依赖定期同步。
驱逐排序依赖资源类型映射
managerImpl 中维护了 signalToRankFunc 映射,不同资源对应不同的 Pod 排序方法。synchronize 先按驱逐优先级对阈值排序,再用对应资源的排序方法对活跃 Pod 排序,例如内存压力下优先驱逐占用内存最多的 Pod。这意味着驱逐结果并非随机,而是由资源类型和排序函数共同决定。
Q&A
kubelet 的 Pod 驱逐机制是做什么的?
kubelet 监控节点的内存、磁盘等资源使用情况,当超过指定阈值时,会主动终止(驱逐)相关 Pod 以回收资源,避免节点负载过重和资源争用。
kubelet 驱逐管理器的 synchronize 方法具体执行哪些步骤?
synchronize 方法依次:获取运行中的 Pod 列表和节点资源用量;更新资源阈值;检测资源是否超阈值;筛选满足驱逐条件的 Pod;按驱逐优先级排序;再按资源排序选出要驱逐的 Pod;最后调用 evictPod 终止 Pod。
kubelet 如何利用 CGroup 内核通知机制提升内存驱逐的精度和性能?
当启用 KernelMemcgNotification 时,kubelet 为内存阈值创建 linuxCgroupNotifier,通过 CGroup 的 eventfd 和 epoll 机制监听内存事件,一旦超过阈值立即触发 synchronize,相比轮询更精确且性能更好。
kubelet 驱逐 Pod 时如何决定先驱逐哪个 Pod?
kubelet 先根据驱逐优先级对 Pod 排序,再根据触发驱逐的资源类型(如内存)使用对应的排序方法(如按内存使用量)对 Pod 排序,优先驱逐使用资源最多的 Pod。
kubelet 驱逐管理器中定义了哪些资源信号(Signal)?
资源信号分为内存型和存储型,内存型包括 memory.available(可用内存)和 pid.available(可分配 PID 数量),存储型包括镜像使用空间、容器使用空间等。
kubelet 驱逐 Pod 时实际执行终止操作的是哪个方法?
managerImpl.evictPod 方法负责驱逐 Pod,它通过调用初始化时注入的 killPodFunc 来阻塞式地终止 Pod。