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 ボリュームのサイズを 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_NAME と LOCATION をメモしておきます。

  3. Managed Lustre インスタンスの説明を取得して、パフォーマンス階層のプロパティを確認します。

    gcloud lustre instances describe INSTANCE_NAME --location=LOCATION
    

    INSTANCE_NAME と LOCATION は、前のステップの値に置き換えます。

    出力で perUnitStorageThroughput フィールドを探します。この値は、TiB あたりの MBps 単位のパフォーマンス ティアを示します。

容量の上限とステップサイズ

パフォーマンス ティアを特定したら、次の表を参照して、関連する容量の上限と必要なステップサイズを確認します。

階層(perUnitStorageThroughput) 最小容量 最大容量 ステップサイズ
1,000 MBps/TiB 9,000 GiB 954,000 GiB(約 1 PiB) 9,000 GiB
1 TiB あたり 500 MBps 18,000 GiB 1,908,000 GiB(約 2 PiB) 18,000 GiB
1 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 分かかることがあります。基盤となる拡張オペレーションが進行中であっても、Google Cloud Managed Lustre API のレスポンスを待機している間に csi-external-resizer コンポーネントがタイムアウトすることがあります。

解決策

  • csi-external-resizer は、バックオフ期間後にオペレーションを自動的に再試行します。PVC イベントをモニタリングして、VolumeResizeSuccessful イベントを確認します。
  • 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 管理者にお問い合わせください。

クリーンアップ

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

kubectl delete pvc PVC_NAME

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

次のステップ