在 GKE 上擴充 Managed Lustre 儲存空間

本文說明如何在 Google Kubernetes Engine (GKE) 中,動態增加有狀態工作負載的 Managed Lustre 磁碟區儲存空間容量,且不會中斷應用程式。

舉例來說,如果長時間執行的 AI/ML 訓練工作有動態且無法預測的儲存空間需求,請啟用 Managed Lustre 磁碟區擴充功能,增加現有 Managed Lustre PersistentVolume (PV) 的儲存空間容量。

本文適用於平台管理員和作業人員、DevOps、儲存空間管理員,以及管理 GKE 上有狀態工作負載儲存空間的機器學習 (ML) 工程師。

擴充磁碟區後,系統會根據新的較大容量,按照標準的 Google Cloud Managed Lustre 定價收取費用。

事前準備

準備環境

需求條件

請確認你符合下列規定:

  • 您必須使用 GKE 叢集 1.35.0-gke.2331000 以上版本。
  • 您必須在現有叢集上啟用 Managed Lustre CSI 驅動程式。在 Standard 和 Autopilot 叢集中,驅動程式預設為停用。

限制

  • 您只能增加現有磁碟區的大小,無法縮減大小。
  • 您無法在 ReadOnlyMany 存取模式下使用磁碟區擴充功能。
  • 調整 Lustre 磁碟區大小時,請遵守磁碟區效能層級設定的容量下限、上限和步長。詳情請參閱「效能注意事項」。
  • 以 GiB 為單位指定 Lustre 磁碟區大小,且必須是 1000 的倍數。Kubernetes 會將 Ti 等單位轉換為二進位值 (例如 18 Ti 會解讀為 18,432 GiB),導致 Lustre API 拒絕要求。

為 StorageClass 啟用磁碟區擴充功能

  1. 確認 StorageClass 是否支援擴充磁碟區:

    kubectl get sc STORAGECLASS_NAME -o jsonpath='{.allowVolumeExpansion}{"\n"}'
    

    STORAGECLASS_NAME 替換為 StorageClass 名稱。

    如果指令未輸出任何內容或傳回 false,您必須明確更新 StorageClass 設定,才能允許擴充。

  2. 開啟 StorageClass 設定進行編輯:

    kubectl edit storageclass STORAGECLASS_NAME
    
  3. 在編輯器中,將 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),要求增加磁碟區大小。

  1. 如要找出新的有效擴充大小,請參閱「判斷有效的擴充大小」。
  2. 開啟 PVC 設定進行編輯:

    kubectl edit pvc PVC_NAME
    

    PVC_NAME 替換為 PVC 名稱。

  3. 在編輯器中,使用有效的擴展大小更新 spec.resources.requests.storage 欄位。舉例來說,如要將磁碟區從 9000Gi 擴充至 18000Gi,請如下修改 storage 欄位:

    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 18000Gi # Changed from 9000Gi
    

確認磁碟區擴充作業

  1. 查看 PVC 的事件,監控擴充進度:

    kubectl describe pvc PVC_NAME
    

    PVC 輸出內容中的下列事件會指出磁碟區擴充要求的目前進度或結果:

    • ExternalExpanding:表示 Kubernetes 等待 external-resizer 擴充 PVC。
    • Resizing:表示正在進行大小調整作業。如果容量增加幅度較大,這項作業最多可能需要 90 分鐘。
    • VolumeResizeSuccessful:確認磁碟區已成功擴充。
    • VolumeResizeFailed:表示發生錯誤。事件訊息包含 Google Cloud Managed Lustre API 的詳細資料。這個狀態可能是暫時性的,可能會自行解決。
  2. 擴充作業完成後,請驗證 PVC 的更新設定:

    kubectl get pvc PVC_NAME -o yaml
    
  3. 確認 status.capacity 欄位反映了新的遞增大小。

如果在擴充過程中遇到任何問題,請參閱「疑難排解」一節。

判斷有效的擴展大小

如要判斷新的磁碟區大小,請先找出磁碟區的效能層級和對應的步階大小。

找出磁碟區的效能層級

您可以透過下列任一選項,查看磁碟區的效能層級:

StorageClass

執行下列指令,並尋找 perUnitStorageThroughput 值 (例如 1000)。這個值表示每 TiB 的 MBps 效能層級。

kubectl get sc STORAGECLASS_NAME -o yaml

STORAGECLASS_NAME 替換為 StorageClass 名稱。

Lustre 執行個體

直接檢查基礎 Managed Lustre 執行個體的屬性,找出磁碟區的效能層級:

  1. 找出繫結至 PVC 的 PV 名稱:

    kubectl get pvc PVC_NAME
    

    PVC_NAME 替換為 PVC 名稱。

    輸出結果大致如下。請注意「PV」名稱位於 VOLUME 欄中,例如 pv-lustre

    NAME         STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
    pvc-lustre   Bound    pv-lustre   9000Gi     RWX            lustre-rwx     <unset>                 26m
    
  2. volumeHandle 欄位中找出磁碟區位置和執行個體名稱:

    kubectl get pv PV_NAME -o yaml
    

    PV_NAME 替換為上一步的 PV 名稱。

    volumeHandle 值的格式為 PROJECT_ID/LOCATION/INSTANCE_NAME。請記下 INSTANCE_NAMELOCATION,以供下一個步驟使用。

  3. 說明 Managed Lustre 執行個體,即可查看效能層級屬性:

    gcloud lustre instances describe INSTANCE_NAME --location=LOCATION
    

    INSTANCE_NAMELOCATION 替換為上一步中的值。

    在輸出中,找出 perUnitStorageThroughput 欄位。這個值表示每 TiB 的效能層級 (以 MBps 為單位)。

容量限制和步長

找出效能層級後,請參閱下表,瞭解相關的容量限制和必要步長。

層級 (perUnitStorageThroughput) 容量下限 數量上限 間距大小
每 TiB 1,000 MB/秒 9,000 GiB 954,000 GiB (約 1 PiB) 9,000 GiB
每 TiB 500 MB/秒 18,000 GiB 1,908,000 GiB (約 2 PiB) 18,000 GiB
每 TiB 250 MB/秒 36,000 GiB 3,816,000 GiB (約 4 PiB) 36,000 GiB
每 TiB 125 MB/秒 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 磁碟區的效能層級,原因如下:

  • 要求的尺寸不是層級所需步長的倍數。
  • 要求的容量低於最低容量,或高於層級的最高容量。

解決方法

  1. 請參閱「容量限制和步長」,瞭解磁碟區效能層級的有效步長和容量限制。
  2. 再次編輯 PVC,要求符合步長和容量限制的有效儲存空間大小。

擴展作業失敗,並顯示「內部錯誤」

症狀

  • PVC 大小調整失敗。
  • 執行 kubectl describe pvc PVC_NAME 指令時,您可能會看到 VolumeResizeFailed 事件,以及含有 code = Internal 的錯誤訊息。

原因

這項錯誤表示基礎的 Managed Lustre 服務發生問題。

解決方法

  1. 再次套用 PVC 資訊清單,並指定新的要求大小,即可重新嘗試擴充。這或許能解決暫時性的後端問題。
  2. 如果重試失敗,請與 Cloud Customer Care 團隊聯絡

擴充作業卡在「正在調整大小」狀態

症狀

  • PVC 長時間處於 Resizing 狀態 (擴充較小的 PVC 超過 30 分鐘,擴充較大的 PVC 超過 90 分鐘)。
  • 您可能會看到 VolumeResizeFailed 事件,並顯示 DEADLINE_EXCEEDED 錯誤訊息。

原因

如果容量大幅增加,就可能發生這個問題,最多可能需要 90 分鐘才能完成。即使基礎擴充作業仍在進行中,csi-external-resizer 元件也可能會在等待 Google Cloud Managed Lustre API 回應時逾時。

解決方法

  • csi-external-resizer 會在退避期間過後自動重試作業。繼續監控 VolumeResizeSuccessful 事件的 PVC 事件。
  • 如果 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 側車容器發生問題,這個元件負責啟動擴充作業。

解決方法

  1. 檢查 StorageClass 設定,並確認已設定 allowVolumeExpansion: true 欄位:

    kubectl get sc STORAGECLASS_NAME -o jsonpath='{.allowVolumeExpansion}{"\n"}'
    
  2. 如果缺少 allowVolumeExpansion 或設為 false,請更新 StorageClass,允許擴充磁碟區。

  3. 如果 StorageClass 設定正確,問題可能出在管理大小調整作業的 GKE 控制層元件。如需協助,請與 Cloud Customer Care 團隊聯絡。

因配額或容量問題而無法擴充

症狀

  • PVC 大小調整失敗,且 PVC 上會顯示 VolumeResizeFailed 事件。
  • 執行 kubectl describe pvc PVC_NAME 指令時,受管理 Lustre 後端的事件訊息會指出配額或容量問題。

原因

要求的有效擴充作業超出專案或區域中 Managed Lustre 服務的整體容量或可用配額,因此無法完成。

解決方法

  • 再次編輯 PVC,並要求增加較少的儲存空間。
  • 請與貴機構的 Google Cloud 管理員聯絡,要求提高專案的整體 Lustre 服務配額或容量。

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取本文件所用資源的費用,請刪除 PVC。如果 reclaimPolicy 設為 Delete,這項作業也會刪除相關聯的 PV 和底層的 Managed Lustre 執行個體。

kubectl delete pvc PVC_NAME

PVC_NAME 替換為 PVC 名稱。

後續步驟