使用磁碟區擴充功能


在 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 尚未擁有該欄位,請將 allowVolumeExpansion: true 新增至 StorageClass。例如:

    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 gibibyte (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
    

後續步驟