複数のアプリケーションが GPU リソースを共有する必要がある AI トレーニングおよび推論タスクでは、従来のデバイスプラグインにはスケジューリングの制限があります。Container Service for Kubernetes (ACK) クラスターに NVIDIA DRA ドライバーをデプロイすることで、Kubernetes Dynamic Resource Allocation (DRA) API を活用して、Pod 間の動的で詳細な GPU 割り当てを実現します。これにより、GPU の使用率が向上し、コストが削減されます。
仕組み
DRA は、PersistentVolume モデルを GPU などの汎用リソースに拡張する Kubernetes API であり、Pod がそれらをリクエストして共有できるようにします。従来のデバイスプラグインモデルと比較して、DRA はリソースをリクエストするためのより柔軟で詳細な方法を提供します。
NVIDIA DRA Driver for GPUs は、DRA API を実装して、Kubernetes ワークロードに GPU を割り当てる最新の方法を提供します。GPU の制御された共有と動的な再構成をサポートします。
前提条件
Kubernetes バージョン 1.34 以降を実行している ACK マネージドクラスター が必要です。
DRA GPU スケジューリング環境の構成
ステップ 1: GPU ノードプールの作成
DRA ベースの GPU スケジューリング用のノードプールを作成します。ノードラベルを使用してデフォルトの GPU デバイスプラグインを無効にし、GPU が二重にカウントされるのを防ぎます。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト を選択します。ターゲットクラスターを選択し、ノード > ノードプール を選択します。
[ノードプールを作成] をクリックし、ACK がサポートする GPU インスタンスタイプを選択します。他のパラメーターはデフォルト値のままにします。
[インスタンスタイプの指定] をクリックし、
ecs.gn7i-c8g1.2xlargeなどのインスタンスタイプを入力します。[ノード数] を 1 に設定します。[詳細オプション (オプション)] を展開します。[ノードラベル] セクションで、キーと値のペア
ack.node.gpu.schedule: disabledを入力します。このラベルは、デフォルトの排他的 GPU スケジューリング機能を無効にし、GPU デバイスプラグインがリソースを報告するのを防ぎます。デバイスプラグインと DRA の両方を有効にすると、GPU リソースが 2 回割り当てられます。DRA ノードでは、GPU デバイスプラグインのリソース報告を無効にしてください。
ステップ 2: NVIDIA DRA ドライバーのインストール
Helm を使用して NVIDIA DRA GPU ドライバーをインストールします。このドライバーは、クラスターに DRA API の実装を提供します。
まだインストールしていない場合は、Helm CLI をインストールします。
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bashNVIDIA Helmリポジトリを追加して更新します。helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \ && helm repo updateNVIDIA DRA GPUドライバーのバージョン25.3.2をインストールします。このコマンドは、前のステップでラベルを付けたノードでのみドライバーが実行されるように構成します。helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu --version="25.3.2" --create-namespace --namespace nvidia-dra-driver-gpu \ --set gpuResourcesEnabledOverride=true \ --set controller.affinity=null \ --set "kubeletPlugin.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].key=ack.node.gpu.schedule" \ --set "kubeletPlugin.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].operator=In" \ --set "kubeletPlugin.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].values[0]=disabled"重要--set controller.affinity=nullパラメーターは、controllerワークロードからノードアフィニティ宣言を削除します。これにより、controllerワークロードを任意のノードにスケジュールできますが、安定性の問題が発生する可能性があります。本番環境でこの操作を実行する前に、影響を評価してください。次の出力は、ドライバーがインストールされたことを示します。
NAME: nvidia-dra-driver-gpu LAST DEPLOYED: Tue Oct 14 20:42:13 2025 NAMESPACE: nvidia-dra-driver-gpu STATUS: deployed REVISION: 1 TEST SUITE: None
ステップ 3: 環境の確認
NVIDIA DRA ドライバーが期待どおりに実行され、GPU リソースが Kubernetes クラスターに報告されていることを確認します。
DRA GPU ドライバーのすべての Pod が
Running状態であることを確認します。kubectl get pod -n nvidia-dra-driver-gpuDRA 関連のリソースが作成されていることを確認します。
kubectl get deviceclass,resourceslice期待される出力:
NAME AGE deviceclass.resource.k8s.io/compute-domain-daemon.nvidia.com 60s deviceclass.resource.k8s.io/compute-domain-default-channel.nvidia.com 60s deviceclass.resource.k8s.io/gpu.nvidia.com 60s deviceclass.resource.k8s.io/mig.nvidia.com 60s NAME NODE DRIVER POOL AGE resourceslice.resource.k8s.io/cn-beijing.1x.1x.3x.1x-compute-domain.nvidia.com-htjqn cn-beijing.10.11.34.156 compute-domain.nvidia.com cn-beijing.10.11.34.156 57s resourceslice.resource.k8s.io/cn-beijing.1x.1x.3x.1x-gpu.nvidia.com-bnwhj cn-beijing.10.11.34.156 gpu.nvidia.com cn-beijing.10.11.34.156 57s現在の環境での GPU リソース報告の詳細を表示します。
cn-beijing.1x.1x.3x.1x-gpu.nvidia.com-bnwhjをresourcesliceリソースオブジェクトの実際の名前で置き換えてください。kubectl get resourceslice.resource.k8s.io/cn-beijing.1x.1x.3x.1x-gpu.nvidia.com-bnwhj -o yaml
DRA GPU を使用したワークロードのデプロイ
このセクションでは、DRA を使用して GPU リソースをリクエストするワークロードをデプロイする方法を示します。これは、ResourceClaimTemplateを作成してResourceClaimを自動的に作成することによって行われます。
単一の GPU をリクエストする
ResourceClaimTemplateを宣言します。次の内容をresource-claim-template.yamlとして保存します。apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: name: single-gpu spec: spec: devices: requests: - exactly: allocationMode: ExactCount deviceClassName: gpu.nvidia.com count: 1 name: gpuクラスターに
ResourceClaimTemplateを作成します。kubectl apply -f resource-claim-template.yamlresource-claim-template-pod.yamlという名前のファイルを作成します。apiVersion: v1 kind: Pod metadata: name: pod1 labels: app: pod spec: containers: - name: ctr image: registry-cn-hangzhou.ack.aliyuncs.com/dev/ubuntu:22.04 command: ["bash", "-c"] args: ["nvidia-smi -L; trap 'exit 0' TERM; sleep 9999 & wait"] resources: claims: - name: gpu resourceClaims: - name: gpu resourceClaimTemplateName: single-gpuResourceClaimTemplateを参照するワークロードを作成します。kubectl apply -f resource-claim-template-pod.yaml自動的に作成された
ResourceClaimを表示します。現在の名前空間で
ResourceClaimを見つけます (例:pod1-gpu-wstqm)。kubectl get resourceclaimResourceClaimの詳細を表示します。pod1-gpu-wstqmをResourceClaimリソースオブジェクトの実際の名前で置き換えてください。kubectl describe resourceclaim pod1-gpu-wstqm
Pod のログをチェックして、GPU にアクセスできることを確認します。期待される出力には、
GPU 0: NVIDIA A10のように割り当てられた GPU がリストされます。kubectl logs pod1
(オプション) 環境のクリーンアップ
終了したら、作成したリソースを削除して、不要なコストを回避します。
デプロイされたワークロードとクレームテンプレートを削除します。
kubectl delete pod pod1 kubectl delete resourceclaimtemplate single-gpuNvidia GPU DRAドライバーをアンインストールします。helm uninstall nvidia-dra-driver-gpu -n nvidia-dra-driver-gpu