从轮询切换到基于 CRI 事件的容器状态更新
功能状态:
Kubernetes v1.27 [测试版]
本页面介绍如何将节点迁移为使用基于事件的更新来获取容器状态。与依赖轮询的传统方法相比,基于事件的实现减少了 kubelet 的节点资源消耗。您可能知道此功能为*基于事件的 Pod 生命周期事件生成器 (PLEG)*。这是 Kubernetes 项目内部用于关键实现细节的名称。
基于轮询的方法称为*通用 PLEG*。
准备工作
- 您需要运行提供此功能的 Kubernetes 版本。Kubernetes v1.27 包括对基于事件的容器状态更新的 Beta 支持。该功能处于 Beta 阶段,但默认情况下是*禁用*的,因为它需要容器运行时的支持。
- 您的 Kubernetes 服务器必须是 1.26 版本或更高版本。要检查版本,请输入
kubectl version
。如果您运行的是其他版本的 Kubernetes,请查看该版本的文档。 - 使用的容器运行时必须支持容器生命周期事件。如果容器运行时没有声明支持容器生命周期事件,kubelet 会自动切换回传统的通用 PLEG 机制,即使您启用了此功能门控也是如此。
为什么要切换到基于事件的 PLEG?
- *通用 PLEG* 会因频繁轮询容器状态而产生不可忽略的开销。
- Kubelet 对容器状态的并行轮询加剧了这种开销,从而限制了其可扩展性,并导致性能和可靠性问题。
- *基于事件的 PLEG* 的目标是通过替换定期轮询来减少不活动期间的不必要工作。
切换到基于事件的 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 守护程序,或使用包含以下行的 dropin 配置[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 基于事件的 PLEG 以获得更佳性能。
上次修改时间:2024 年 2 月 20 日太平洋标准时间上午 9:48:将更多功能状态短代码切换为数据驱动 (7b6866063f)