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

有状态应用的可靠调度在很大程度上依赖于节点上资源可用性的准确信息。Kubernetes v1.33 引入了一个名为“可变的 CSI 节点可分配计数”(mutable CSI node allocatable count)的 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. 通过设置 nodeAllocatableUpdatePeriodSeconds 来更新您的 CSI 驱动程序配置。
  3. 监控并观察调度准确性和 Pod 放置可靠性的改善。

后续步骤

此特性目前处于 Alpha 阶段,Kubernetes 社区欢迎您的反馈。请测试它,分享您的经验,并帮助指导其向 Beta 和正式发布(GA)版本的稳定性演进。

欢迎加入 Kubernetes 存储特别兴趣小组(SIG-Storage)的讨论,共同塑造 Kubernetes 存储能力的未来。