Kubernetes v1.36:可变 CSI 节点可分配特性正式发布(GA)

我很高兴地代表 Kubernetes SIG Storage 社区宣布可变 CSI 节点可分配计数特性已在 Kubernetes v1.36 中毕业为正式可用(GA)!

该特性最早在 Kubernetes v1.33 中作为 Alpha 版本引入,并在 v1.34 中提升为 Beta 版本, 它允许容器存储接口(CSI) 驱动动态更新报告的节点能够处理的最大卷数量。 此特性显著提高了 Pod 调度决策的准确性,并减少了由于过时的卷容量信息导致的调度失败。

背景

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

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

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

动态适应 CSI 卷限制

随着此特性现已 GA,Kubernetes 使 CSI 驱动能够在运行时动态调整和报告节点附加容量。 这确保了调度器以及其他依赖此信息的组件能够获得最准确、最新的节点容量视图。

工作原理

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

  • 定期更新: CSI 驱动指定一个间隔,以定期刷新节点的可分配容量。
  • 反应性更新: 当卷附加由于资源耗尽(ResourceExhausted 错误)失败时触发的立即更新。

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 状态。

GA 中的新特性

随着在 Kubernetes v1.36 中升级为 GA,MutableCSINodeAllocatableCount 特性门控无条件启用且无法禁用。对于运行 Kubernetes v1.36 或更高版本的所有集群:

  • CSINode 的 .spec.drivers[*].allocatable.count 字段是可变的。
  • nodeAllocatableUpdatePeriodSeconds 字段在 CSIDriver 规格中可用。

开始使用

要在你的 Kubernetes v1.36 集群中利用此特性:

  1. 通过设置 nodeAllocatableUpdatePeriodSeconds 为你希望的更新间隔来更新你的 CSI 驱动配置。
  2. 监控并观察调度准确性和 Pod 放置可靠性方面的改进。

参考资料

参与其中

此特性由 SIG Storage 社区推动。请加入我们,与社区联系,分享你对上述特性的想法和反馈。我们期待听到你的声音!