CSI 驱动更新节点上可挂接卷数量信息的这一功能在 Kubernetes v1.33 中首次以 Alpha 引入,如今在 Kubernetes v1.34 中进阶为 Beta! 这是提升有状态 Pod 调度准确性的重要里程碑,可减少因可挂接卷容量信息过时所导致的调度失败问题。
传统上,Kubernetes 的 CSI 驱动在初始化时会报告一个静态的最大卷挂接限制。 然而,在节点的生命周期中,实际的挂接数量可能因各种原因发生变化,例如:
静态报告可能导致 Kubernetes 将 Pod 调度到看似有容量但实际上没有容量的节点上,
从而导致 Pod 卡在 ContainerCreating 状态。
借助这一新特性,Kubernetes 允许 CSI 驱动在运行时动态调整并报告节点的卷挂接数量。 这一特性可确保调度器以及依赖此信息的其他组件能够获得最准确、最新的节点容量信息。
Kubernetes 支持两种机制来更新所报告的节点卷限制:
ResourceExhausted 错误)而失败时触发立即更新。要使用此 Beta 特性,必须在以下组件中启用 MutableCSINodeAllocatableCount 特性门控:
kube-apiserverkubelet以下是配置 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 驱动配置。此特性目前处于 Beta,Kubernetes 社区欢迎你的反馈。请测试、分享你的经验,并帮助推动其发展至 GA(正式发布)稳定版。
欢迎加入 Kubernetes SIG-Storage 参与讨论,共同塑造 Kubernetes 存储能力的未来。