GKE マネージド DRANET を使用してネットワーク リソースを割り当てる

Google Kubernetes Engine(GKE)DRANET は、オープンソースの DRANET プロジェクトをベースに構築された GKE のマネージド機能です。このプロジェクトは、ネットワーキング リソース用の Kubernetes DRA API を実装します。DRANET を使用すると、リモート ダイレクト メモリ アクセス(RDMA)をサポートするネットワーク インターフェースのような高性能なネットワーキング リソースをリクエストして Pod に割り当てることができます。このアプローチは、上流のオープンソース プロジェクトに準拠した移植可能なネットワーク リソース管理用 API を提供します。

このドキュメントでは、GKE DRANET の概要を示し、GKE クラスタのワークロードにネットワーク リソースを割り当てる方法を説明します。

このドキュメントは、組織のネットワークを設計するクラウド アーキテクトやネットワーク スペシャリストを対象としています。すべての GKE ドキュメント セットの概要については、GKE のドキュメントを確認するをご覧ください。 Cloud de Confiance by S3NS のコンテンツで使用されている一般的なロールとタスクの詳細については、GKE ユーザーの一般的なロールとタスクをご覧ください。

このドキュメントを読む前に、次をよく理解しておいてください。

GKE マネージド DRANET の仕組み

GKE マネージド DRANET は、networking-dra-driver DaemonSet を介して実装されます。この DaemonSet は、GKE DRANET が有効になっている、GPU または TPU を含むノードで実行されます。ノードレベルのエージェントとして機能し、Kubernetes 動的リソース割り当て(DRA)API を介してネットワーク インターフェースを検出可能および Pod に割り当て可能にします。

GKE バージョン 1.34.1-gke.1829001 以降では、ネットワーキング用の DeviceClass リソースが自動的にインストールされます。これらのクラスは、ユーザーがリクエストできるネットワーク デバイスのタイプを定義します。たとえば、RDMA 対応デバイス用に mrdma.google.com クラスが作成され、その他のネットワーク デバイス用に netdev.google.com クラスが作成されます。

GKE DRANET を使用するには、まず GPU または TPU を含むノードプールで GKE DRANET ドライバを有効にします。

ワークロード用のネットワーク デバイスをリクエストするには、ResourceClaimTemplate を定義します。このテンプレートは、DeviceClass と割り当てモード(ノード上の使用可能なすべてのデバイスをリクエストする、など)を指定します。Pod 仕様の resourceClaims フィールドでこのテンプレートを参照することで、ノード上のリクエストされたネットワーク インターフェースへのアクセス権を Pod に付与します。

GKE マネージド DRANET を使用するケース

GKE DRANET は、トポロジと依存関係を認識できるネットワーク リソースを管理するための標準化された方法を提供します。この標準化により、GKE DRANET は、高性能ネットワーキングを必要とする AI/ML ワークロードに適したソリューションとなります。

Pod 用のネットワーク インターフェースをリクエストする一般的なユースケースは次のとおりです。

  • 使用可能なすべての RDMA 対応インターフェースをリクエストする。
  • 特定の数の RDMA 対応インターフェースをリクエストする。
  • 使用可能なすべての非 RDMA インターフェースをリクエストする。
  • 特定の数の非 RDMA インターフェースをリクエストする。

GKE マネージド DRANET をネットワーキングに使用する場合の主な考慮事項

GKE DRANET をネットワーキングに使用する場合は、次の点を考慮してください。

  • 専用ネットワーク インターフェース

    GKE DRANET を使用して Pod 用のネットワーク インターフェースをリクエストすると、そのインターフェースはその Pod 専用になります。同じノード上の他の Pod との間でこのインターフェースを共有することはできません。そのため、特定の Pod がそのインターフェースの全帯域幅とリソースを独占的に使用できます。これは、パフォーマンスが重視されるワークロードにとって重要な利点です。

  • GKE マネージド DRANET ドライバを単独で使用する

    他の GKE DRANET ドライバを有効にせずに、GKE DRA ドライバを有効にしてネットワーク リソースを管理できます。そのためには、GPU と TPU を含むノードプールに cloud.google.com/gke-networking-dra-driver=true ラベルを追加します。

  • 他の GKE DRA ドライバを使用する

    要求の厳しい AI/ML ワークロードのスループットを向上させるには、アクセラレータ(GPU や TPU など)用の DRA API と GKE DRANET マネージド ネットワーキングを組み合わせます。この組み合わせアプローチは、リソースの整合性を高め、トポロジの認識を向上させます。他のリソースのために DRA を使用する方法については、DRA ワークロード用に GKE インフラストラクチャを準備するをご覧ください。

  • 競合する構成を回避する

    GKE DRANET ドライバは、セカンダリ IP アドレス範囲が構成されていない RDMA インターフェースと gVNIC を管理します。同じクラスタ内の Device タイプの Network リソースで、GKE DRANET ドライバと GKE マルチネットワーク API の両方を使用しないでください。両方の API が同じ NIC のセットを管理しようとするため、ドライバと API を一緒に使用することはできません。これに従わないと、正しくセットアップされず、予期しない動作につながる可能性があります。

要件

GKE マネージド DRANET を使用するには、お客様の環境が次の要件を満たしている必要があります。

  • GKE バージョン 1.34.1-gke.1829001 以降。
  • クラスタで GKE Dataplane V2 が有効になっている。
  • プレビュー)GKE DRANET は A4X Max マシンで使用できます。

制限事項

GKE DRANET には次の制限があります。

  • GKE DRANET を使用してデフォルトのネットワーク インターフェース カード(NIC)または仮想 NIC(veth など)を割り当てることはできません。
  • クラスタの自動スケーリングと Autopilot はサポートされていません。
  • secondaryPodRange が構成されているインターフェースで GKE DRANET を使用することはできません。

始める前に

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

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

必要なロール

ノードプールの作成とネットワーク リソースの割り当てに必要な権限を取得するには、プロジェクトに対する Kubernetes Engine 管理者 roles/container.admin)IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織に対するアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

クラスタを作成する

GKE Dataplane V2 を使用する GKE Standard クラスタを作成します。

gcloud container clusters create CLUSTER_NAME \
    --enable-dataplane-v2 \
    --region=CONTROL_PLANE_LOCATION \
    --project=PROJECT_ID \
    --cluster-version=CLUSTER_VERSION

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

  • CLUSTER_NAME: 新しいクラスタの名前。
  • CONTROL_PLANE_LOCATION: クラスタ コントロール プレーンのリージョンまたはゾーン(例: us-central1us-central1-a)。
  • PROJECT_ID: 実際の Cloud de Confiance プロジェクト ID。
  • CLUSTER_VERSION: クラスタの GKE バージョン。1.34.1-gke.1829001 以降のバージョンを指定する必要があります。

GPU ノードプールから RDMA インターフェースを使用する

以降のセクションでは、GPU ノードプールとワークロードが GKE DRANET を通じて RDMA ネットワーク インターフェースを使用するように構成する方法を説明します。

GPU ノードプールで GKE マネージド DRANET ドライバを有効にする

RDMA をサポートする GPU ノードプールで GKE DRANET ドライバを有効にするには、ノードプールの作成時に cloud.google.com/gke-networking-dra-driver=true ラベルを追加します。

gcloud beta container node-pools create NODE_POOL_NAME \
  --region=REGION \
  --cluster=CLUSTER_NAME \
  --node-locations=NODE_LOCATIONS \
  --accelerator type=ACCELERATOR_TYPE,count=ACCELERATOR_COUNT,gpu-driver-version=DRIVER_VERSION \
  --machine-type=MACHINE_TYPE \
  --num-nodes=NUM_NODES \
  --reservation-affinity=specific \
  --reservation=projects/RESERVATION_PROJECT/reservations/RESERVATION_NAME/reservationBlocks/RESERVATION_BLOCK \
  --accelerator-network-profile=auto \
  --node-labels=cloud.google.com/gke-networking-dra-driver=true

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

  • NODE_POOL_NAME: 新しいノードプールの名前。
  • REGION: クラスタの Cloud de Confiance リージョン。
  • CLUSTER_NAME: クラスタの名前。
  • ACCELERATOR_TYPE: GPU アクセラレータのタイプ。

    例:

    • A4 VM: nvidia-b200 と入力します。
    • A3 Ultra VM: nvidia-h200-141gb と入力します。
  • ACCELERATOR_COUNT: ノードプール内のノードに接続する GPU の数。たとえば、a4-highgpu-8g VM と a3-ultragpu-8g VM はどちらも、GPU の数は 8 です。

  • DRIVER_VERSION: 使用する GPU ドライバのバージョン。たとえば、defaultlatest です。

  • MACHINE_TYPE: ノードプールのマシンタイプ(例: a3-ultragpu-8g)。

  • NUM_NODES: ノードプールのノード数。Flex Start の場合、この値は 0 に設定する必要があります。

  • RESERVATION_PROJECT: 予約のプロジェクト ID。

  • RESERVATION_NAME: 予約の名前。この値を確認するには、将来の予約リクエストを表示するをご覧ください。

  • RESERVATION_BLOCK: 予約内の特定のブロックの名前。この値を確認するには、将来の予約リクエストを表示するをご覧ください。

このコマンドは、アクセラレータ ネットワーク プロファイルを使用して、指定したアクセラレータ VM 用の VPC ネットワークとサブネットを自動的に構成します。または、VPC ネットワークとサブネットを明示的に指定することもできます。

ワークロードの RDMA リソースをデプロイする

RDMA リソースを Pod に割り当てるには、ResourceClaimTemplate を指定します。

  1. ResourceClaimTemplate を作成して RDMA デバイスの割り当て方法を定義します。次のマニフェストは、ノード上の使用可能なすべての mrdma デバイスをリクエストします。このマニフェストを all-mrdma-template.yaml として保存します。

    apiVersion: resource.k8s.io/v1
    kind: ResourceClaimTemplate
    metadata:
      name: all-mrdma
    spec:
      spec:
        devices:
          requests:
          - name: req-mrdma
            exactly:
              deviceClassName: mrdma.google.com
              allocationMode: All
    
  2. 次のようにマニフェストを適用します。

    kubectl apply -f all-mrdma-template.yaml
    
  3. ワークロードをデプロイし、ResourceClaimTemplate を参照します。次のマニフェストは、all-mrdma テンプレートを参照する Pod をデプロイします。これにより、この Pod にノード上の RDMA インターフェースへのアクセス権が付与されます。このマニフェストを agnhost-rdma-pod.yaml として保存します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: agnhost-rdma
      namespace: default
      labels:
        app: agnhost
    spec:
      containers:
      - name: agnhost
        image: registry.k8s.io/e2e-test-images/agnhost:2.39
        args: ["netexec", "--http-port", "80"]
        ports:
        - name: agnhost-port
          containerPort: 80
        resources:
          claims:
          - name: rdma
          limits:
            nvidia.com/gpu: 1
      resourceClaims:
      - name: rdma
        resourceClaimTemplateName: all-mrdma
    
  4. 次のようにマニフェストを適用します。

    kubectl apply -f agnhost-rdma-pod.yaml
    
  5. 追加で割り当てられたネットワーク インターフェースが Pod 内で表示されることを確認します。

    kubectl exec agnhost-rdma -- ls /sys/class/net
    

    次の出力例は、デフォルト インターフェースの eth0lo に加えて、RDMA インターフェース(gpu0rdma0 など)が割り当てられていることを示しています。ネットワーク インターフェース(NIC)の数と名前は、GKE ノードのマシンタイプによって異なります。

    eth0
    gpu0rdma0
    gpu1rdma0
    gpu2rdma0
    gpu3rdma0
    lo
    

TPU ノードプールで非 RDMA ネットワーク インターフェースを使用する

以降のセクションでは、TPU ノードプールとワークロードが GKE DRANET を通じて非 RDMA ネットワーク インターフェースを使用するように構成する方法を説明します。

ネットワーキングの DeviceClass を確認する

ネットワーキング用の DeviceClass リソースがクラスタに存在することを確認します。

kubectl get deviceclass netdev.google.com

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

NAME                AGE
netdev.google.com   2d22h

TPU スライス ノードプールで GKE マネージド DRANET ドライバを有効にする

TPU スライス ノードプールの作成時に GKE DRANET ドライバを有効にするには、cloud.google.com/gke-networking-dra-driver=true ラベルを追加します。

gcloud beta container node-pools create NODE_POOL_NAME \
    --location=LOCATION \
    --cluster=CLUSTER_NAME \
    --node-locations=NODE_LOCATIONS \
    --machine-type=MACHINE_TYPE \
    --tpu-topology=TPU_TOPOLOGY \
    --num-nodes=NUM_NODES \
    --accelerator-network-profile=auto \
    --node-labels=cloud.google.com/gke-networking-dra-driver=true

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

  • NODE_POOL_NAME: 新しいノードプールの名前。
  • LOCATION: クラスタの Cloud de Confiance リージョンまたはゾーン。
  • CLUSTER_NAME: クラスタの名前。
  • NODE_LOCATIONS: ノードプール内のノードの Cloud de Confiance ゾーン。
  • MACHINE_TYPE: ノードに使用するマシンのタイプ。TPU に対応したマシンタイプの詳細については、TPU のバージョンを選択するをご覧ください。
  • TPU_TOPOLOGY: TPU トポロジ(例: 2x4x4)。トポロジの形式は TPU のバージョンによって異なります。TPU トポロジの詳細については、トポロジを選択するをご覧ください。
  • NUM_NODES: ノードプール内のノード数。

詳細については、単一ホスト TPU スライス ノードプールを作成するをご覧ください。

すべてのネットワーク デバイスをリクエストするワークロードをデプロイする

非 RDMA ネットワーク デバイスを Pod に割り当てるには、ResourceClaimTemplate を指定します。

  1. netdev.google.com DeviceClass を参照する ResourceClaimTemplate を作成します。次のマニフェストは、ノード上の使用可能なすべての非 RDMA ネットワーク デバイスをリクエストします。

    このマニフェストを all-netdev-template.yaml として保存します。

    apiVersion: resource.k8s.io/v1
    kind: ResourceClaimTemplate
    metadata:
      name: all-netdev
    spec:
      spec:
        devices:
          requests:
          - name: req-netdev
            exactly:
              deviceClassName: netdev.google.com
              allocationMode: All
    
  2. 次のようにマニフェストを適用します。

    kubectl apply -f all-netdev-template.yaml
    
  3. ワークロードをデプロイし、ResourceClaimTemplate を参照します。次のマニフェストは、all-netdev テンプレートを参照する Pod をデプロイします。これにより、この Pod にノード上のすべての非 RDMA ネットワーク デバイスへのアクセス権が付与されます。このマニフェストを netdev-pod.yaml として保存します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: agnhost-netdev
      namespace: default
      labels:
        app: agnhost
    spec:
      containers:
      - name: agnhost
        image: registry.k8s.io/e2e-test-images/agnhost:2.39
        args: ["netexec", "--http-port", "80"]
        ports:
        - name: agnhost-port
          containerPort: 80
        resources:
          claims:
          - name: netdev
          limits:
            google.com/tpu: 4
      nodeSelector:
        cloud.google.com/gke-tpu-accelerator: TPU_ACCELERATOR
        cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY
      resourceClaims:
      - name: netdev
        resourceClaimTemplateName: all-netdev
    

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

    • TPU_ACCELERATOR: TPU アクセラレータ タイプ(例: tpu-v5p-slice)。
    • TPU_TOPOLOGY: TPU トポロジ(例: 2x4x4)。
  4. 次のようにマニフェストを適用します。

    kubectl apply -f netdev-pod.yaml
    
  5. 追加で割り当てられたネットワーク インターフェースが Pod 内で表示されることを確認します。

    kubectl exec agnhost-netdev -- ls /sys/class/net
    

    次の出力例は、デフォルト インターフェースの eth0lo に加えて、eth1eth2 などのネットワーク デバイスが割り当てられていることを示しています。NIC の数と名前は、GKE ノードのマシンタイプによって異なります。

    eth0
    eth1
    eth2
    lo
    

特定の数のネットワーク デバイスをリクエストする

上記の例では、特定のタイプの使用可能なすべてのネットワーク デバイスをリクエストするため、allocationModeAll に設定しています。特定の数のデバイスをリクエストする場合は、ResourceClaimTemplateallocationModeExactCount に設定します。

次の例では、2 つの RDMA ネットワーク デバイスをリクエストしています。

apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: two-mrdma
spec:
  spec:
    devices:
      requests:
      - name: req-mrdma
        exactly:
          deviceClassName: mrdma.google.com
          allocationMode: ExactCount
          count: 2

次のステップ