存储容量

存储容量是有限的,并且可能因 Pod 运行的节点而异:网络附加存储可能无法被所有节点访问,或者存储一开始就本地于某个节点。

特性状态: Kubernetes v1.24 [stable]

本页面描述了 Kubernetes 如何跟踪存储容量以及调度器如何使用这些信息将Pod 调度到具有足够存储容量的节点上,以满足剩余缺失卷的需求。如果没有存储容量跟踪,调度器可能会选择一个没有足够容量来供应卷的节点,这将需要多次调度重试。

准备工作

Kubernetes v1.34 包含对存储容量跟踪的集群级 API 支持。要使用此功能,你还必须使用支持容量跟踪的 CSI 驱动。请查阅你使用的 CSI 驱动的文档,以了解此支持是否可用,以及如果可用,如何使用它。如果你未运行 Kubernetes v1.34,请查阅该版本 Kubernetes 的文档。

API

此功能有两个 API 扩展

  • CSIStorageCapacity 对象:这些对象由 CSI 驱动在驱动安装的命名空间中生成。每个对象包含一个存储类的容量信息,并定义哪些节点可以访问该存储。
  • CSIDriverSpec.StorageCapacity 字段:当设置为 true 时,Kubernetes 调度器将考虑使用 CSI 驱动的卷的存储容量。

调度

如果以下条件成立,Kubernetes 调度器将使用存储容量信息

  • Pod 使用尚未创建的卷,
  • 该卷使用引用 CSI 驱动并使用 WaitForFirstConsumer 卷绑定模式StorageClass,并且
  • 驱动的 CSIDriver 对象将 StorageCapacity 设置为 true。

在这种情况下,调度器只考虑为 Pod 提供的具有足够可用存储的节点。此检查非常简单,只将卷的大小与包含该节点的拓扑的 CSIStorageCapacity 对象中列出的容量进行比较。

对于采用 Immediate 卷绑定模式的卷,存储驱动器独立于将使用该卷的 Pod 决定在何处创建卷。然后,调度器在卷创建后将 Pod 调度到卷可用的节点上。

对于CSI 临时卷,调度始终不考虑存储容量。这是基于以下假设:这种卷类型仅由节点本地的特殊 CSI 驱动使用,并且不需要那里的大量资源。

重新调度

当为具有 WaitForFirstConsumer 卷的 Pod 选择了节点时,该决定仍然是暂定的。下一步是请求 CSI 存储驱动器创建卷,并提示该卷应在选定的节点上可用。

由于 Kubernetes 可能会根据过时的容量信息选择节点,因此卷可能无法实际创建。然后,节点选择将被重置,Kubernetes 调度器将再次尝试为 Pod 查找节点。

限制

存储容量跟踪增加了调度在第一次尝试时成功的机会,但不能保证这一点,因为调度器必须根据可能过时的信息做出决定。通常,与没有存储容量信息时的调度失败相同的重试机制会处理调度失败。

一种可能导致调度永久失败的情况是 Pod 使用多个卷:一个卷可能已经在拓扑片段中创建,而该片段没有足够的容量用于另一个卷。需要人工干预才能从中恢复,例如通过增加容量或删除已创建的卷。

下一步

上次修改于 2022 年 10 月 24 日太平洋标准时间下午 3:55:KubeCon Docs Sprint:更新 content/en/docs/concepts/storage 的页面权重。(54ecdc4896)