作者:Hemant Kumar(红帽)
卷扩展(Volume expansion)是在 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>
但是,默认情况下,并非每种卷类型都是可扩展的。有些卷类型(如 intree hostpath 卷)根本不可扩展。对于 CSI 卷——CSI 驱动程序必须在控制器或节点服务(如果适用,也可以在两者)中具有 EXPAND_VOLUME 功能。请参考 CSI 驱动程序的文档,以了解它是否支持卷扩展。
请参考卷扩展文档,了解支持卷扩展的 intree 卷类型——Expanding Persistent Volumes[1]。
通常,为了对可扩展的卷提供某种程度的控制,只有存储类 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 即可完成卷扩展。
尽管卷扩展作为最近 1.24 版本的一部分现在已经稳定,但 SIG Storage 正在努力使 Kubernetes 的用户更容易扩展他们的持久存储。Kubernetes 1.23 引入了从失败的卷扩展中触发恢复的功能,允许用户在调整失败后尝试自助修复。有关详细信息,请参见从卷扩展故障中恢复[2]。
Kubernetes 贡献者社区也在讨论 StatefulSet 驱动的存储扩展的潜力。这个提议的特性将允许你通过直接编辑 StatefulSet 对象来触发为 StatefulSet 提供存储的所有底层 PV 的扩展。有关更多详细信息,请参见Support Volume Expansion Through StatefulSets[3]增强提案。
[1]
Expanding Persistent Volumes: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#expanding-persistent-volumes-claims
[2]
从卷扩展故障中恢复: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#recovering-from-failure-when-expanding-volumes
[3]
Support Volume Expansion Through StatefulSets: https://github.com/kubernetes/enhancements/issues/661
CNCF (Cloud Native Computing Foundation)成立于2015年12月,隶属于Linux Foundation,是非营利性组织。
CNCF(云原生计算基金会)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。