Kubernetes 从轮询切换为基于 CRI 事件的更新来获取容器状态是一种重要的改进,它能够提高集群的性能和可靠性。CRI 是容器运行时接口的缩写,它是 Kubernetes 与容器运行时之间的通信接口。通过使用 CRI 事件,Kubernetes 可以实时地获取容器的状态信息,从而更好地管理和调度容器资源。
本教程展示了如何迁移节点以使用基于事件的更新来获取容器状态。 与依赖轮询的传统方法相比,基于事件的实现可以减少 kubelet 对节点资源的消耗。 可以将这个特性称为事件驱动的 Pod 生命周期事件生成器 (PLEG)。 这是在 Kubernetes 项目内部针对关键实现细节所用的名称。基于轮询的方法称为通用 PLEG。
一、准备
1、需要运行提供此特性的 Kubernetes 版本。 Kubernetes 1.27 提供了对基于事件更新容器状态的 Beta 支持。 此特性处于 Beta 阶段,默认被禁用。
2、Kubernetes 服务器版本必须不低于版本 1.26. 要获知版本信息,请输入 kubectl version.
3、所使用的容器运行时必须支持容器生命周期事件。 如果容器运行时未声明对容器生命周期事件的支持,即使已启用了此特性门控, kubelet 也会自动切换回传统的通用 PLEG。
二、切换到事件驱动的PLEG
1、为什么要切换到事件驱动的 PLEG?
(1)通用 PLEG 由于频繁轮询容器状态而产生了不可忽略的开销。
(2)这种开销会被 kubelet 的并行轮询容器状态的机制加剧, 限制了可扩缩性,还会导致性能和可靠性问题。
(3)事件驱动的 PLEG 的目标是通过替换定期轮询来减少闲置时的非必要任务。
2、切换为事件驱动的 PLEG
(1)启用特性门控 EventedPLEG 后启动 kubelet。 可以通过编辑 kubelet 配置文件并重启 kubelet 服务来管理 kubelet 特性门控。 需要在使用此特性的所有节点上执行此操作。
(2)确保节点被腾空后再继续。
(3)启用容器事件生成后启动容器运行时。
- containerd:版本 1.7+
- CRI-O:版本 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
Kubernetes 服务器版本必须不低于版本 1.26. 要获知版本信息,请输入 kubectl version.
(4)确认 kubelet 正使用基于事件的容器阶段变更监控。 要检查这一点,可在 kubelet 日志中查找 EventedPLEG 词条。
输出类似于:
I0314 11:10:13.909915 1105457 feature_gate.go:249] feature gates: &{map[EventedPLEG:true]}
如果将 –v 设置为 4 及更高值,可能会看到更多条目表明 kubelet 正在使用基于事件的容器状态监控。
<code class="language-console" data-lang="console">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