在 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
字段中指定更新后的大小。
您可以执行以下步骤,以便在调整 StatefulSet 以使用新卷大小预配未来副本的同时,保持原始 Pod 正常运行。
将现有 StatefulSet 保存到文件中:
kubectl get StatefulSet
statefulset-name -o yaml > sts-backup.yaml对于 StatefulSet 中的每个 PersistentVolumeClaim,请在文本编辑器中打开
PersistentVolumeClaim
对象:kubectl edit pvc
PVC_NAME 将
spec.resources.requests.storage
字段更新为新的卷大小,如以下示例所示:apiVersion: v1 kind: PersistentVolumeClaim metadata: # lines omitted for clarity spec: resources: requests: storage: 14Gi # lines omitted for clarity
如需了解详情,请参阅扩展永久性卷声明。
保存修改并关闭文本编辑器。等待 Kubernetes 使用您的更改更新 PersistentVolumeClaim。
从集群中移除 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 调整永久性卷的大小。