在 Google Kubernetes Engine (GKE) 1.24 版或更高版本中,您可以在创建永久性卷后使用 Kubernetes 卷扩展功能更改其容量。
如需详细了解卷扩展,请参阅开源 Kubernetes 文档。
前提条件
必须符合下列前提条件才能扩展卷:
- 如果您要调整其大小的卷由 CSI 驱动程序管理:
- 确保 GKE 集群版本为 1.16 或更高版本。 如果集群具有 Windows 节点池,请确保 GKE 集群版本为 1.18 或更高版本。如果您是使用代管式 GKE Filestore CSI 驱动程序,则集群版本必须为 1.21 或更高版本。
- 请检查您的存储供应商的文档,以验证您的 CSI 驱动程序是否支持卷扩展。Compute Engine 永久性磁盘 CSI 驱动程序和 Filestore CSI 驱动程序支持卷扩展。
- 如果您要调整其大小的卷由树内卷插件管理:
- 确保 GKE 集群版本为 1.11 或更高。虽然 GKE 集群版本 1.11-1.14 支持扩展由树内插件管理的卷,但要求终结并重新创建使用该卷的所有 Pod 才能完成卷扩展。
- 请检查您的存储供应商的文档,以验证您的树内卷插件是否支持卷扩展(Compute Engine 永久性磁盘内嵌插件支持)。
- 使用
ReadOnlyMany
访问模式时,您无法使用卷扩展。
使用卷扩展
如需使用卷扩展,请执行以下任务:
如果您的 StorageClass 尚未提供该字段,请向您的 StorageClass 添加
allowVolumeExpansion: true
。例如:apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: standard provisioner: my.driver ... allowVolumeExpansion: true
通过修改 PersistentVolumeClaim 的
spec.resources.requests.storage
字段来请求更改卷容量。kubectl edit pvc pvc-name
例如,您可以将以下 PVC 从拥有 30 吉比字节 (GiB) 的磁盘更改为拥有 40 GiB 的磁盘。
修改前
# pvc-demo.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-demo spec: accessModes: - ReadWriteOnce resources: requests: storage: 30Gi
修改后
# pvc-demo.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-demo spec: accessModes: - ReadWriteOnce resources: requests: storage: 40Gi
通过查看 PVC 验证此更改。如需查看 PVC,请运行以下命令:
kubectl get pvc pvc-name -o yaml
最终,您应该会在
status.capacity
字段中看到新卷。例如:... spec: accessModes: - ReadWriteOnce resources: requests: storage: 40Gi storageClassName: standard volumeMode: Filesystem volumeName: pvc-078b7484-cc8d-4077-9bcb-2c17d8d4550c status: accessModes: - ReadWriteOnce capacity: storage: 40Gi ...
如果直接修改 PersistentVolume 的容量,可能会导致容器文件系统不正确。如需解决这些问题,请参阅排查卷扩展更改问题。
管理 StatefulSet 中的卷扩展
如果您需要增加 Kubernetes 的 StatefulSet 中的 Pod 使用的卷的大小,则应调整与 Pod 关联的 PersistentVolumeClaim (PVC) 的 spec.resources.requests.storage
字段。如果尝试直接在 StatefulSet 对象中修改 volumeClaimTemplates
字段,将会导致错误。
此外,如果您增加 StatefulSet 的副本数,它仍会创建原始大小的 PVC。如需永久更改为 StatefulSet 管理的 Pod 预配的卷的大小,您必须删除 StatefulSet 对象,再重新创建,并在 volumeClaimTemplates
字段中指定更新后的大小。请注意,此过程将导致旧 Pod 及其对应的 PVC 被删除。底层存储空间也可能会被删除,视 ReclaimPolicy
而定。
您可以执行以下步骤,以便在调整 StatefulSet 以使用新卷大小预配未来副本的同时,保持原始 Pod 正常运行。
将现有 StatefulSet 保存到文件中:
kubectl get StatefulSet statefulset-name -o yaml > sts-backup.yaml
从集群中移除 StatefulSet 对象,同时让 Pod 以独立 Pod 的形式保持运行:
kubectl delete sts statefulset-name --cascade=orphan
在本地保存的
sts-backup.yaml
文件中修改新的卷存储空间大小,特别是spec.volumeClaimTemplates.spec.resources.requests.storage
的值在集群中重新创建 StatefulSet:
kubectl apply -f sts-backup.yaml
后续步骤
- 详细了解卷。
- 详细了解如何使用 Kubernetes 调整永久性卷的大小。