从轮询切换为基于 CRI 事件的更新来获取容器状态
特性状态:
Kubernetes v1.25 [alpha]
(enabled by default: false)
本页展示了如何迁移节点以使用基于事件的更新来获取容器状态。 与依赖轮询的传统方法相比,基于事件的实现可以减少 kubelet 对节点资源的消耗。 你可以将这个特性称为事件驱动的 Pod 生命周期事件生成器 (PLEG)。 这是在 Kubernetes 项目内部针对关键实现细节所用的名称。
基于轮询的方法称为通用 PLEG。
准备开始
- 你需要运行提供此特性的 Kubernetes 版本。 Kubernetes 1.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 守护进程:[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 for Better Performance 中的设计理念。
最后修改 April 28, 2024 at 2:18 AM PST: [zh-cn] minor update task/administer-cluster (cc4bb6d141)