GPUオペレーター

NVIDIAオペレーターをデプロイする

NVIDIAオペレーターは、Kubernetesクラスターの管理者がGPUをCPUのように管理できるようにします。ポッドがGPUを操作するために必要なすべてが含まれています。

ホストOSの要件

GPUをポッドに正しく公開するには、NVIDIAカーネルドライバーと`libnvidia-ml`ライブラリがホストOSに正しくインストールされている必要があります。NVIDIAオペレーターは、一部のオペレーティングシステムに自動的にドライバーとライブラリをインストールできます。 サポートされているオペレーティングシステムリリースに関する情報は、NVIDIAのドキュメントを参照してください。ホストOSにNVIDIAコンポーネントをインストールすることは、このドキュメントの範囲外です。手順についてはNVIDIAのドキュメントを参照してください。

カーネルドライバーが正しくインストールされている場合、次の3つのコマンドは正しい出力を返す必要があります:

  • `lsmod | grep nvidia`はnvidiaカーネルモジュールのリストを返します。次に例を示します。

    nvidia_uvm           2129920  0
    nvidia_drm            131072  0
    nvidia_modeset       1572864  1 nvidia_drm
    video                  77824  1 nvidia_modeset
    nvidia               9965568  2 nvidia_uvm,nvidia_modeset
    ecc                    45056  1 nvidia
  • `cat /proc/driver/nvidia/version`はドライバーのNVRMおよびGCCバージョンを返します。次に例を示します。

    NVRM version: NVIDIA UNIX Open Kernel Module for x86_64  555.42.06  Release Build  (abuild@host)  Thu Jul 11 12:00:00 UTC 2024
    GCC version:  gcc version 7.5.0 (SUSE Linux)
  • `find /usr/ -iname libnvidia-ml.so`は`libnvidia-ml.so`ライブラリへのパスを返します。次に例を示します。

    /usr/lib64/libnvidia-ml.so

    このライブラリは、Kubernetesコンポーネントがカーネルドライバーと対話するために使用されます。

オペレーターのインストール

OSが準備でき、RKE2が実行中である場合、次のyamlマニフェストを使用してGPUオペレーターをインストールします。

  • v25.3.x

  • v25.10.x

apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
  name: gpu-operator
  namespace: kube-system
spec:
  repo: https://helm.ngc.nvidia.com/nvidia
  chart: gpu-operator
  version: v25.3.4
  targetNamespace: gpu-operator
  createNamespace: true
  valuesContent: |-
    toolkit:
      env:
      - name: CONTAINERD_SOCKET
        value: /run/k3s/containerd/containerd.sock
      - name: ACCEPT_NVIDIA_VISIBLE_DEVICES_ENVVAR_WHEN_UNPRIVILEGED
        value: "false"
      - name: ACCEPT_NVIDIA_VISIBLE_DEVICES_AS_VOLUME_MOUNTS
        value: "true"
    devicePlugin:
      env:
      - name: DEVICE_LIST_STRATEGY
        value: volume-mounts

envvars ACCEPT_NVIDIA_VISIBLE_DEVICES_ENVVAR_WHEN_UNPRIVILEGEDACCEPT_NVIDIA_VISIBLE_DEVICES_AS_VOLUME_MOUNTS、および`DEVICE_LIST_STRATEGY`は、NVIDIA ドキュメントで説明されているように、GPUリソースを適切に隔離するために必要です。

apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
  name: gpu-operator
  namespace: kube-system
spec:
  repo: https://helm.ngc.nvidia.com/nvidia
  chart: gpu-operator
  version: v25.10.1
  targetNamespace: gpu-operator
  createNamespace: true
  valuesContent: |-
    toolkit:
      env:
      - name: CONTAINERD_SOCKET
        value: /run/k3s/containerd/containerd.sock

NVIDIA GPUオペレーターv25.10.xは、 コンテナデバイスインターフェース(CDI)仕様を使用しており、これにより操作が簡素化されます:セキュリティ要件を満たすために追加のenvvarsを渡す必要がなく、ワークロードはもはや`runtimeClassName: nvidia`を渡す必要がありません。

NVIDIAオペレーターは、hangupコールでcontainerdを再起動し、RKE2を再起動します。

約1分後、すべてが期待通りに動作していることを確認するために、次のチェックを行うことができます。

  1. ドライバーと`libnvidia-ml.so`ライブラリが以前にインストールされていると仮定して、オペレーターがそれらを正しく検出しているか確認してください。

    kubectl get node $NODENAME -o jsonpath='{.metadata.labels}' | grep "nvidia.com/gpu.deploy.driver"

    `pre-installed`の値が表示されることを確認してください。`true`が表示される場合、ドライバーが正しくインストールされていません。前提条件が正しい場合、すべてのパッケージをインストールした後にノードを再起動するのを忘れた可能性があります。

    他のドライバーラベルも次のコマンドで確認できます。

    kubectl get node $NODENAME -o jsonpath='{.metadata.labels}' |  grep "nvidia.com"

    ドライバーとGPUを指定するラベル(例:nvidia.com/gpu.machine`または`nvidia.com/cuda.driver.major)が表示されることを確認してください。

  2. ノードにおいて、`nvidia-device-plugin-daemonset`によってGPUが割り当て可能なリソースとして追加されたか確認してください。

    kubectl get node $NODENAME -o jsonpath='{.status.allocatable}'

    ノードで`"nvidia.com/gpu":`の後にGPUの数が表示されることを確認してください。

  3. コンテナランタイムバイナリが存在することを確認してください(`nvidia-container-toolkit-daemonset`によってインストールされます):

    ls /usr/local/nvidia/toolkit/nvidia-container-runtime
  4. NVIDIAコンテナランタイムを含むようにcontainerdの設定が更新されたか確認してください。

    grep nvidia /var/lib/rancher/rke2/agent/etc/containerd/config.toml
  5. ポッドを実行して、GPUリソースがポッドに正常にスケジュールされ、ポッドがそれを検出できることを確認してください。

    apiVersion: v1
    kind: Pod
    metadata:
      name: nbody-gpu-benchmark
      namespace: default
    spec:
      restartPolicy: OnFailure
      # runtimeClassName: nvidia <== Only needed for v25.3.x
      containers:
    ** name: cuda-container
    image: nvcr.io/nvidia/k8s/cuda-sample:nbody
    args: ["nbody", "-gpu", "-benchmark"]
    resources:
    limits:
      nvidia.com/gpu: 1
バージョンゲート

2024年10月のリリースから利用可能:v1.28.15+rke2r1、v1.29.10+rke2r1、v1.30.6+rke2r1、v1.31.2+rke2r1。

RKE2は、コンテナランタイムパッケージによって使用されるデフォルトのパスを確認することに加えて、代替のコンテナランタイムを見つけるために`PATH`を使用します。この機能を使用するには、RKE2サービスのPATH環境変数を変更して、コンテナランタイムバイナリを含むディレクトリを追加する必要があります。

この2つの環境ファイルのいずれかを変更することをお勧めします:

  • /etc/default/rke2-server # またはrke2-agent

  • /etc/sysconfig/rke2-server # またはrke2-agent

この例では、PATH`を/etc/default/rke2-server`に追加します。

`PATH`の変更は、rootユーザーとして実行されるサービスのパスに信頼できないバイナリを配置しないように注意して行う必要があります。

echo PATH=$PATH >> /etc/default/rke2-server