从轮询切换到基于 CRI 事件的容器状态更新
特性状态:
Kubernetes v1.26 [alpha]
(默认禁用:false)本页面展示如何将节点切换为使用基于事件的容器状态更新。与依赖轮询的传统方法相比,基于事件的实现降低了 kubelet 消耗的节点资源。你可能知道此功能为**事件驱动的 Pod 生命周期事件生成器 (PLEG)**。这是 Kubernetes 项目内部用于关键实现细节的名称。
基于轮询的方法被称为**通用 PLEG**。
准备工作
- 你需要运行一个提供此功能的 Kubernetes 版本。Kubernetes v1.27 包含了对基于事件的容器状态更新的 Beta 支持。该功能为 Beta 版但**默认禁用**,因为它需要容器运行时提供支持。
- 你的 Kubernetes 服务器版本必须是 1.26 或更高。
要检查版本,请输入
如果你正在运行不同版本的 Kubernetes,请查阅该版本的文档。kubectl version
。 - 所使用的容器运行时必须支持容器生命周期事件。即使你启用了此功能门控,如果容器运行时未声明支持容器生命周期事件,kubelet 也会自动切换回传统的通用 PLEG 机制。
为什么要切换到 Evented PLEG?
- **通用 PLEG** 由于频繁轮询容器状态而产生不可忽视的开销。
- 由于 Kubelet 并行轮询容器状态,此开销进一步加剧,从而限制了其可伸缩性并导致性能不佳和可靠性问题。
- **Evented PLEG** 的目标是通过替换周期性轮询来减少不活动期间不必要的工作。
切换到 Evented PLEG
通过启用 功能门控
EventedPLEG
来启动 Kubelet。你可以通过编辑 kubelet 配置文件 并重新启动 kubelet 服务来管理 kubelet 功能门控。你需要在每个使用此功能的节点上执行此操作。在继续之前,请确保节点已排空。
启动容器运行时并启用容器事件生成。
你的 Kubernetes 服务器版本必须是 1.26 或更高。版本 1.7+
版本 1.26+
通过验证配置,检查 CRI-O 是否已配置为发出 CRI 事件:
crio config | grep enable_pod_events
如果已启用,输出应类似于以下内容:
enable_pod_events = true
要启用它,请使用标志
--enable-pod-events=true
启动 CRI-O 守护程序,或者使用包含以下行的插入式配置:[crio.runtime] enable_pod_events: true
要检查版本,请输入
kubectl version
。验证 kubelet 是否正在使用基于事件的容器阶段变更监控。要检查,请在 kubelet 日志中查找术语
EventedPLEG
。输出应类似于此:
I0314 11:10:13.909915 1105457 feature_gate.go:249] feature gates: &{map[EventedPLEG:true]}
如果你已将
--v
设置为 4 或更高,你可能会看到更多条目,表明 kubelet 正在使用基于事件的容器状态监控。I0314 11:12:42.009542 1110177 evented.go:238] "Evented PLEG: Generated pod status from the received event" podUID=3b2c6172-b112-447a-ba96-94e7022912dc I0314 11:12:44.623326 1110177 evented.go:238] "Evented PLEG: Generated pod status from the received event" podUID=b3fba5ea-a8c5-4b76-8f43-481e17e8ec40 I0314 11:12:44.714564 1110177 evented.go:238] "Evented PLEG: Generated pod status from the received event" podUID=b3fba5ea-a8c5-4b76-8f43-481e17e8ec40
下一步
- 在 Kubernetes 增强提案 (KEP) 中了解更多设计信息:Kubelet Evented PLEG 以获得更好的性能。
上次修改时间:2024 年 2 月 20 日上午 9:48 (太平洋标准时间):将更多 feature-state 简码切换为数据驱动 (7b6866063f)