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


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

始める前に

始める前に、次のタスクを完了済みであることを確認してください。

  • Google Cloud Managed Lustre API と Google Kubernetes Engine API を有効にします。
  • API を有効にする
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得する。

環境変数を設定する

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

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

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

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

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

Managed Lustre インスタンスと GKE クラスタを作成するときに、同じ VPC ネットワークを指定する必要があります。

  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. Trusted 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
    

マネージド Lustre CSI ドライバを構成する

このセクションでは、必要に応じてマネージド Lustre CSI ドライバを有効または無効にする方法について説明します。

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

新しい GKE クラスタを作成するときに Managed Lustre CSI ドライバを有効にするには、次の操作を行います。

Autopilot

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

標準

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

enable-legacy-lustre-port フラグが指定されている場合、CSI ドライバはポート 6988 を使用するように LNet(マネージド Lustre カーネル モジュールの仮想ネットワーク レイヤ)を構成します。このフラグは、GKE ノードの gke-metadata-server とのポート競合を回避するために必要です。

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

既存の GKE クラスタで Managed Lustre CSI ドライバを有効にするには、次のコマンドを使用します。

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

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

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

ノードプールのアップグレード後、CPU ノードがTrusted Cloud コンソールまたは CLI 出力で GPU イメージを使用しているように見えることがあります。次に例を示します。

config:
  imageType: COS_CONTAINERD
  nodeImageConfig:
    image: gke-1330-gke1552000-cos-121-18867-90-4-c-nvda

この動作は予期されたものです。GPU イメージは、CPU ノードで再利用され、Managed Lustre カーネル モジュールを安全にインストールします。GPU の使用料金は請求されません。

マネージド Lustre CSI ドライバを無効にする

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

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

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

マネージド 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 のパフォーマンス ティアに依存します。GKE で、次のいずれかです。

  • 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 ドライバはクラスタと同じゾーンにマネージド 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: 18000Gi
      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 ドキュメントのトラブルシューティング ページをご覧ください。

クリーンアップ

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

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

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

    kubectl get pv
    

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

    No resources found
    

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

次のステップ