DRA を使用して既存のデバイスをワークロードに割り当てる

動的リソース割り当て(DRA)を使用すると、Google Kubernetes Engine(GKE)ワークロードのデバイスを柔軟にリクエストできます。このドキュメントでは、クラスタ内のノードプールにある既存のデバイスをリクエストする ResourceClaimTemplate を作成し、ワークロードを作成して、Kubernetes がデバイスを Pod に柔軟に割り当てる方法を確認する方法について説明します。

このドキュメントは、AI/ML やハイ パフォーマンス コンピューティング(HPC)などのワークロードを実行するアプリケーション オペレーターデータ エンジニアを対象としています。

DRA によるデバイスのリクエストについて

DRA 用に GKE インフラストラクチャを設定すると、ノードの DRA ドライバがクラスタ内に DeviceClassDeviceClass オブジェクトを作成します。DeviceClass は、ワークロードにリクエストできるデバイスのカテゴリ(GPU など)を定義します。必要に応じて、プラットフォーム管理者は、特定のワークロードでリクエストできるデバイスを制限する追加の DeviceClass をデプロイできます。

DeviceClass 内のデバイスをリクエストするには、次のいずれかのオブジェクトを作成します。

  • ResourceClaim を使用すると、Pod またはユーザーは DeviceClass 内の特定のパラメータをフィルタして、ハードウェア リソースをリクエストできます。
  • ResourceClaimTemplate は、Pod ごとの新しい ResourceClaim を自動的に作成するために Pod が使用できるテンプレートを定義します。

ResourceClaim と ResourceClaimTemplate の詳細については、ResourceClaim と ResourceClaimTemplate を使用する場面をご覧ください。

このドキュメントの例では、基本的な ResourceClaimTemplate を使用して、指定されたデバイス構成をリクエストします。指定できるすべてのフィールドの詳細については、ResourceClaimTemplate API リファレンスをご覧ください。

制限事項

次の制限が適用されます。

始める前に

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

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

デバイスを申請してワークロードをデプロイする

Pod ごとのデバイス割り当てをリクエストするには、特定タイプの GPU など、リクエストしたデバイス構成を含む ResourceClaimTemplate を作成します。ResourceClaimTemplate を参照するワークロードをデプロイすると、Kubernetes は ResourceClaimTemplate に基づいてワークロード内の各 Pod の ResourceClaim を作成します。Kubernetes は、リクエストされたリソースを割り振り、対応するノードに Pod をスケジュールします。

DRA を使用してワークロードで GPU をリクエストする手順は次のとおりです。

  1. 次のマニフェストを gpu-claim-template.yaml として保存します。

    apiVersion: resource.k8s.io/v1
    kind: ResourceClaimTemplate
    metadata:
      name: gpu-claim-template
    spec:
      spec:
        devices:
          requests:
          - name: single-gpu
            exactly:
              deviceClassName: gpu.nvidia.com
              allocationMode: ExactCount
              count: 1
    
  2. ResourceClaimTemplate を作成します。

    kubectl create -f gpu-claim-template.yaml
    
  3. ResourceClaimTemplate を参照するワークロードを作成するには、次のマニフェストを dra-gpu-example.yaml として保存します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dra-gpu-example
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: dra-gpu-example
      template:
        metadata:
          labels:
            app: dra-gpu-example
        spec:
          containers:
          - name: ctr
            image: ubuntu:22.04
            command: ["bash", "-c"]
            args: ["echo $(nvidia-smi -L || echo Waiting...); sleep infinity"]
            resources:
              claims:
              - name: single-gpu
          resourceClaims:
          - name: single-gpu
            resourceClaimTemplateName: gpu-claim-template
          tolerations:
          - key: "nvidia.com/gpu"
            operator: "Exists"
            effect: "NoSchedule"
    
  4. ワークロードをデプロイします。

    kubectl create -f dra-gpu-example.yaml
    

ハードウェアの割り当てを確認する

ワークロードにハードウェアが割り当てられていることを確認するには、ResourceClaim を確認するか、Pod のログを調べます。割り当てを確認する手順は次のとおりです。

  1. デプロイしたワークロードに関連付けられている ResourceClaim を取得します。

    kubectl get resourceclaims
    

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

    NAME                                               STATE                AGE
    dra-gpu-example-64b75dc6b-x8bd6-single-gpu-jwwdh   allocated,reserved   9s
    
  2. Pod に割り当てられたハードウェアの詳細を取得します。

    kubectl describe resourceclaims RESOURCECLAIM
    

    RESOURCECLAIM は、前の手順の出力から取得した ResourceClaim のフルネームに置き換えます。

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

    Name:         dra-gpu-example-68f595d7dc-prv27-single-gpu-qgjq5
    Namespace:    default
    Labels:       <none>
    Annotations:  resource.kubernetes.io/pod-claim-name: single-gpu
    API Version:  resource.k8s.io/v1
    Kind:         ResourceClaim
    Metadata:
    # Multiple lines are omitted here.
    Spec:
      Devices:
        Requests:
          Exactly:
            Allocation Mode:    ExactCount
            Count:              1
            Device Class Name:  gpu.nvidia.com
          Name:                 single-gpu
    Status:
      Allocation:
        Devices:
          Results:
            Device:   gpu-0
            Driver:   gpu.nvidia.com
            Pool:     gke-cluster-1-dra-gpu-pool-b56c4961-7vnm
            Request:  single-gpu
        Node Selector:
          Node Selector Terms:
            Match Fields:
              Key:       metadata.name
              Operator:  In
              Values:
                gke-cluster-1-dra-gpu-pool-b56c4961-7vnm
      Reserved For:
        Name:      dra-gpu-example-68f595d7dc-prv27
        Resource:  pods
        UID:       e16c2813-08ef-411b-8d92-a72f27ebf5ef
    Events:        <none>
    
  3. デプロイしたワークロードのログを取得します。

    kubectl logs deployment/dra-gpu-example --all-pods=true
    

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

    [pod/dra-gpu-example-64b75dc6b-x8bd6/ctr] GPU 0: Tesla T4 (UUID: GPU-2087ac7a-f781-8cd7-eb6b-b00943cc13ef)
    

    この出力は、GKE がコンテナに 1 つの GPU を割り当てたことを示しています。

次のステップ