本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。

Kubernetes 1.24:卷扩展现已成为稳定特性

卷扩展在 Kubernetes 1.8 中作为 Alpha 功能引入,在 1.11 中进入 Beta 阶段,而在 Kubernetes 1.24 中,我们很高兴地宣布卷扩展功能正式发布(GA)。

此功能允许 Kubernetes 用户只需编辑其 PersistentVolumeClaim 对象,并在 PVC Spec 中指定新的大小,Kubernetes 将通过存储后端自动扩展卷,并同时扩展 Pod 正在使用的底层文件系统,如果可能的话,完全无需任何停机时间。

如何使用卷扩展

你可以通过编辑 PVC 的 spec 字段来触发 PersistentVolume 的扩展,指定一个不同(且更大)的存储请求。例如,对于下面的 PVC:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi # specify new size here

你可以通过指定一个新值来替换旧的 1Gi 大小,请求扩展底层的 PersistentVolume。更改请求的大小后,请观察 PVC 的 status.conditions 字段,以查看调整大小是否已完成。

当 Kubernetes 开始扩展卷时,它会向 PVC 添加一个 Resizing 状况,扩展完成后该状况将被移除。还可以通过监控与 PVC 相关的事件来获取有关扩展操作进度的更多信息。

kubectl describe pvc <pvc>

存储驱动程序支持

然而,并非所有卷类型都默认可以扩展。某些卷类型,例如树内(in-tree)的 hostpath 卷,是完全无法扩展的。对于 CSI 卷,CSI 驱动程序必须在控制器或节点服务中(如果适用,则两者都)具备 EXPAND_VOLUME 能力。请查阅你的 CSI 驱动程序的文档,以了解其是否支持卷扩展。

请参考卷扩展文档,了解支持卷扩展的树内卷类型 - 扩展持久卷

通常,为了对可扩展的卷提供一定程度的控制,只有那些动态供应的、其存储类的 allowVolumeExpansion 参数设置为 true 的 PVC 才是可扩展的。

Kubernetes 集群管理员必须编辑相应的 StorageClass 对象,并将 allowVolumeExpansion 字段设置为 true。例如:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: gp2-default
provisioner: kubernetes.io/aws-ebs
parameters:
  secretNamespace: ""
  secretName: ""
allowVolumeExpansion: true

在线扩展与离线扩展的比较

默认情况下,Kubernetes 会在用户请求调整大小后立即尝试扩展卷。如果有一个或多个 Pod 正在使用该卷,Kubernetes 会尝试使用在线调整大小来扩展卷;因此,卷扩展通常不需要应用程序停机。节点上的文件系统扩展也是在线执行的,因此不需要关闭任何正在使用该 PVC 的 Pod。

如果你扩展一个未被使用的 PersistentVolume,Kubernetes 会执行离线调整大小(而且,因为该卷未被使用,同样不会对工作负载造成干扰)。

不过,在某些情况下——如果底层的存储驱动程序仅支持离线扩展,那么使用该 PVC 的用户必须先关闭他们的 Pod,扩展才能成功。请查阅你的存储提供商的文档,了解其支持哪种模式的卷扩展。

当卷扩展作为 Alpha 功能引入时,Kubernetes 仅支持在节点上进行离线文件系统扩展,因此要求用户重启他们的 Pod 以完成文件系统调整大小。此行为已经改变,现在 Kubernetes 会尽力满足任何调整大小的请求,无论底层的 PersistentVolume 卷是在线还是离线。如果你的存储提供商支持在线扩展,那么完成卷扩展就不需要重启任何 Pod。

后续步骤

尽管卷扩展作为最近 v1.24 版本的一部分现已稳定,但 SIG Storage 正在努力让 Kubernetes 用户扩展其持久存储变得更加简单。Kubernetes 1.23 引入了从失败的卷扩展中触发恢复的功能,允许用户在调整大小失败后尝试自助修复。更多详情请参见从卷扩展失败中恢复

Kubernetes 贡献者社区也在讨论由 StatefulSet 驱动的存储扩展的可能性。这个提议的功能将允许你通过直接编辑 StatefulSet 对象,为所有为该 StatefulSet 提供存储的底层 PV 触发扩展。更多详情请参见通过 StatefulSet 支持卷扩展的增强提案。