Managed Lustre CSI ドライバを使用して GKE の Managed Lustre インスタンスにアクセスする

このガイドでは、動的プロビジョニングを使用して、GKE で Managed Lustre CSI ドライバを基盤とする新しい Kubernetes Volume を作成する方法について説明します。Managed Lustre CSI ドライバを使用すると、Managed Lustre インスタンスを基盤とするストレージをオンデマンドで作成し、ステートフル ワークロードのボリュームとしてアクセスできます。

高パフォーマンス ネットワーキングのマルチ NIC サポート

バージョン 1.35.2-gke.1842000 以降を実行する GKE クラスタの場合、Managed Lustre CSI ドライバはデフォルトで有効になっており、使用可能なすべてのネットワーク インターフェース カード(NIC)を使用してスループットを向上させます。このサポートでは、TCP ストレージ トラフィックをネットワーク インターフェースに分散することで、帯域幅を集約します。

マルチ NIC サポートを使用するには、ノードが次の要件を満たしている必要があります。

  • TCP 用の標準 NIC: ノードは、Google Virtual NIC(gVNIC)や VirtIO-Net などの標準 NIC を使用して、TCP ストレージ トラフィックを処理する必要があります。
  • 同じ VPC: すべての標準 NIC は同じ VPC ネットワーク内に存在する必要があります。
  • RDMA に関する考慮事項: ノードに RDMA NIC を接続することもできますが、Managed Lustre CSI ドライバは TCP ストレージ トラフィックに標準 NIC のみを使用します。

マルチ NIC のサポートを無効にする場合は、Lustre のマルチ NIC を無効にするをご覧ください。

Lustre 通信ポート

GKE Managed Lustre CSI ドライバは、GKE クラスタのバージョンと既存の Managed Lustre 構成に応じて、Managed Lustre インスタンスとの通信に異なるポートを使用します。

  • デフォルト ポート(推奨): バージョン 1.33.2-gke.4780000 以降を実行する新しい GKE クラスタの場合、ドライバはデフォルトで Lustre 通信にポート 988 を使用します。

  • 以前のポート(非推奨): 次のシナリオでは、gcloud コマンドに --enable-legacy-lustre-port フラグを追加して、ポート 6988 を使用します。

    • 以前の GKE バージョン: GKE クラスタで 1.33.2-gke.4780000 より前のバージョンが実行されている場合、--enable-legacy-lustre-port フラグにより、GKE ノードの gke-metadata-server とのポート競合を回避します。
    • 既存の Lustre インスタンス: gke-support-enabled フラグを使用して作成された既存の Managed Lustre インスタンスに接続する場合は、クラスタ バージョンに関係なく、gcloud コマンドに --enable-legacy-lustre-port を含める必要があります。このフラグがないと、GKE クラスタは既存の Lustre インスタンスをマウントできません。

新しいクラスタと既存のクラスタは、デフォルトのポート 988 または以前のポート 6988 を使用するように構成できます。

始める前に

作業を始める前に、次のタスクが完了していることを確認してください。

  • Google Cloud Managed Lustre API と Google Kubernetes Engine API を有効にします。
  • API を有効にする
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。gcloud CLI をインストール済みの場合は、gcloud components update コマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。

環境変数を設定する

次の環境変数を設定します。

export CLUSTER_NAME=CLUSTER_NAME
export PROJECT_ID=PROJECT_ID
export NETWORK_NAME=LUSTRE_NETWORK
export IP_RANGE_NAME=LUSTRE_IP_RANGE
export FIREWALL_RULE_NAME=LUSTRE_FIREWALL_RULE
export LOCATION=ZONE
export CLUSTER_VERSION=CLUSTER_VERSION

次のように置き換えます。

  • CLUSTER_NAME: クラスタの名前。
  • PROJECT_ID: 実際の Google Cloud プロジェクト ID
  • LUSTRE_NETWORK: GKE クラスタと Managed Lustre インスタンスの両方が存在する共有 Virtual Private Cloud(VPC)ネットワーク。
  • LUSTRE_IP_RANGE: Managed Lustre との VPC ネットワーク ピアリング用に作成された IP アドレス範囲の名前。
  • LUSTRE_FIREWALL_RULE: IP アドレス範囲からの TCP トラフィックを許可するファイアウォール ルールの名前。
  • ZONE: GKE クラスタの地理的なゾーン(例: us-central1-a)。
  • CLUSTER_VERSION: GKE クラスタのバージョン。

VPC ネットワークを設定する

Managed Lustre インスタンスと GKE クラスタを作成するときに同じ VPC ネットワークを指定する必要があります。ピアリングされた VPC ネットワークを使用する場合は、Network Connectivity Center を介して接続する必要があります。

  1. サービス ネットワーキングを有効にするには、次のコマンドを実行します。

    gcloud services enable servicenetworking.googleapis.com \
        --project=${PROJECT_ID}
    
  2. VPC ネットワークを作成します。--mtu フラグを 8896 に設定すると、パフォーマンスが 10% 向上します。

    gcloud compute networks create ${NETWORK_NAME} \
        --subnet-mode=auto --project=${PROJECT_ID} \
        --mtu=8896
    
  3. IP アドレス範囲を作成します。

    gcloud compute addresses create ${IP_RANGE_NAME} \
        --global \
        --purpose=VPC_PEERING \
        --prefix-length=20 \
        --description="Managed Lustre VPC Peering" \
        --network=${NETWORK_NAME} \
        --project=${PROJECT_ID}
    
  4. 前の手順で作成した範囲に関連付けられた CIDR 範囲を取得します。

    CIDR_RANGE=$(
      gcloud compute addresses describe ${IP_RANGE_NAME} \
          --global  \
          --format="value[separator=/](address, prefixLength)" \
          --project=${PROJECT_ID}
    )
    
  5. 作成した IP アドレス範囲からの TCP トラフィックを許可するファイアウォール ルールを作成します。

    gcloud compute firewall-rules create ${FIREWALL_RULE_NAME} \
        --allow=tcp:988,tcp:6988 \
        --network=${NETWORK_NAME} \
        --source-ranges=${CIDR_RANGE} \
        --project=${PROJECT_ID}
    
  6. プロジェクトのネットワーク ピアリングを設定するには、必要な IAM 権限(特に compute.networkAdmin ロールまたは servicenetworking.networksAdmin ロール)があることを確認します。

    1. Google Cloud コンソール > [IAM と管理] に移動し、プロジェクト オーナーのプリンシパルを検索します。
    2. 鉛筆アイコンをクリックし、[+ 別のロールを追加] をクリックします。
    3. [Compute ネットワーク管理者] または [サービス ネットワーキング管理者] を選択します。
    4. [保存] をクリックします。
  7. ピアリングを接続します。

    gcloud services vpc-peerings connect \
        --network=${NETWORK_NAME} \
        --project=${PROJECT_ID} \
        --ranges=${IP_RANGE_NAME} \
        --service=servicenetworking.googleapis.com
    

Managed Lustre CSI ドライバを構成する

このセクションでは、Managed Lustre CSI ドライバを有効または無効にする方法について説明します。

新しい GKE クラスタで Managed Lustre CSI ドライバを有効にする

以降のセクションでは、新しい GKE クラスタで Managed Lustre CSI ドライバを有効にする方法について説明します。

デフォルト ポート 988 を使用する

バージョン 1.33.2-gke.4780000 以降を実行する新しい GKE クラスタを作成するときに Managed Lustre CSI ドライバを有効にするには、次のコマンドを実行します。

Autopilot

gcloud container clusters create-auto "${CLUSTER_NAME}" \
    --location=${LOCATION} \
    --network="${NETWORK_NAME}" \
    --cluster-version=${CLUSTER_VERSION} \
    --enable-lustre-csi-driver

Standard

gcloud container clusters create "${CLUSTER_NAME}" \
    --location=${LOCATION} \
    --network="${NETWORK_NAME}" \
    --cluster-version=${CLUSTER_VERSION} \
    --addons=LustreCsiDriver

以前のポート 6988 を使用する

1.33.2-gke.4780000 より前のバージョンを実行する新しい GKE クラスタを作成するときに Managed Lustre CSI ドライバを有効にするには、次のコマンドを実行します。

Autopilot

gcloud container clusters create-auto "${CLUSTER_NAME}" \
    --location=${LOCATION} \
    --network="${NETWORK_NAME}" \
    --cluster-version=${CLUSTER_VERSION} \
    --enable-lustre-csi-driver \
    --enable-legacy-lustre-port

Standard

gcloud container clusters create "${CLUSTER_NAME}" \
    --location=${LOCATION} \
    --network="${NETWORK_NAME}" \
    --cluster-version=${CLUSTER_VERSION} \
    --addons=LustreCsiDriver \
    --enable-legacy-lustre-port

既存の GKE クラスタで Managed Lustre CSI ドライバを有効にする

以降のセクションでは、既存の GKE クラスタで Managed Lustre CSI ドライバを有効にする方法について説明します。

デフォルト ポート 988 を使用する

バージョン 1.33.2-gke.4780000 以降を実行する既存の GKE クラスタで Managed Lustre CSI ドライバを有効にするには、次のコマンドを実行します。

  gcloud container clusters update ${CLUSTER_NAME} \
      --location=${LOCATION} \
      --update-addons=LustreCsiDriver=ENABLED

以前のポート 6988 を使用する

既存の GKE クラスタで Managed Lustre CSI ドライバを有効にするには、--enable-legacy-lustre-port フラグを追加して、以前のポート 6988 を使用する必要がある場合があります。このフラグは、次のシナリオで必要です。

  • GKE クラスタが 1.33.2-gke.4780000 より前のバージョンで実行されている場合。
  • このクラスタを gke-support-enabled フラグを使用して作成された既存の Managed Lustre インスタンスに接続する場合。

    gcloud container clusters update ${CLUSTER_NAME} \
        --location=${LOCATION} \
        --enable-legacy-lustre-port
    

既存のクラスタでノードのアップグレードが必要

既存のクラスタで Managed Lustre CSI ドライバを有効にすると、Managed Lustre クライアントに必要なカーネル モジュールを更新するためにノードの再作成がトリガーされることがあります。すぐに利用できるようにするには、ノードプールを手動でアップグレードすることをおすすめします。

リリース チャンネルの GKE クラスタは、スケジュールされたロールアウトに従ってアップグレードされます。メンテナンスの時間枠によっては、この処理に数週間かかることがあります。静的 GKE バージョンを使用している場合は、ノードプールを手動でアップグレードする必要があります。

ノードのアップグレードが完全に完了するまで、CSI ドライバ Pod が更新保留中のノードでクラッシュループする可能性があります。CSI ドライバ Pod ログに Operation not permitted エラーが表示された場合は、ノードのアップグレードまたは再作成が必要です。

ノードプールのアップグレード後、CPU ノードが Google Cloud コンソールまたは CLI 出力で GPU イメージを使用しているように見えることがあります。この動作は予期されたものです。GPU イメージは、CPU ノードで再利用され、Managed Lustre カーネル モジュールを安全にインストールします。GPU の使用料金は発生しません。

(省略可)マルチ NIC ノードプールを作成する

高パフォーマンス ネットワーキングを使用するには、複数のネットワーク インターフェースをサポートするインスタンス タイプを使用してノードプールを作成する必要があります。マルチ NIC サポートは、バージョン 1.35.2-gke.1842000 以降を実行する GKE クラスタでデフォルトで有効になっています。セカンダリ ネットワーク インターフェースがプライマリ インターフェースと同じ VPC ネットワーク内にあることを確認します。

次のコマンドを実行します。

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=LOCATION \
    --machine-type=MACHINE_TYPE \
    --enable-gvnic \
    --additional-node-network network=NETWORK_NAME,subnetwork=SECONDARY_SUBNET

次のように置き換えます。

  • NODE_POOL_NAME: ノードプールの名前。
  • CLUSTER_NAME: クラスタの名前。
  • LOCATION: クラスタのリージョンまたはゾーン。
  • MACHINE_TYPE: ノードプールのマシンタイプ。たとえば、a3-megagpu-8g は、高パフォーマンスを実現するためにマルチ NIC でよく使用されます。マルチ NIC は、任意のマシンタイプでサポートされています。
  • NETWORK_NAME: VPC ネットワーク名。
  • SECONDARY_SUBNET: セカンダリ サブネットの名前。

Lustre でマルチ NIC を無効にする

マルチ NIC のサポートは高パフォーマンス ワークロードに推奨されますが、特定のシナリオでは無効にすることをおすすめします。たとえば、Lustre トラフィックをすべての利用可能なハードウェア インターフェースに分散させたくない場合や、トラブルシューティングのために接続の問題を単一のネットワーク パスに分離する必要がある場合があります。

注: 実行中のノードでマルチ NIC サポートを無効にした場合、この変更を有効にするには、ノードプールを再作成するか、ノードプールを手動でアップグレードする必要があります。

クラスタの場合

クラスタ全体の高性能ネットワーキングを無効にするには、クラスタの作成時または更新時に --disable-multi-nic-lustre フラグを使用します。次に例を示します。

gcloud container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --disable-multi-nic-lustre

次のように置き換えます。

  • CLUSTER_NAME: クラスタの名前。
  • LOCATION: クラスタのリージョンまたはゾーン。

ノードプールの場合

特定のノードプールの高性能ネットワーキングを無効にするには、ノードプールを更新して lustre.csi.storage.gke.io/multi-nic ラベルを false に設定します。

gcloud container node-pools update NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--zone=LOCATION \
--node-labels=lustre.csi.storage.gke.io/multi-nic=false

次のように置き換えます。

  • NODE_POOL_NAME: ノードプールの名前。
  • CLUSTER_NAME: クラスタの名前。
  • LOCATION: クラスタのゾーン。

Managed Lustre CSI ドライバを無効にする

既存の GKE クラスタで Managed Lustre CSI ドライバを無効にするには、Google Cloud CLI を使用します。

gcloud container clusters update ${CLUSTER_NAME} \
    --location=${LOCATION} \
    --update-addons=LustreCsiDriver=DISABLED

CSI ドライバが無効になると、GKE はノードを自動的に再作成し、Managed Lustre カーネル モジュールをアンインストールします。

Managed Lustre CSI ドライバを使用して新しい Volume を作成する

次のセクションでは、GKE で Managed Lustre インスタンスを基盤とする Kubernetes Volume を作成する際の一般的なプロセスについて説明します。

  1. StorageClass を作成します
  2. PersistentVolumeClaim を使用して Volume にアクセスします
  3. ボリュームを消費する Pod を作成します

StorageClass を作成する

Managed Lustre CSI ドライバが有効になっている場合、GKE は Managed Lustre インスタンスのプロビジョニング用に StorageClass を自動的に作成します。StorageClass は、Managed Lustre のパフォーマンス ティアに依存し、次のいずれかになります。

  • lustre-rwx-125mbps-per-tib
  • lustre-rwx-250mbps-per-tib
  • lustre-rwx-500mbps-per-tib
  • lustre-rwx-1000mbps-per-tib

GKE には、サポートされている Managed Lustre のパフォーマンス ティアごとにデフォルトの StorageClass が用意されています。これにより、独自の StorageClass を定義することなく、組み込みの StorageClass を使用できるため、Managed Lustre インスタンスの動的プロビジョニングが簡素化されます。

ゾーンクラスタの場合、CSI ドライバはクラスタと同じゾーンに Managed Lustre インスタンスをプロビジョニングします。リージョン クラスタの場合、リージョン内のいずれかのゾーンにインスタンスをプロビジョニングします。

次の例は、特定のトポロジ要件を持つカスタム StorageClass を作成する方法を示しています。

  1. 次のマニフェストを lustre-class.yaml という名前のファイルに保存します。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: lustre-class
    provisioner: lustre.csi.storage.gke.io
    volumeBindingMode: Immediate
    reclaimPolicy: Delete
    parameters:
      perUnitStorageThroughput: "1000"
      network: LUSTRE_NETWORK
    allowedTopologies:
    - matchLabelExpressions:
      - key: topology.gke.io/zone
        values:
        - us-central1-a
    

    StorageClass でサポートされているフィールドの一覧については、Managed Lustre CSI ドライバのリファレンス ドキュメントをご覧ください。

  2. 次のコマンドを実行して StorageClass を作成します。

    kubectl apply -f lustre-class.yaml
    

PersistentVolumeClaim を使用して Volume にアクセスする

このセクションでは、Managed Lustre CSI ドライバの StorageClass を参照する PersistentVolumeClaim リソースの作成方法について説明します。

  1. 次のマニフェストを lustre-pvc.yaml という名前のファイルに保存します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: lustre-pvc
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 9000Gi
      storageClassName: lustre-class
    

    PersistentVolumeClaim でサポートされているフィールドの一覧については、Managed Lustre CSI ドライバのリファレンス ドキュメントをご覧ください。

  2. 次のコマンドを実行して PersistentVolumeClaim を作成します。

    kubectl apply -f lustre-pvc.yaml
    

ボリュームを使用するワークロードを作成する

このセクションでは、前のセクションで作成した PersistentVolumeClaim リソースを使用する Pod を作成する方法の例を示します。

複数の Pod が同じ PersistentVolumeClaim リソースを共有できます。

  1. 次のマニフェストを my-pod.yaml という名前のファイルに保存します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
          - name: lustre-volume
            mountPath: /data
      volumes:
      - name: lustre-volume
        persistentVolumeClaim:
          claimName: lustre-pvc
    
  2. マニフェストをクラスタに適用します。

    kubectl apply -f my-pod.yaml
    
  3. Pod が動作していることを確認します。Pod は、PersistentVolumeClaim がプロビジョニングされた後に実行されます。この処理が完了するまで数分かかることがあります。

    kubectl get pods
    

    出力は次のようになります。

    NAME           READY   STATUS    RESTARTS   AGE
    my-pod         1/1     Running   0          11s
    

Managed Lustre ボリュームで fsGroup を使用する

マウントされたファイル システムのルートレベル ディレクトリのグループ所有権を変更し、Pod の SecurityContext で指定されたユーザーがリクエストした fsGroup と一致させることができます。fsGroup は、マウントされた Managed Lustre ファイル システム全体の所有権を再帰的に変更しません。マウント ポイントのルート ディレクトリのみが影響を受けます。

トラブルシューティング

トラブルシューティングのガイダンスについては、Managed Lustre ドキュメントのトラブルシューティング ページをご覧ください。

クリーンアップ

Google Cloud アカウントに課金されないようにするには、このガイドで作成したストレージ リソースを削除します。

  1. Pod と PersistentVolumeClaim を削除します。

    kubectl delete pod my-pod
    kubectl delete pvc lustre-pvc
    
  2. PersistentVolume のステータスを確認します。

    kubectl get pv
    

    出力は次のようになります。

    No resources found
    

    基盤となる Managed Lustre インスタンスが完全に削除されるまでに数分かかることがあります。

次のステップ