本文已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已失效。
Kubernetes 1.24:存储卷扩容现已成为稳定功能
卷扩展作为 Alpha 特性在 Kubernetes 1.8 中引入,并在 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
你可以通过指定一个新值来请求底层 PersistentVolume 的扩展,替换旧的 1Gi
大小。修改请求大小后,观察 PVC 的 status.conditions
字段以查看大小调整是否已完成。
当 Kubernetes 开始扩展卷时,它会向 PVC 添加 Resizing
条件,该条件在扩展完成后将被移除。通过监控与 PVC 相关的事件,还可以获取有关扩展操作进度的更多信息。
kubectl describe pvc <pvc>
存储驱动支持
然而,并非所有卷类型都默认可扩展。某些卷类型,例如 intree hostpath 卷,根本不可扩展。对于 CSI 卷,CSI 驱动程序必须在 controller 或 node 服务(或两者,如果适用)中具有 EXPAND_VOLUME
能力。请查阅你的 CSI 驱动程序文档,以确定它是否支持卷扩展。
请查阅支持卷扩展的 intree 卷类型的卷扩展文档 - 扩展 Persistent Volumes。
通常,为了对可扩展的卷提供一定程度的控制,只有动态 provisioned 的 PVC,其存储类设置了 allowVolumeExpansion
参数为 true
时,才可扩展。
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 支持卷扩展 增强提案。