本文档介绍了如何在 Google Kubernetes Engine (GKE) 中动态增加有状态工作负载的托管 Lustre 卷的存储容量,而不会中断应用。
例如,如果长时间运行的 AI/ML 训练作业具有动态且不可预测的存储需求,您可以启用 Managed Lustre 卷扩展功能,以增加现有 Managed Lustre PersistentVolume (PV) 的存储容量。
本文档适用于以下人员:管理 GKE 上有状态工作负载的存储空间的平台管理员和运维人员、DevOps、存储管理员,以及机器学习 (ML) 工程师。
扩展卷后,您的费用会根据新的更大容量而增加,具体费用请参阅标准 Google Cloud Managed Lustre 价格。
准备工作
准备环境。
要求
请确保您符合以下要求:
- 您必须拥有 GKE 集群版本 1.35.0-gke.2331000 或更高版本。
- 您必须在现有集群上启用 Managed Lustre CSI 驱动程序。在 Standard 集群和 Autopilot 集群中,该驱动程序默认处于停用状态。
限制
- 您只能增加现有卷的大小,而不能减小其大小。
- 您无法将卷扩展与
ReadOnlyMany访问模式搭配使用。 - 调整 Lustre 卷的大小时,请遵循卷的性能层级设置的最小和最大容量限制以及步长。如需了解详情,请参阅性能考虑因素。
- 以 1000 的倍数指定 Lustre 卷大小(以 GiB 为单位)。Kubernetes 会将 Ti 等单位转换为二进制值(例如,18 Ti 会被解读为 18,432 GiB),这会导致 Lustre API 拒绝该请求。
为 StorageClass 启用卷扩容
验证您的 StorageClass 是否支持卷扩展:
kubectl get sc STORAGECLASS_NAME -o jsonpath='{.allowVolumeExpansion}{"\n"}'将
STORAGECLASS_NAME替换为您的 StorageClass 的名称。如果该命令未输出任何内容或返回
false,您必须明确更新 StorageClass 配置以允许扩展。打开 StorageClass 配置进行修改:
kubectl edit storageclass STORAGECLASS_NAME在编辑器中,将
allowVolumeExpansion: true字段添加到您的 StorageClass 配置中:apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: lustre-sc provisioner: lustre.csi.storage.gke.io ... allowVolumeExpansion: true
扩展 PersistentVolumeClaim
如需启动卷扩展,请修改 PersistentVolumeClaim (PVC) 以请求增加卷大小。
- 确定新的有效扩展尺寸,如确定有效的扩展尺寸中所述。
打开 PVC 配置进行修改:
kubectl edit pvc PVC_NAME将
PVC_NAME替换为您的 PVC 名称。在编辑器中,使用有效的扩展大小更新
spec.resources.requests.storage字段。例如,如需将卷从9000Gi扩展到18000Gi,请按如下方式修改storage字段:spec: accessModes: - ReadWriteOnce resources: requests: storage: 18000Gi # Changed from 9000Gi
验证卷扩展
通过查看 PVC 的事件来监控扩容进度:
kubectl describe pvc PVC_NAMEPVC 输出中的以下事件表示卷扩展请求的当前进度或结果:
ExternalExpanding:表示 Kubernetes 正在等待external-resizer扩展 PVC。Resizing:表示调整大小操作正在进行中。如果容量增加幅度较大,此操作最多可能需要 90 分钟。VolumeResizeSuccessful:确认卷已成功扩容。VolumeResizeFailed:表示发生了错误。事件消息包含来自 Google Cloud Managed Lustre API 的详细信息。此状态可能是暂时性的,可能会自行解决。
扩容完成后,验证 PVC 的更新配置:
kubectl get pvc PVC_NAME -o yaml确保
status.capacity字段反映了新的增量大小。
如果您在扩展过程中遇到任何问题,请参阅问题排查。
确定有效的展开尺寸
如需确定新卷大小,请先确定卷的性能层级及其对应的步长。
确定卷的性能层级
您可以使用以下任一方法查找卷的性能层级:
StorageClass
运行以下命令,然后查找 perUnitStorageThroughput 值(例如 1000)。此值表示每个 TiB 的性能层级(以 MBps 为单位)。
kubectl get sc STORAGECLASS_NAME -o yaml
将 STORAGECLASS_NAME 替换为您的 StorageClass 的名称。
Lustre 实例
通过直接检查底层受管理的 Lustre 实例的属性,确定卷的性能层级:
查找与您的 PVC 绑定的 PV 的名称:
kubectl get pvc PVC_NAME将
PVC_NAME替换为您的 PVC 名称。输出类似于以下内容:记下
VOLUME列中的 PV 名称,例如pv-lustre。NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE pvc-lustre Bound pv-lustre 9000Gi RWX lustre-rwx <unset> 26m在
volumeHandle字段中查找卷的位置和实例名称:kubectl get pv PV_NAME -o yaml将
PV_NAME替换为上一步中的 PV 名称。volumeHandle值的格式为PROJECT_ID/LOCATION/INSTANCE_NAME。记下INSTANCE_NAME和LOCATION以备下一步使用。通过描述受管理的 Lustre 实例来检查性能层属性:
gcloud lustre instances describe INSTANCE_NAME --location=LOCATION将
INSTANCE_NAME和LOCATION替换为上一步中的值。在输出中,查找
perUnitStorageThroughput字段。此值表示性能层级(以 MBps/TiB 为单位)。
容量限制和步长
确定性能层级后,请参阅下表,了解相关联的容量限制和所需的步长。
层级 (perUnitStorageThroughput) |
最小容量 | 最大容量 | 步长 |
|---|---|---|---|
| 1,000 MBps/TiB | 9,000 GiB | 954,000 GiB(约 1 PiB) | 9,000 GiB |
| 500 MBps/TiB | 18,000 GiB | 1,908,000 GiB(约 2 PiB) | 18,000 GiB |
| 250 MBps/TiB | 36,000 GiB | 3,816,000 GiB (~4 PiB) | 36,000 GiB |
| 125 MBps/TiB | 72,000 GiB | 7,632,000 GiB(约 8 PiB) | 72,000 GiB |
必须根据分配给相应层级的步长来增加销量。容量的任何增加都必须是相应步长的倍数。 例如,如果您的 1,000 MBps 层级卷的容量为 9,000 GiB,您可以将其增加到 18,000 GiB、27,000 GiB 和其他倍数。
问题排查
本部分提供了在扩展 Lustre 卷时可能会遇到的常见问题的解决方案。
扩展失败,并显示“无效参数”错误
症状
- PVC 进入
Resizing状态,但随后失败。 - 运行
kubectl describe pvc PVC_NAME命令时,您会看到类似于VolumeResizeFailed: rpc error: code = InvalidArgument desc = ...的错误。
原因
此错误通常表示所请求的存储空间大小对于 Lustre 卷的性能层无效,原因如下:
- 所请求的大小不是相应层级的必需步长的倍数。
- 所请求的大小低于相应层级的最小容量或高于最大容量。
解决方法
- 请查看容量限制和步长,了解卷的性能层级的有效步长和容量限制。
- 再次修改 PVC,以请求符合步长和容量限制的有效存储空间大小。
扩展失败,并显示“内部错误”
症状
- PVC 调整大小失败。
- 运行
kubectl describe pvc PVC_NAME命令时,您可能会看到VolumeResizeFailed事件,其中包含code = Internal错误消息。
原因
此错误表示底层托管式 Lustre 服务存在问题。
解决方法
- 使用新的请求大小再次应用 PVC 清单,重试扩容。这或许可以解决暂时性后端问题。
- 如果重试失败,请与 Cloud Customer Care 联系。
扩展卡在“调整大小”状态
症状
- PVC 长时间(对于较小的扩容,超过 30 分钟;对于较大的扩容,超过 90 分钟)保持
Resizing状态。 - 您可能会看到
VolumeResizeFailed事件,其中包含DEADLINE_EXCEEDED错误消息。
原因
如果容量增加幅度较大,就可能会出现此问题,并且可能需要长达 90 分钟才能完成。csi-external-resizer 组件在等待 Google Cloud Managed Lustre API 响应时可能会超时,即使底层扩展操作仍在进行中。
解决方法
csi-external-resizer会在退避时间段过后自动重试操作。继续监控 PVC 事件,查找VolumeResizeSuccessful事件。- 如果 PVC 处于
Resizing状态的时间超过 90 分钟,请与 Cloud Customer Care 联系。
扩展未开始,或卡在 ExternalExpanding 状态
症状
- 您更新了 PVC 中的
spec.resources.requests.storage字段,但 PVC 状态未更改为Resizing。 - 运行
kubectl describe pvc PVC_NAME命令时,事件日志仅显示ExternalExpanding状态,不会进入Resizing状态:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ExternalExpanding 21m (x2 over 58m) volume_expand waiting for an external controller to expand this PVC
原因
此行为通常表示存在以下问题之一:
- 与 PVC 关联的 StorageClass 不允许卷扩展。
csi-external-resizer边车容器存在问题,该容器是负责启动扩展的组件。
解决方法
检查 StorageClass 配置,并验证
allowVolumeExpansion: true字段是否已设置:kubectl get sc STORAGECLASS_NAME -o jsonpath='{.allowVolumeExpansion}{"\n"}'如果缺少
allowVolumeExpansion或将其设置为false,请更新 StorageClass 以允许卷扩展。如果 StorageClass 配置正确,则问题可能出在管理调整大小操作的 GKE 控制平面组件上。请与 Cloud Customer Care 联系以寻求帮助。
因配额或容量问题而导致扩展失败
症状
- PVC 调整大小失败,并且 PVC 上显示
VolumeResizeFailed事件。 - 运行
kubectl describe pvc PVC_NAME命令时,来自受管 Lustre 后端的事件消息表明存在配额或容量问题。
原因
由于所请求的有效扩展超出了您的项目或区域中适用于受管 Lustre 服务的总容量或配额,因此无法满足该请求。
解决方法
- 再次修改 PVC,并请求增加较小的存储空间。
- 请与您组织的 Google Cloud 管理员联系,申请增加项目的整体 Lustre 服务配额或容量。
清理
为避免因本文档中使用的资源导致您的 Google Cloud 账号产生费用,请删除 PVC。如果 reclaimPolicy 设置为 Delete,此操作还会删除关联的 PV 和底层 Managed Lustre 实例。
kubectl delete pvc PVC_NAME
将 PVC_NAME 替换为您的 PVC 名称。
后续步骤
- 详细了解用于 GKE 集群的存储。
- 阅读有关 GKE 永久性卷和预配的文档。