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

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

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

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

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

始める前に

環境を準備する

要件

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

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

制限事項

  • 既存のボリュームのサイズを増やすことはできますが、縮小することはできません。
  • ReadOnlyMany アクセスモードでは、ボリューム拡張は使用できません。
  • Lustre ボリュームのサイズを変更する場合は、ボリュームのパフォーマンス ティアで設定された最小容量と最大容量の上限、およびステップサイズに従ってください。詳細については、パフォーマンスに関する考慮事項をご覧ください。
  • Lustre ボリュームのサイズを GiB 単位で 1,000 の倍数で指定します。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. エディタで、StorageClass 構成に allowVolumeExpansion: true フィールドを追加します。

    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
1 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 ボリュームの拡張時に発生する可能性のある一般的な問題の解決策について説明します。

「無効な引数」エラーで拡張が失敗する

症状

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

原因

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

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

解決策

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

「内部エラー」で拡張が失敗する

症状

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

原因

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

解決策

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

拡張が「サイズ変更中」の状態で停止する

症状

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

原因

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

解決策

  • 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 を再度編集し、ストレージの増量を減らしてリクエストします。
  • 組織の Google Cloud 管理者にお問い合わせのうえ、プロジェクトの Lustre サービスの割り当てまたは容量の全体的な増加をリクエストしてください。

クリーンアップ

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

kubectl delete pvc PVC_NAME

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

次のステップ