使用卷扩展


在 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 访问模式时,您无法使用卷扩展。

使用卷扩展

如需使用卷扩展,请执行以下任务:

  1. 如果您的 StorageClass 尚未提供该字段,请向您的 StorageClass 添加 allowVolumeExpansion: true。例如:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: standard
    provisioner: my.driver
    ...
    allowVolumeExpansion: true
    
  2. 通过修改 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
    
  3. 通过查看 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 正常运行。

  1. 将现有 StatefulSet 保存到文件中:

    kubectl get StatefulSet statefulset-name -o yaml > sts-backup.yaml
    
  2. 从集群中移除 StatefulSet 对象,同时让 Pod 以独立 Pod 的形式保持运行:

    kubectl delete sts statefulset-name --cascade=orphan
    
  3. 在本地保存的 sts-backup.yaml 文件中修改新的卷存储空间大小,特别是 spec.volumeClaimTemplates.spec.resources.requests.storage 的值

  4. 在集群中重新创建 StatefulSet:

    kubectl apply -f sts-backup.yaml
    

后续步骤