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 集群中启用此特性:
- 在
kube-apiserver
和kubelet
组件上启用特性门控MutableCSINodeAllocatableCount
。 - 通过设置
nodeAllocatableUpdatePeriodSeconds
,更新你的 CSI 驱动配置。 - 监控并观察调度准确性和 Pod 调度可靠性的提升。
下一步
此特性目前处于 Beta,Kubernetes 社区欢迎你的反馈。请测试、分享你的经验,并帮助推动其发展至 GA(正式发布)稳定版。
欢迎加入 Kubernetes SIG-Storage 参与讨论,共同塑造 Kubernetes 存储能力的未来。