GKE で Managed Lustre ストレージをスケーリングする

このドキュメントでは、アプリケーションを中断することなく、Google Kubernetes Engine(GKE)でステートフル ワークロードの Managed Lustre ボリュームのストレージ容量を動的に増やす方法について説明します。

たとえば、実行時間の長い AI/ML トレーニング ジョブのストレージ要件が動的で予測できない場合は、Managed Lustre ボリュームの拡張を有効にして、既存の Managed Lustre PersistentVolume(PV)のストレージ容量を増やします。

このドキュメントは、GKE でステートフル ワークロードのストレージを管理するプラットフォーム管理者とオペレーター、DevOps、ストレージ管理者、機械学習(ML)エンジニアを対象としています。

ボリュームを拡張すると、標準の Cloud de Confiance by S3NS Managed Lustre の料金に基づいて、新しい大容量の容量に応じて費用が増加します。

始める前に

環境を準備する

要件

次の要件を満たしていることを確認してください。

  • GKE クラスタ バージョン 1.35.0-gke.2331000 以降が必要です。
  • 既存のクラスタで Managed Lustre CSI ドライバを有効にする必要があります。ドライバは、Standard クラスタと Autopilot クラスタの両方でデフォルトで無効になっています。

制限事項

  • 既存のボリュームのサイズを増やすことはできますが、縮小はできません。
  • ReadOnlyMany アクセスモードでは、ボリューム拡張を使用できません。
  • Lustre ボリュームのサイズを変更する場合は、ボリュームのパフォーマンス ティアで設定された最小容量と最大容量の上限、ステップサイズに従ってください。詳しくは、パフォーマンスに関する考慮事項をご覧ください。
  • Lustre ボリュームのサイズは、1,000 の倍数として GiB で指定します。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 の名前に置き換えます。

    出力は次のようになります。VOLUME 列のPV 名(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 MBps 9,000 GiB 954,000 GiB(約 1 PiB) 9,000 GiB
TiB あたり 500 MBps 18,000 GiB 1,908,000 GiB(約 2 PiB) 18,000 GiB
TiB あたり 250 MBps 36,000 GiB 3,816,000 GiB(約 4 PiB) 36,000 GiB
TiB あたり 125 MBps 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 ボリュームを拡張する際に発生する可能性のある一般的な問題の解決策について説明します。

「Invalid Argument」エラーで拡張が失敗する

症状

  • PVC が Resizing 状態になりますが、失敗します。
  • kubectl describe pvc PVC_NAME コマンドを実行すると、VolumeResizeFailed: rpc error: code = InvalidArgument desc = ... のようなエラーが表示されます。

原因

通常、このエラーは、次のいずれかの理由で、リクエストされたストレージ サイズが Lustre ボリュームのパフォーマンス ティアに対して有効でないことを意味します。

  • リクエストされたサイズが、階層に必要なステップサイズの倍数ではありません。
  • リクエストされたサイズが、階層の最小容量または最大容量を超えています。

解決策

  1. 容量の上限とステップサイズを確認して、ボリュームのパフォーマンス ティアの有効なステップサイズと容量の上限を確認します。
  2. PVC を再度編集して、ステップサイズと容量の上限を満たす有効なストレージ サイズをリクエストします。

「Internal Error」で拡張が失敗する

症状

  • PVC のサイズ変更が失敗します。
  • kubectl describe pvc PVC_NAME コマンドを実行すると、code = Internal を含むエラー メッセージで VolumeResizeFailed イベントが表示されることがあります。

原因

このエラーは、基盤となる Managed Lustre サービスに問題があることを示しています。

解決策

  1. 新しいリクエスト サイズで PVC マニフェストを再度適用して、拡張を再試行します。これにより、一時的なバックエンドの問題が解決する可能性があります。
  2. 再試行に失敗した場合は、Cloud カスタマーケアにお問い合わせください

拡張が「Resizing」状態のままになる

症状

  • PVC が Resizing 状態のまま長時間経過します(小規模な拡張の場合は 30 分以上、大規模な拡張の場合は 90 分以上)。
  • DEADLINE_EXCEEDED エラー メッセージで VolumeResizeFailed イベントが表示されることがあります。

原因

この問題は、容量を大幅に増やす場合に発生する可能性があり、完了までに最大 90 分かかることがあります。基盤となる拡張オペレーションが進行中でも、Google Cloud Managed Lustre API の応答を待機している間に csi-external-resizer コンポーネントがタイムアウトする可能性があります。

解決策

  • csi-external-resizer は、バックオフ期間後にオペレーションを自動的に再試行します。VolumeResizeSuccessful イベントについて、PVC イベントのモニタリングを続けます。
  • PVC が 90 分以上 Resizing 状態のままの場合は、Cloud カスタマーケアにお問い合わせください。

拡張が開始されない、または 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 カスタマーケアにお問い合わせください。

割り当てまたは容量の問題で拡張が失敗する

症状

  • PVC のサイズ変更が失敗し、PVC に VolumeResizeFailed イベントが表示されます。
  • kubectl describe pvc PVC_NAME コマンドを実行すると、Managed Lustre バックエンドからのイベント メッセージに割り当てまたは容量の問題が示されます。

原因

リクエストされた有効な拡張は、プロジェクトまたはリージョンの Managed Lustre サービスで使用可能な全体的な容量または割り当てを超えているため、実行できません。

解決策

  • PVC を再度編集して、ストレージの増加を小さくリクエストします。
  • 組織の管理者に連絡して、プロジェクトの Lustre サービス全体の割り当てまたは容量の増加をリクエストします。 Cloud de Confiance by S3NS

クリーンアップ

このドキュメントで使用したリソースについてアカウントに課金されないようにするには、PVC を削除します。 Cloud de Confiance by S3NS このオペレーションでは、reclaimPolicyDelete に設定されている場合、関連付けられている PV と基盤となる Managed Lustre インスタンスも削除されます。

kubectl delete pvc PVC_NAME

PVC_NAME は PVC の名前に置き換えます。

次のステップ