使用卷扩展


在 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 字段中指定更新后的大小。

您可以执行以下步骤,以便在调整 StatefulSet 以使用新卷大小预配未来副本的同时,保持原始 Pod 正常运行。

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

    kubectl get StatefulSet statefulset-name -o yaml > sts-backup.yaml
    
  2. 对于 StatefulSet 中的每个 PersistentVolumeClaim,请在文本编辑器中打开 PersistentVolumeClaim 对象:

    kubectl edit pvc PVC_NAME
    
  3. spec.resources.requests.storage 字段更新为新的卷大小,如以下示例所示:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
    # lines omitted for clarity
    spec:
      resources:
        requests:
          storage: 14Gi
    # lines omitted for clarity
    

    如需了解详情,请参阅扩展永久性卷声明

  4. 保存修改并关闭文本编辑器。等待 Kubernetes 使用您的更改更新 PersistentVolumeClaim。

  5. 从集群中移除 StatefulSet 对象,同时让 Pod 以独立 Pod 的形式保持运行:

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

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

    kubectl apply -f sts-backup.yaml
    

后续步骤