NVIDIA GPU Operatorの活用

Prev Next

VPC環境で利用できます。

Ncloud Kubernetes Service(NKS)で NVIDIA GPU Operatorを使用して GPUノードのドライバと関連コンポーネントをクラスタ上で管理できます。ノードプールごとに GPUモデルが異なる場合、ノードプール別に異なるドライババージョンを適用できます。

使用前に確認

GPU Operatorを使用する前に、次のサポート範囲と準備事項をご確認ください。

項目 サポート範囲
利用環境 VPC
Kubernetes 1.33以上
GPU Operator v26.7.0
インストール方式 Helm手動インストール
ノード OS Ubuntu 22.04または24.04
リージョン KR

このドキュメントで扱う GPU Operatorの主なコンポーネントは、次の通りです。チャートのバージョンや設定に応じて、追加コンポーネントが同時にインストールされることがあります。

コンポーネント ロール
NVIDIA Driver GPUノードにドライバインストールおよびカーネルモジュールをロード
NVIDIA Container Toolkit コンテナで GPUを使用できるようにランタイムを構成
NVIDIA Device Plugin nvidia.com/gpuリソースを kubeletに登録
Node Feature Discovery ノードのハードウェアと OS情報をラベルとして登録
GPU Feature Discovery GPUモデル数、ドライババージョンをラベルとして登録
DCGM Exporter GPUメトリックを Prometheus形式で表示
Operator Validator ドライバとランタイムの構成が正常か検証
MIG Manager MIGをサポートする GPUで MIG構成を適用

GPU Operatorは、このコンポーネントの構成を ClusterPolicyリソース1つで管理します。

次の項目を予め準備してください。

  • GPUノードプールと一般ノードプールで構成された Ncloud Kubernetes Serviceクラスタ
  • kubectlを使用できる kubeconfig
  • Helm 3
  • GPUサーバサービスの Quotaの申請と承認
  • ノードから nvcr.ioと registry.k8s.ioでイメージをダウンロードできるアウトバウンドパス、またはそのイメージをコピーしておいたコンテナレジストリ
  • ノードから OSパッケージ保存場所にアクセスできるパス、または内部ミラー(ドライバコンテナがカーネルヘッダーパッケージをダウンロード)
  • 予めインストールされたドライバを削除する場合、対象ノードに root権限でアクセスできる手段

このドキュメントのコマンドは、現在選択されている kubeconfig contextを対象に実行します。他のクラスタを対象にするには、kubectl config use-contextに contextを切り替えて実行します。

インストール中に使用する値は、次の通りです。

入力値 説明 例
<OPERATOR_VERSION> インストールする GPU Operator Helmのチャートバージョン v26.7.0
<GPU_NODEPOOL> ドライバの構成を提供する GPUノードプールの名前 gpu-h100-01
<DRIVER_VERSION> 当該ノードプールにインストールするドライババージョン 580.126.20
<DEFAULT_DRIVER_VERSION> 基本構成で使用するドライババージョン 595.91.07

インストールできるドライバのバージョンリストは、クラスタから照会できません。GPU Operator Component Matrixで、インストールする GPU Operatorバージョンがデフォルトとして使用するドライババージョンを確認します。特定のバージョンを使用する理由がない場合は、この値をそのまま使用してください。

他のバージョンを指定する場合は、NVIDIA GPU Driverコンテナイメージタグにノードの OSとカーネルをサポートするタグがあるかご確認ください。

ドライバと Container Toolkitイメージは、ノードの OSバージョン別に提供されます。

注意

Container Toolkitはクラスタ単位で1つのみ指定でき、ノードプール別に異なる設定を指定できません。チャートのデフォルト値は OS名が付いていないイメージであるため、サポート範囲の OSを使用するノードプールは混在させて構成できます。OS名が付いたイメージを指定する必要がある場合は、その OSを使用しないノードで GPUを使用できないため、GPUノードプールの OSバージョンを統一します。

NVIDIAドライバの事前インストールの有無は、ノードプールで選択した GPUサーバイメージによって異なります。ドライバを管理する主体は、以下の2つから選択できます。

ドライバ管理 バージョンを決める場所 バージョン変更方法 ノードの追加や交換時
サーバイメージ ノードプールで選択したサーバイメージ サーバイメージの変更 追加タスクなし
GPU Operator NVIDIADriver リソース リソースの versionを変更 ドライバが予めインストールされたイメージは削除する必要あり

Kubernetesでドライババージョンを直接指定または変更する場合は、GPU Operatorが管理するように構成します。

参考

ドライバが予めインストールされたノードでは GPU Operatorがドライバコンテナを実行しないため、NVIDIADriverリソースに指定したバージョンが適用されません。インストール前はノードプールに選択した GPUサーバイメージのドライバの有無で判断し、インストール後はドライバインストール方法確認を参照してノード別のステータスを確認します。GPU Operatorが管理するように切り替えるには、予めインストールされたドライバを削除をご参照ください。

GPUノードプールを準備

GPU Operatorをインストールする前に、GPUノードプールの構成とラベルを確認します。

注意
  • GPUノードは、KRリージョンでのみご利用できます。
  • NKSの基本オブジェクトには一般ノードが必要なため、一般ノードプールと GPUノードプールを同時に構成します。
  • クラスタに NVIDIA Device Pluginを予めインストールした場合、GPU Operatorをインストールする前に削除します。GPU Operatorが Device Pluginも一緒にインストールするため、両方の構成が同じ GPUを重複して登録してしまいます。

以下のコマンドを実行して、現在選択されている contextが対象クラスタであることを確認します。

kubectl config get-contexts
kubectl config current-context

以下のコマンドを実行して、ノードプール名と GPUノードのラベルを確認します。

kubectl get node -L ncloud.com/nks-nodepool

NKSはそれぞれのノードに所属するノードプールの情報を ncloud.com/nks-nodepool: <NODEPOOL_NAME>形式のラベルとして追加します。このラベルは、ノードを交換した場合やノード数を増やした場合も維持されるため、ノードプール単位でドライバ構成を指定する際に使用できます。ノードラベルに関する詳細は、クラスタノードプールの管理をご参照ください。

以下のコマンドを実行して、GPUノードに設定された taintを確認します。

kubectl get node -o custom-columns='NAME:.metadata.name,TAINTS:.spec.taints'

GPUノードプールに taintを設定した場合、ドライバ Podがそのノードに配置されるように、構成に tolerationを追加します。このドキュメントのユースケースは taintキーとして nvidia.com/gpuを使用するため、確認したキーが異なる場合は tolerations項目をそのキーに合わせて変更します。

GPU Operatorインストール

以下のコマンドを実行して、NVIDIA Helm保存場所を追加します。

helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update

以下の条件に該当する場合は、コマンドを実行する前にそのセクションを先に確認します。両方とも該当しない場合は、そのまま進めてください。

以下のコマンドを実行して、GPU Operatorをインストールします。driver.nvidiaDriverCRD.enabledを trueに設定すると、ドライバを NVIDIADriverユーザー定義リソースとして分離して管理します。

helm install gpu-operator nvidia/gpu-operator \
  --namespace gpu-operator --create-namespace \
  --version "<OPERATOR_VERSION>" \
  --set driver.nvidiaDriverCRD.enabled=true \
  --set driver.nvidiaDriverCRD.deployDefaultCR=false \
  --wait

deployDefaultCRは、チャートが defaultリソースを代わりに作成するかを決め、デフォルト値は trueです。このドキュメントは、デフォルトリソースとノードプール別のリソースをすべて直接定義するため、falseに設定します。設定値によって実行するタスク範囲が異なり、その違いはノードプール別のドライバ構成の表にまとめています。

参考

インストール時に次の事項をご参照ください。

  • ドライバ管理方法を NVIDIADriverリソースに変更すると、ClusterPolicyはドライバを除いたコンポーネントを管理し続けます。
  • 既に ClusterPolicyでドライバを管理するクラスタにこのドキュメントの構成を適用する場合は、ドライバ管理方法の切り替えをご参照ください。

以下のコマンドを実行して、GPU Operatorが実行中かどうかを確認します。

kubectl --namespace gpu-operator get pod -l app=gpu-operator
kubectl --namespace gpu-operator get pod -l app.kubernetes.io/name=node-feature-discovery

このステップでは、gpu-operator Podと Node Feature Discovery Podが Runningステータスであれば、問題ありません。

注意

ドライバが予めインストールされていないノードでは、インストール後に以下のようなステータスになります。

  • nvidia-operator-validator: Init:Errorで再インストール
  • Device Pluginと DCGM Exporter: Initステータスで待機
  • ClusterPolicy: notReady

ドライバがないため、残りのコンポーネントはまだ動作してしませんが、障害ではありません。次のステップで NVIDIADriverリソースを適用することで解決できます。適用後も解決しない場合は、構成の適用と確認の注意事項をご参照ください。ドライバが予めインストールされているノードのみを使用する場合は、リソースを適用しなくても、残りのコンポーネントが動作します。

内部レジストリを使用する場合

ノードで nvcr.ioと registry.k8s.ioにアクセスできない場合を説明します。2つのレジストリにアクセスできる場合は、このセクションをスキップします。

イメージを使用するコンテナレジストリにコピーした後、以下の valuesを変更します。コンポーネントごとに項目が分かれているため、使用するコンポーネントをすべて指定します。

コンポーネント values項目 デフォルト値
Operator operator.repository nvcr.io/nvidia
Operator Validator validator.repository nvcr.io/nvidia
NVIDIA Driver driver.repository nvcr.io/nvidia
Driver Manager driver.manager.repository nvcr.io/nvidia/cloud-native
NVIDIA Container Toolkit toolkit.repository nvcr.io/nvidia/k8s
NVIDIA Device Plugin devicePlugin.repository nvcr.io/nvidia
GPU Feature Discovery gfd.repository nvcr.io/nvidia
DCGM dcgm.repository nvcr.io/nvidia/cloud-native
DCGM Exporter dcgmExporter.repository nvcr.io/nvidia/k8s
MIG Manager migManager.repository nvcr.io/nvidia/cloud-native
Node Feature Discovery node-feature-discovery.image.repository registry.k8s.io/nfd/node-feature-discovery

repository項目はイメージ名を除いたパスであり、イメージ名は各コンポーネントの image項目にあります。Node Feature Discoveryは別途チャートとしてインストールされるため、node-feature-discovery.image.repositoryにイメージ名まで含めたパスを指定し、タグは node-feature-discovery.image.tagに指定します。

次の内容をコピーして registry-values.yaml ファイルで保存します。<REGISTRY>は使用するレジストリアドレスに変更します。

operator:
  repository: <REGISTRY>/nvidia
validator:
  repository: <REGISTRY>/nvidia
driver:
  repository: <REGISTRY>/nvidia
  manager:
    repository: <REGISTRY>/nvidia/cloud-native
toolkit:
  repository: <REGISTRY>/nvidia/k8s
devicePlugin:
  repository: <REGISTRY>/nvidia
gfd:
  repository: <REGISTRY>/nvidia
dcgm:
  repository: <REGISTRY>/nvidia/cloud-native
dcgmExporter:
  repository: <REGISTRY>/nvidia/k8s
migManager:
  repository: <REGISTRY>/nvidia/cloud-native
node-feature-discovery:
  image:
    repository: <REGISTRY>/nfd/node-feature-discovery

前の helm installコマンドに --values registry-values.yamlを追加してインストールします。

注意

NVIDIADriverリソースを直接定義する場合、ドライバイメージはリソースの spec.repository値を使用するため、driver.repositoryを変更するだけでは適用されません。ノードプール別に構成を作成で作成するリソースの repository項目も変更します。

認証が必要なレジストリを使用する場合、各コンポーネントの imagePullSecrets項目にシークレットの名前を指定します。NVIDIADriverリソースは spec.imagePullSecrets項目を使用します。

注意

usePrecompiledが falseのドライバは、ノードからカーネルヘッダーパッケージをダウンロードして、モジュールをビルドします。コンテナイメージを内部レジストリにコピーするだけではインストールが完了しないため、OSパッケージ保存場所へのアクセスパスや内部ミラーも準備します。

Ubuntu 20.04(XEN)ノードを使用する場合

Ubuntu 20.04ノードを使用する場合を説明します。他の OSバージョンを使用する場合は、このセクションをスキップします。

Ubuntu 20.04はドライバ、Container Toolkit、Device Pluginイメージの提供が終了したバージョンがあるため、チャートのデフォルト値をそのまま使用できません。以下のバージョンの組み合わせを指定します。

項目 指定するバージョン 指定理由
GPU Operator v26.3.3 v26.7.0の検証コンポーネントが580以上のドライバを要求
Container Toolkit v1.17.9-ubuntu20.04 上位バージョンに Ubuntu 20.04ビルドがない
Device Plugin v0.17.4 上位バージョンが作成する CDI構成を、v1.17.9 Container Toolkitが処理できない
GPU Feature Discovery v0.17.4 Device Pluginと同じイメージを使用
DCGM Exporter 3.2.6-3.1.9-ubuntu20.04 上位バージョンに Ubuntu 20.04ビルドがない
ドライバ 575.57.08以下 上位バージョンに Ubuntu 20.04ビルドがない

以下のコマンドを実行して、GPU Operatorをインストールします。

helm install gpu-operator nvidia/gpu-operator \
  --namespace gpu-operator --create-namespace \
  --version v26.3.3 \
  --set driver.nvidiaDriverCRD.enabled=true \
  --set driver.nvidiaDriverCRD.deployDefaultCR=false \
  --set toolkit.version=v1.17.9-ubuntu20.04 \
  --set devicePlugin.version=v0.17.4 \
  --set gfd.version=v0.17.4 \
  --set dcgmExporter.version=3.2.6-3.1.9-ubuntu20.04 \
  --wait
注意

v26.3.3の NVIDIADriverリソースには、default項目と upgradePolicy項目がありません。deployDefaultCRを省略すると、チャートがノード選択条件がない defaultリソースを作成し、ノードプール別のリソースと競合するため、必ず falseに指定します。基本構成の作成をスキップし、ノードプール別の構成作成のリソースのみを作成し、各リソースで upgradePolicy項目を削除します。version項目には、575.57.08以下を指定します。

ノードプール別のドライバ構成

GPU Operatorがドライバを管理する場合を説明します。サーバイメージのドライバをそのまま使用する場合は、このセクションをスキップしてドライバインストール方法の確認に進めてください。

GPU Operatorはドライバを ClusterPolicyまたは NVIDIADriverリソースで管理し、2つの方法の違いは次の通りです。

管理方式 ドライババージョン 適用範囲
ClusterPolicy クラスタに1つのバージョン すべての GPUノードに同様に適用
NVIDIADriver リソースごとに異なるバージョン リソースのノード選択条件と一致するノードにのみ適用

NVIDIADriverリソースはノード選択条件とドライババージョンを同時に定義し、GPU Operatorはリソースごとに別のドライバ DaemonSetを作成します。GPUモデルが異なるノードプールを同時に運用する環境では、ノードプールごとにリソースを分け、ドライババージョンとカーネルモジュールのタイプを分けることをお勧めします。

インストール時に選択した値に応じて実行するタスク範囲が変わります。

インストールパス default リソース 実行タスク
deployDefaultCR=falseでインストール ユーザーが直接作成 ノードプール別の構成作成。基本構成の作成は選択
deployDefaultCRを省略してインストール チャートが作成 ノードプール別の構成作成
Ubuntu 20.04(XEN)ノードを使用する場合で案内するコマンドでインストール 使用しない ノードプール別の構成作成。upgradePolicyを削除し、versionは575.57.08以下
注意

チャートが作成した defaultリソースを使用する場合は、基本構成の作成を実行しないでください。同じ名前のリソースを Helmとユーザーの両方で管理すると、その後のアップグレードで構成に差異が生じます。

基本構成の作成

default: trueに設定したリソースは、ノードプール別のリソースのノード選択条件と一致しない GPUノードを担当します。新しい GPUノードプールを追加した際にドライバがインストールされない事態を防ぐため、ノードプールを追加する予定がある場合は、基本構成を予め定義します。

次の内容をコピーして nvidiadriver-default.yaml ファイルで保存します。<DEFAULT_DRIVER_VERSION>は、準備した値に変更します。

apiVersion: nvidia.com/v1alpha1
kind: NVIDIADriver
metadata:
  name: default
spec:
  default: true
  driverType: gpu
  repository: nvcr.io/nvidia
  image: driver
  version: "<DEFAULT_DRIVER_VERSION>"
  kernelModuleType: auto
  usePrecompiled: false
  tolerations:
    - key: nvidia.com/gpu
      operator: Exists
      effect: NoSchedule
  upgradePolicy:
    autoUpgrade: true
    maxParallelUpgrades: 1
    maxUnavailable: 1

すべての GPUノードプールに専用リソースを作成した場合、デフォルトリソースが担当するノードは存在しません。このとき、デフォルトリソースは担当ノードが0のまま readyと表示され、ドライバイメージは受け取りません。新しいノードプールを追加する予定がない場合は、デフォルトリソースを作成する必要がありません。

注意
  • default: trueのリソースはクラスタに1つのみ存在すべきであり、nodeSelectorを同時に指定できません。
  • デフォルトリソースが2つ以上存在する場合、当該リソースは notReadyステータスになり、ノードのドライバ所有権が変更されません。

ノードプール別の構成作成

次の内容をコピーして nvidiadriver-nodepool.yaml ファイルで保存します。1つ目のリソースは、値を設定して使用する形式です。<GPU_NODEPOOL>と <DRIVER_VERSION>を準備した値に変更してください。2つ目のリソースは、GPUモデルが異なるノードプール別に異なるドライババージョン、カーネルモジュールのタイプ、アップグレードポリシーを指定した例であり、ノードプールが1つの場合は削除してください。リソース名は、その後のコマンドで対象を指定する場合に使用するため、ノードプール名と同じ名前を指定します。

apiVersion: nvidia.com/v1alpha1
kind: NVIDIADriver
metadata:
  name: "<GPU_NODEPOOL>"
spec:
  driverType: gpu
  repository: nvcr.io/nvidia
  image: driver
  version: "<DRIVER_VERSION>"
  kernelModuleType: auto
  usePrecompiled: false
  nodeSelector:
    ncloud.com/nks-nodepool: "<GPU_NODEPOOL>"
  tolerations:
    - key: nvidia.com/gpu
      operator: Exists
      effect: NoSchedule
  upgradePolicy:
    autoUpgrade: true
    maxParallelUpgrades: 1
    maxUnavailable: 1
---
apiVersion: nvidia.com/v1alpha1
kind: NVIDIADriver
metadata:
  name: gpu-l40s-01
spec:
  driverType: gpu
  repository: nvcr.io/nvidia
  image: driver
  version: "595.91.07"
  kernelModuleType: open
  usePrecompiled: false
  nodeSelector:
    ncloud.com/nks-nodepool: gpu-l40s-01
  tolerations:
    - key: nvidia.com/gpu
      operator: Exists
      effect: NoSchedule
  upgradePolicy:
    autoUpgrade: false

主な設定項目は次の通りです。

設定 デフォルト値 説明
default false ノード選択条件と一致しない GPUノードに適用する基本構成の有無
driverType gpu ドライバの種類。gpu、vgpu、vgpu-host-managerの中から選択
version チャートのデフォルト値 インストールするドライババージョン
kernelModuleType auto カーネルモジュールのタイプ。auto、open、proprietaryの中から選択
usePrecompiled false 予めコンパイルされたドライバコンテナの使用有無
nodeSelector なし ドライバをインストールするノードのラベル条件
tolerations なし ドライバ Podに適用する toleration
upgradePolicy.autoUpgrade true ドライババージョン変更時の自動アップグレードの有無
upgradePolicy.maxParallelUpgrades 1 同時にアップグレードするノード数
upgradePolicy.maxUnavailable 25% アップグレード中に使用できないノードの最大数または比率。ノード数は整数で、比率は "25%"形式の文字列で指定

特定の値を使用する理由がない場合、kernelModuleTypeは autoを使用します。

参考

構成時に次の事項をご参照ください。

  • upgradePolicyはリソースごとに個別に適用されるため、ノードプール別に異なるアップグレード範囲を指定できます。
  • driverTypeと usePrecompiledは変更できない項目です。値を変更する場合は、リソースを削除してから再作成してください。
  • default項目がない場合や falseのリソースに nodeSelectorを指定しない場合は、すべての GPUノードを選択するため、他のリソースと競合します。ノードプール別のリソースには nodeSelectorを必ず指定してください。
  • 予めコンパイルされたドライバは、サポートする OSとカーネルの組み合わせが限られるため、イメージタグの提供有無をご確認ください。
注意

複数のノードプール別リソースが同じノードを選択する場合、そのリソースは notReadyステータスになり、ConflictingNodeSelector条件が表示されます。nodeSelectorが重複しないように構成してください。default: trueリソースは競合対象ではありません。

構成の適用と確認

以下のコマンドを実行して、構成を適用します。基本構成を作成しない場合、1つ目のコマンドは省略します。

kubectl apply -f nvidiadriver-default.yaml
kubectl apply -f nvidiadriver-nodepool.yaml

NVIDIADriverはクラスタ範囲のリソースであるため、ネームスペースは指定しません。ドライバ Podは、GPU Operatorをインストールしたネームスペースに作成されます。

以下のコマンドを実行して、リソースのステータスを確認します。

kubectl get nvidiadriver

構成を適用した直後は、リソースが notReadyと表示されます。ドライバコンテナがノードのカーネルに合わせたモジュールを準備してロードした後、残りのコンポーネントが順次再起動されます。所要時間は GPU数、ノードの仕様、イメージダウンロード速度によって異なります。しばらく待ってもステータスが変わらない場合は、ドライバインストール方法の確認を参照して原因を特定します。

すべてのリソースの STATUS項目が readyに変わると、適用が完了したことになります。基本構成を作成した場合、DEFAULT項目が trueのリソースが1つだけ存在することも確認します。

以下のコマンドを実行して、すべてのコンポーネントと ClusterPolicyステータスを確認します。

kubectl --namespace gpu-operator get pod
kubectl get clusterpolicy cluster-policy

gpu-operatorネームスペースの Podがすべて Runningまたは Completedのステータスで、ClusterPolicyの STATUS項目が readyと表示されると、構成が完了したことになります。

注意

NVIDIADriverリソースが readyに変わった後も nvidia-operator-validator、nvidia-device-plugin-daemonset、gpu-feature-discovery、nvidia-dcgm-exporter Podが、Initまたは RunContainerErrorステータスのままになる場合があります。Podイベントに prestart hookと libnvidia-ml.so.1: cannot open shared object fileが同時に表示される場合が該当します。

GPU Operatorがノードのコンテナランタイム設定を変更する前に作成された Podが、以前の設定をそのまま使用するためであり、ドライバインストールに失敗したわけではありません。以下のコマンドを実行して当該 Podを削除すると、DaemonSetが変更された設定で再作成されます。ドライバ Podと Container Toolkit Podは、削除対象に含まれていません。

kubectl --namespace gpu-operator delete pod \
  -l 'app in (nvidia-operator-validator,nvidia-device-plugin-daemonset,gpu-feature-discovery,nvidia-dcgm-exporter)'

以下のコマンドを実行して、ドライバ DaemonSetとノード選択条件を確認します。

kubectl --namespace gpu-operator \
  get daemonset -l app.kubernetes.io/component=nvidia-driver \
  -o custom-columns='NAME:.metadata.name,READY:.status.numberReady,SELECTOR:.spec.template.spec.nodeSelector'

GPU Operatorは、NVIDIADriverリソースとノードの OSバージョンの組み合わせごとに DaemonSetを作成します。2つのノードプールに異なるドライババージョンを指定すると、DaemonSetも2つ作成されます。

以下のコマンドを実行して、各ノードに適用されたドライババージョンを確認します。

kubectl get node -l nvidia.com/gpu.present=true \
  -L ncloud.com/nks-nodepool \
  -L nvidia.com/cuda.driver-version.full \
  -L nvidia.com/gpu.product

ノードプール別に指定したバージョンが CUDA.DRIVER-VERSION.FULL項目に表示されたら、構成が適用されたことになります。指定したバージョンと異なる値が表示された場合は、ドライバインストール方法の確認を参照して原因を特定します。

ドライバインストール方法の確認

以下のコマンドを実行して、各ノードにドライバを管理する主体を確認します。

kubectl get node -l nvidia.com/gpu.present=true \
  -L nvidia.com/gpu.deploy.driver \
  -L nvidia.com/cuda.driver-version.full

GPU.DEPLOY.DRIVER項目の値は、当該ノードのドライバを何が管理しているかを示します。

値 意味 NVIDIADriverリソースの version適用有無
true GPU Operatorがドライバコンテナでドライバをインストール 適用済み
pre-installed サーバイメージにインストールされたドライバをそのまま使用する 適用されていない

pre-installedと表示されたノードではドライバ DaemonSetの配置対象が0になり、ドライバ Podは作成されません。このステータスでも NVIDIADriverリソースは readyと表示されるため、リソースのステータスだけではバージョンの適用状況を判断できません。必ず CUDA.DRIVER-VERSION.FULL値も一緒に確認します。サーバイメージのドライバをそのまま使用することもでき、GPU Operatorが管理するように切り替えるには、予めインストールされたドライバを削除をご参照ください。

参考

GPU Operator v26.7.0からは nvidia.com/gpu-operator.driver.ownerラベルに各ノードを担当するリソース名が表示されます。以下のコマンドで確認できます。

kubectl get node -l nvidia.com/gpu.present=true -L nvidia.com/gpu-operator.driver.owner

リソースが notReadyである場合や指定したバージョンが適用されない場合、以下のコマンドを実行して原因を確認します。

kubectl describe nvidiadriver "<GPU_NODEPOOL>"
kubectl --namespace gpu-operator logs -l app.kubernetes.io/component=nvidia-driver --tail=100

出力に ConflictingNodeSelector条件がある場合は、nodeSelectorが重複しているため、変更してください。

kubectl get nvidiadriver出力の STATUS項目が disabledと表示された場合は、管理方法が NVIDIADriverに切り替わっていない状態です。この場合、リソースを作成してもドライバの DaemonSetが作成されないため、以下のコマンドを実行して ClusterPolicyの設定を確認します。

kubectl get clusterpolicy cluster-policy -o jsonpath='{.spec.driver.useNvidiaDriverCRD}'

値が true以外の場合は、管理方法を切り替えてください。既にインストールを完了している場合は、以下のコマンドを実行してチャートバージョンを確認します。

helm list --namespace gpu-operator

確認したバージョンを --versionに指定し、設定のみ変更します。--versionを省略すると、保存場所にある最新のチャートにアップグレードされます。

helm upgrade gpu-operator nvidia/gpu-operator \
  --namespace gpu-operator \
  --version "<OPERATOR_VERSION>" \
  --reset-then-reuse-values \
  --set driver.nvidiaDriverCRD.enabled=true \
  --wait

チャートバージョンも同時にアップグレードする場合は、ドライバ管理方法の切り替えで案内しているコマンドを使用します。

GPUの使用確認

以下のコマンドを実行して、ノードに GPUリソースが登録されているかを確認します。

kubectl get node -l nvidia.com/gpu.present=true \
  -o custom-columns='NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu'

GPU項目に GPU数が表示されていれば、リソースの登録が完了しています。<none>に表示されたら、以下のコマンドを実行して Device Plugin Podのステータスを確認します。

kubectl --namespace gpu-operator get pod -l app=nvidia-device-plugin-daemonset

次の内容をコピーして cuda-vectoradd.yaml ファイルで保存します。nvcr.ioへアクセスできない場合は、使用するレジストリでコピーしたイメージアドレスに image項目を変更します。

apiVersion: v1
kind: Pod
metadata:
  name: cuda-vectoradd
  namespace: default
spec:
  restartPolicy: OnFailure
  nodeSelector:
    ncloud.com/nks-nodepool: "<GPU_NODEPOOL>"
  tolerations:
    - key: nvidia.com/gpu
      operator: Exists
      effect: NoSchedule
  containers:
    - name: cuda-vectoradd
      image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0-ubuntu22.04
      resources:
        limits:
          nvidia.com/gpu: 1

以下のコマンドを実行してPodを作成し、作成結果を確認します。

kubectl apply -f cuda-vectoradd.yaml
kubectl --namespace default \
  wait --for=jsonpath='{.status.phase}'=Succeeded pod/cuda-vectoradd --timeout=5m
kubectl --namespace default logs pod/cuda-vectoradd

Podはベクトルの足し算を実行した後、終了します。ログに Test PASSEDが表示されたら、GPUが正常に割り当てられています。確認が終了したら、以下のコマンドを実行して Podを削除します。

kubectl delete -f cuda-vectoradd.yaml

予めインストールされたドライバを削除

サーバイメージにドライバが含まれているノードは、そのまま使用できます。この場合、GPU Operatorが残りのコンポーネントのみを管理し、追加タスクは必要ありません。

ノードプールごとに異なるドライババージョンを使用する場合や Kubernetesでバージョンを指定する場合にのみ、予めインストールされたドライバを削除して GPU Operator管理に切り替えます。削除後は NVIDIADriverリソースに指定したバージョンが適用されます。

注意
  • このタスクはノード単位で実行し、進行中に当該ノードの GPUは使用できません。
  • ノードを交換する場合やノード数を増やす場合は、サーバイメージのドライバが再インストールされるため、新しいノードごとに同じタスクが必要です。
  • ドライバコンテナがノードの OSとカーネルに対応するイメージを取得できない場合、当該ノードで GPUを使用できません。削除する前に、使用するドライババージョンのイメージが存在するかどうかを確認します。

以下の手順に従って進めてください。

  1. 以下のコマンドを実行し、対象ノードに新しい Podが配置されないようにした上で、実行中の Podを他のノードに移動します。<NODE_NAME>は対象ノードの名前に変更します。

    kubectl cordon "<NODE_NAME>"
    kubectl drain "<NODE_NAME>" --ignore-daemonsets --delete-emptydir-data
    
  2. 対象ノードにアクセスします。このステップは kubectlではなくノードで直接実行し、root権限が必要です。サーバイメージに含まれるドライバは、nvidia-uninstallで削除します。

    nvidia-uninstall --silent
    
  3. ノードを再起動します。ドライバファイルを削除してもカーネルモジュールはメモリに残っているため、再起動しないと GPU Operatorはドライバがインストールされていない状態として認識できません。

  4. ノードの準備が完了したら、以下のコマンドを実行して管理主体が切り替わったかを確認します。

    kubectl get node -l nvidia.com/gpu.present=true \
      -L nvidia.com/gpu.deploy.driver \
      -L nvidia.com/cuda.driver-version.full
    

    GPU.DEPLOY.DRIVER項目が trueに変わり、CUDA.DRIVER-VERSION.FULL項目に NVIDIADriverリソースで指定したバージョンが表示されると、切り替えが完了したことになります。

  5. 再起動後も GPU.DEPLOY.DRIVER項目が pre-installedと表示されたら、以下のコマンドを実行して値を更新します。<NODE_NAME>は対象ノードの名前に変更します。ドライバが実際に削除されたノードでのみこの値が維持され、ドライバが残っていると pre-installedに戻ります。

    kubectl label node "<NODE_NAME>" nvidia.com/gpu.deploy.driver=true --overwrite
    

    値が trueに維持される場合、ドライバ DaemonSetの配置対象に当該ノードが含まれ、ドライバコンテナが起動します。インストールが完了すると、CUDA.DRIVER-VERSION.FULL項目に指定したバージョンが表示されます。

  6. ドライバがインストールされ、GPUの使用確認に問題がなければ、以下のコマンドを実行して Pod配置を再度許可します。

    kubectl uncordon "<NODE_NAME>"
    

ドライババージョンの変更

ノードプールのドライババージョンを変更するには、当該 NVIDIADriverリソースの spec.version値を変更します。GPU Operatorは当該リソースが担当するノードにのみ upgradePolicyを適用し、順次ドライバを入れ替えます。upgradePolicy.autoUpgradeが falseのリソースは、バージョンを変更してもドライバが入れ替わらないため、trueに変更してから進めます。Ubuntu 20.04(XEN)ノードを使用する場合、リソースに upgradePolicy項目がないため、ClusterPolicyの driver.upgradePolicy値に従います。

注意

ドライバを入れ替える際、当該ノードで実行中の GPU Podが削除されます。サービス停止を避けるには、maxParallelUpgradesと maxUnavailable値を調整し、ワークロードを他のノードに移動できることを確認してから進めます。

入れ替えの対象から除外するノードがある場合は、バージョンを変更する前に以下のコマンドを実行してラベルを追加します。<NODE_NAME>は除外するノードの名前に変更します。ラベルを追加したノードは、ラベルを削除するまでドライバが入れ替わりません。

kubectl label node "<NODE_NAME>" nvidia.com/gpu-driver-upgrade.skip=true --overwrite

以下のコマンドを実行して、ドライババージョンを変更します。マニフェストファイルを保存する場合は、ファイルの version値も変更します。変更せずにファイルを再度適用すると、以前のバージョンに戻ります。

kubectl patch nvidiadriver "<GPU_NODEPOOL>" \
  --type merge -p '{"spec":{"version":"<DRIVER_VERSION>"}}'

以下のコマンドを実行して、アップグレードのステータスを確認します。

kubectl get node -l nvidia.com/gpu.present=true -L nvidia.com/gpu-driver-upgrade-state

アップグレード対象ノードがすべて upgrade-doneのステータスになると、アップグレードが完了します。

注意

GPU-DRIVER-UPGRADE-STATE項目が空欄になっていて、ドライバ Podも入れ替わっていない場合は、maxUnavailable値の形式を確認します。ノード数を "1"のように文字列として指定すると、アップグレードコントローラーが値を解釈できず、入れ替えが開始されません。このとき、ドライバ DaemonSetのイメージタグのみが新しいバージョンに変わり、Podは以前のバージョンで引き続き実行されるため、リソースとノードに異なるバージョンが表示されます。以下のコマンドで原因を確認できます。

kubectl --namespace gpu-operator logs deploy/gpu-operator | grep maxUnavailable

出力に invalid value for IntOrStringがある場合は、maxUnavailableを整数または "25%"形式に変更します。

ドライバ管理方法の切り替え

ClusterPolicyでドライバを管理しているクラスタを、NVIDIADriverリソース管理に切り替える手順です。チャートバージョンのアップグレードと管理方法の切り替えを、1つのコマンドで実行できます。

以下のコマンドを実行して、切り替えます。

helm upgrade gpu-operator nvidia/gpu-operator \
  --namespace gpu-operator \
  --version "<OPERATOR_VERSION>" \
  --reset-then-reuse-values \
  --disable-openapi-validation \
  --set operator.upgradeCRD=true \
  --set driver.nvidiaDriverCRD.enabled=true \
  --set driver.nvidiaDriverCRD.deployDefaultCR=true \
  --set driver.upgradePolicy.autoUpgrade=true \
  --wait
注意

チャートバージョンもアップグレードする場合、--reuse-valuesの代わりに --reset-then-reuse-valuesを使用してください。--reuse-valuesは以前のリリースの値のみを再利用し、新しいチャートのデフォルト値をマージしないため、新しいバージョンで追加された設定項目が空になり、アップグレードに失敗します。--reset-then-reuse-valuesは Helm 3.14から使用できます。

切り替えが完了したら、ノードプール別の構成作成で作成した nvidiadriver-nodepool.yamlを適用し、ノードプール別のリソースを追加します。チャートが作成した defaultリソースが、残りの GPUノードを引き続き担当します。

注意
  • このパスではチャートが defaultリソースを作成するため、nvidiadriver-default.yamlを適用しないでください。同じ名前のリソースを Helmとユーザーの両方で管理すると、その後のアップグレードで構成に差異が生じます。
  • 切り替えの過程で各ノードのドライバ Podが入れ替わるため、GPUワークロードが停止します。ワークロードをクリーンアップするか、移動してから進めてください。

GPU Operatorとリソースの削除

GPU Operatorを今後使用しない場合は、以下の手順で削除します。

注意

NVIDIADriverリソースを削除すると、当該リソースが担当するノードのドライバが削除され、GPUワークロードが停止します。実行中の GPUワークロードをクリーンアップしてから進めてください。

以下のコマンドを実行して、NVIDIADriverリソースを削除します。基本構成を直接作成しない場合、2つ目のコマンドは省略します。

kubectl delete -f nvidiadriver-nodepool.yaml
kubectl delete -f nvidiadriver-default.yaml

マニフェストファイルがない場合は、以下のコマンドを実行して名前を指定して削除できます。<RESOURCE_NAME>は照会したリソース名に変更します。

kubectl get nvidiadriver
kubectl delete nvidiadriver "<RESOURCE_NAME>"

以下のコマンドを実行して、Helmリリースを削除します。

helm uninstall gpu-operator --namespace gpu-operator

Helmリリースを削除しても CRDは削除されません。CRDが今後必要ない場合は、以下のコマンドを実行して、残っているリソースがないか先に確認します。

kubectl get nvidiadriver
kubectl get clusterpolicy

照会結果が空になっている場合は、以下のコマンドを実行して CRDを削除します。2つ目と3つ目のコマンドは、このドキュメントでは扱わない機能の CRDであるため、当該機能を使用している場合は、削除する前に残っているリソースがないか先に確認します。

kubectl delete crd nvidiadrivers.nvidia.com clusterpolicies.nvidia.com
kubectl delete crd gpuclusters.nvidia.com
kubectl delete crd computedomains.resource.nvidia.com computedomaincliques.resource.nvidia.com

チャートバージョンと設定に応じて一部の CRDがインストールされないことがあります。NotFoundエラーが表示された場合は、当該 CRDは存在しないため、スキップしてください。

注意
  • CRDを削除すると、当該 CRDで作成したリソースも一緒に削除され、復元できません。
  • GPU Operatorがドライバを管理していたノードでは、NVIDIADriverリソースを削除するとドライバ Podが終了し、カーネルモジュールも一緒にアンロードされます。サーバイメージに含まれるドライバを使用しているノードでは、GPU Operatorを削除してもドライバはそのまま維持されます。
  • ノードに追加された nvidia.com/ラベルは、Helmリリースを削除しても残ります。GPU Operatorを再インストールすると再計算されるため、そのままにしておいても問題ありません。

ノードを元の状態に復元するには、以下のコマンドを実行して残りのラベルを確認します。

kubectl get node -l nvidia.com/gpu.present=true -o name

ノードごとに以下のコマンドを実行して、残りのラベルキーを確認します。<NODE_NAME>は、以前照会したノード名に変更します。

kubectl get node "<NODE_NAME>" -o jsonpath='{.metadata.labels}' \
  | grep -o '"nvidia.com/[^"]*"' | tr -d '"'

確認したキーは、以下のコマンドを実行して削除します。<LABEL_KEY>は、削除するラベルキーに変更します。

kubectl label node "<NODE_NAME>" <LABEL_KEY>-

同じノードに GPU Operatorを再インストールする予定がある場合は、削除した後にノードを再起動します。Helmリリースを削除しても、ノードの /run/cdiには、以前インストールしたドライババージョンを参照する CDI構成が残ります。/runはノードを再インストールすると空になるため、再起動だけでクリーンアップされます。

注意

残っている CDI構成をクリーンアップせず、以前とは異なるドライババージョンで再インストールすると、コンポーネントが Initのステータスで停止し、Container Toolkit Podのログに以下のようなエラーが表示されます。

Failed to initialize NVML: Driver/library version mismatch

ノードには新しいバージョンのカーネルモジュールがロードされていますが、コンテナには以前のバージョンのライブラリが注入されることで発生します。Container Toolkit Podが起動すると CDI構成が新しく作成されますが、この Podの検証が先に失敗するため、自動的には解消されません。

ノードを再起動した後、構成の適用と確認で案内するコマンドで Podを再作成します。

制限事項

GPU Operatorを使用する際に、次の制限事項をご確認ください。

  • GPU Operatorは NKS Add-onとして提供しないため、インストール・アップグレード・削除をユーザーが直接管理します。
  • GPU Operatorが使用するコンテナイメージは、NVIDIAのサービス利用規約に従います。イメージを内部レジストリにコピー・再リリースする前に、サービス利用規約を確認します。
  • NVIDIADriverリソースの default項目と upgradePolicy項目は、v26.7.0から提供されます。以前のバージョンでは2つの項目を併用できず、アップグレードポリシーは ClusterPolicyでクラスタ単位に設定します。
  • サーバイメージのドライバを使用するノードではドライバコンテナが実行されず、NVIDIADriverリソースの version値は適用されません。ノードプールごとに異なるドライババージョンを使用するには、予めインストールされたドライバを削除する必要があり、ノードを追加・入れ替えるたびに同じタスクを行う必要があります。
  • MIG機能のサポート有無は、GPUサーバのハイパーバイザタイプによって異なります。使用中のサービスのサポート有無は、一般と KVM GPUをご参照ください。