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

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 开始扩展卷时 - 它会将 Resizing 条件添加到 PVC,一旦扩展完成,该条件将被删除。还可以通过监视与 PVC 相关的事件来获取有关扩展操作进度的更多信息

kubectl describe pvc <pvc>

存储驱动程序支持

并非所有卷类型默认情况下都是可扩展的。某些卷类型(例如 intree hostpath 卷)根本不可扩展。对于 CSI 卷,CSI 驱动程序必须在控制器或节点服务(或两者,如果适用)中具有 EXPAND_VOLUME 功能。请参阅您的 CSI 驱动程序的文档,以了解它是否支持卷扩展。

请参阅支持卷扩展的 intree 卷类型的卷扩展文档 - 扩展持久卷

通常,为了对可以扩展的卷提供一定程度的控制,只有将存储类的 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 的扩展。有关更多详细信息,请参阅通过 StatefulSets 支持卷扩展增强提案。