从轮询切换到基于 CRI 事件的容器状态更新

功能状态: Kubernetes v1.25 [alpha](默认禁用:false)

本页面展示如何迁移节点以使用基于事件的容器状态更新。与依赖轮询的传统方法相比,基于事件的实现减少了 kubelet 的节点资源消耗。您可能知道此功能为*事件驱动的 Pod 生命周期事件生成器 (PLEG)*。这是 Kubernetes 项目内部用于关键实现细节的名称。

基于轮询的方法称为*通用 PLEG*。

开始之前

  • 您需要运行提供此功能的 Kubernetes 版本。Kubernetes v1.27 包含对基于事件的容器状态更新的 beta 支持。该功能是 beta 版,但默认情况下是禁用的,因为它需要容器运行时的支持。
  • 您的 Kubernetes 服务器必须是 1.26 或更高版本。要检查版本,请输入 kubectl version。如果您运行的是不同版本的 Kubernetes,请检查该版本的文档。
  • 使用的容器运行时必须支持容器生命周期事件。即使您启用了此功能门控,如果容器运行时未声明支持容器生命周期事件,kubelet 也会自动切换回传统的通用 PLEG 机制。

为什么要切换到 Evented PLEG?

  • 由于频繁轮询容器状态,通用 PLEG 会产生不可忽略的开销。
  • Kubelet 并行轮询容器状态加剧了这种开销,从而限制了其可扩展性并导致性能和可靠性问题。
  • Evented PLEG 的目标是通过替换定期轮询来减少非活动期间的不必要工作。

切换到 Evented PLEG

  1. 启动 Kubelet 时启用 特性门控 EventedPLEG。您可以通过编辑 kubelet 配置文件 并重启 kubelet 服务来管理 kubelet 特性门控。您需要在使用此功能的每个节点上执行此操作。

  2. 请确保节点在继续操作之前已排空

  3. 启动容器运行时时启用容器事件生成。

    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
    
    您的 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 正在使用基于事件的容器状态监控。

    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
    

下一步

上次修改时间:2024 年 2 月 20 日 上午 9:48 PST: 将更多 feature-state 短代码切换为数据驱动 (7b6866063f)