Kubernetes v1.33:可变的 CSI 节点可分配数

可靠调度有状态应用极度依赖于节点上资源可用性的准确信息。
Kubernetes v1.33 引入一个名为可变的 CSI 节点可分配计数的 Alpha 特性,允许 CSI(容器存储接口)驱动动态更新节点可以处理的最大卷数量。
这一能力显著提升 Pod 调度决策的准确性,并减少因卷容量信息过时而导致的调度失败。

背景

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

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

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

动态适应 CSI 卷限制

借助新的特性门控 MutableCSINodeAllocatableCount,Kubernetes 允许 CSI 驱动在运行时动态调整并报告节点的挂接容量。如此确保调度器能获取到最准确、最新的节点容量信息。

工作原理

启用此特性后,Kubernetes 支持通过以下两种机制来更新节点卷限制的报告值:

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

启用此特性

要使用此 Alpha 特性,你必须在以下组件中启用 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 秒,以平衡准确性和资源使用量。

挂接失败时的即时更新

除了周期性更新外,Kubernetes 现在也能对挂接失败做出响应。
具体来说,如果卷挂接由于 ResourceExhausted 错误(gRPC 错误码 8)而失败,将立即触发更新,以快速纠正可分配数量。

这种主动纠正可以防止重复的调度错误,有助于保持集群的健康状态。

快速开始

要在 Kubernetes v1.33 集群中试用可变的 CSI 节点可分配数:

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

后续计划

此特性目前处于 Alpha 阶段,Kubernetes 社区欢迎你的反馈。 无论是参与测试、分享你的经验,都有助于推动此特性向 Beta 和 GA(正式发布)稳定版迈进。

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