Kubernetes v1.34:可变 CSI 节点可分配数进阶至 Beta

CSI 驱动更新节点上可挂接卷数量信息的这一功能在 Kubernetes v1.33 中首次以 Alpha 引入,如今在 Kubernetes v1.34 中进阶为 Beta! 这是提升有状态 Pod 调度准确性的重要里程碑,可减少因可挂接卷容量信息过时所导致的调度失败问题。

背景

传统上,Kubernetes 的 CSI 驱动在初始化时会报告一个静态的最大卷挂接限制。 然而,在节点的生命周期中,实际的挂接数量可能因各种原因发生变化,例如:

  • 在 Kubernetes 控制之外的手动或外部卷挂接/解除挂接操作。
  • 动态挂接的网络接口或专用硬件(GPU、NIC 等)消耗可用的插槽。
  • 在多驱动场景中,一个 CSI 驱动的操作影响另一个驱动所报告的可用容量。

静态报告可能导致 Kubernetes 将 Pod 调度到看似有容量但实际上没有容量的节点上, 从而导致 Pod 卡在 ContainerCreating 状态。

动态调整 CSI 卷限制

借助这一新特性,Kubernetes 允许 CSI 驱动在运行时动态调整并报告节点的卷挂接数量。 这一特性可确保调度器以及依赖此信息的其他组件能够获得最准确、最新的节点容量信息。

工作原理

Kubernetes 支持两种机制来更新所报告的节点卷限制:

  • 周期性更新: CSI 驱动指定一个时间间隔,定期刷新节点的可分配容量。
  • 触发式更新: 当卷挂接因资源耗尽(ResourceExhausted 错误)而失败时触发立即更新。

启用特性

要使用此 Beta 特性,必须在以下组件中启用 MutableCSINodeAllocatableCount 特性门控:

  • kube-apiserver
  • kubelet

示例 CSI 驱动配置

以下是配置 CSI 驱动以启用每 60 秒周期性更新一次的示例:

apiVersion: storage.k8s.io/v1
kind: CSIDriver
metadata:
  name: example.csi.k8s.io
spec:
  nodeAllocatableUpdatePeriodSeconds: 60

此配置指示 kubelet 每隔 60 秒调用一次 CSI 驱动的 NodeGetInfo 方法,以更新节点的可分配卷数。 Kubernetes 强制要求更新时间间隔最小为 10 秒,目的是在准确性与资源消耗间达成平衡。

挂接失败时立即更新

当卷挂接操作因 ResourceExhausted 错误(gRPC 代码 8)而失败时,Kubernetes 会立即更新可分配数量, 而不是等待下一次周期性更新。随后 kubelet 会将受影响的 Pod 标记为 Failed,使其控制器能够重新创建这些 Pod。 这样可以防止 Pod 永久卡在 ContainerCreating 状态。

快速入门

要在 Kubernetes v1.34 集群中启用此特性:

  1. kube-apiserverkubelet 组件上启用特性门控 MutableCSINodeAllocatableCount
  2. 通过设置 nodeAllocatableUpdatePeriodSeconds,更新你的 CSI 驱动配置。
  3. 监控并观察调度准确性和 Pod 调度可靠性的提升。

下一步

此特性目前处于 Beta,Kubernetes 社区欢迎你的反馈。请测试、分享你的经验,并帮助推动其发展至 GA(正式发布)稳定版。

欢迎加入 Kubernetes SIG-Storage 参与讨论,共同塑造 Kubernetes 存储能力的未来。