Kubernetes 用のセルフマネージド NVIDIA GPU ドライバへの移行 1.36
Kubernetes バージョン 1.36 以降、 IBM Cloud Kubernetes Service は、GPU ワーカーノードに NVIDIA GPU ドライバを自動的にインストールしなくなりました。 GPUワークロードを実行するには、GPUドライバを自分でインストールして管理する必要があります。
変更点
- バージョン 1.36 以降
- GPUドライバは、新規または交換されたGPUワーカーノードにはプリインストールされません。 以下のコンポーネントをインストールし、メンテナンスする必要があります:
- NVIDIA カーネルドライバ
- コンテナ・ランタイム・コンポーネント (
nvidia-container-toolkitなど) - Kubernetes デバイスプラグイン
- バージョン 1.35 以前
- GPUドライバは、 IBM、すべてのGPUワーカーノードに自動的にインストールされ、管理されます。
その影響は?
GPUリソースを要求するPodは、ワーカーノードに必要なGPUドライバをインストールするまで Pending。 ドライバがインストールされると、保留中のポッドは自動的に Running。
移行プロセスを理解する
セルフマネージドGPUドライバへの移行は、アップグレード中もGPUワークロードが実行され続けるように、特定のシーケンスに従って行われます:
-
インストール前の段階 :クラスタがまだバージョン 1.35 またはそれ以前を実行している間に、 NVIDIA GPU Operator をクラスタにインストールします。 インストール中に、既存のGPUノードにラベルを貼り、オペレータがプリインストールされたドライバと競合するドライバリソースを展開しないようにします。
-
コントロール・プレーンのアップグレード :クラスタ・コントロール・プレーンをバージョン 1.36 にアップグレードします。
-
ワーカーノードのアップグレード :各ワーカノードを置き換えてバージョンアップする 1.36。 こうすると、ドライバーの配備を妨げていたラベルは自動的に削除されます。 これにより、 NVIDIA GPU Operatorは、新しいノードにドライバー・スタックをデプロイすることができます。
-
ワークロードの自動回復 :オペレータが交換したノードにドライバをインストールすると、保留中のGPUワークロードは自動的に
Running。
バージョン 1.36 が利用可能になる前の移行準備
バージョン 1.36 がリリースされる前にプレインストールステップを完了することで、クラスタをよりスムーズに移行できるように準備することができます:
-
既存のGPUワーカーノードにラベルを付けて、オペレータがプリインストールされたドライバと競合するリソースをデプロイしないようにします。
kubectl label node/<node_name> nvidia.com/gpu.deploy.operands=false kubectl label node/<node_name> nvidia.com/gpu.deploy.driver=false -
NVIDIA GPU Operatorインストールガイドに従って、 NVIDIA GPU Operatorをインストールします。
-
オペレータがインストールされているが、ラベル付けされたノードにドライバリソースをデプロイしていないことを確認します。
kubectl get pods -n gpu-operator -o wide
これらの準備ステップを早めに完了させることで、バージョン 1.36 への実際のアップグレード時に必要な作業を減らすことができます。 バージョン 1.36 が利用可能になったら、コントロール・プレーンをアップグレードし、ワーカー・ノードを交換するだけです。
開始前に
- NVIDIA GPU Operatorのドキュメントを確認してください。
- クラスタ管理者アクセス権を持っていることを確認してください。
- クラスタ構成(シングルGPUノードとマルチGPUノード)に基づいてアップグレード戦略を計画してください。
マイグレーション例
以下の例は、GPUノードの数に基づいてクラスタを移行する方法を示しています。
例1:クラスタ内のシングルGPUノード
この例では、シングル GPU ノードによるクラスタの移行を示します。 アップグレード中は唯一の GPU ノードが使用できなくなるため、一時的に 2 番目の GPU ワーカーを追加して容量を維持します。
ステップ1:クラスタの初期状態を取得する
-
クラスタ・コントロール・プレーンのバージョンを確認する。
ibmcloud ks cluster get -c CLUSTER_NAMEバージョンを示す出力例 1.35:
Master Status: Ready State: deployed Health: normal Version: 1.35.4_1528 -
ワーカーノードのバージョンを確認する。
ibmcloud ks worker ls -c <cluster_name>単一のGPUノードを示す出力例:
ID Primary IP Flavor State Status Zone Version Operating System test-d8397vk20kb65iocenn0-btspstggput-default-000001e4 10.240.0.64 gx3.16x80.l4 normal Ready us-south-1 1.35.4_1528 UBUNTU_24_64
ステップ2: NVIDIA GPU Operatorをインストールする
バージョン 1.36 が利用可能になる前に移行の準備の ステップに従った場合、このステップはすでに完了しているかもしれません。
-
既存のGPUワーカーノードにラベルを付けて、オペレータがプリインストールされたドライバと競合するリソースを配置しないようにします。
kubectl label node/10.240.0.64 nvidia.com/gpu.deploy.operands=false kubectl label node/10.240.0.64 nvidia.com/gpu.deploy.driver=false -
NVIDIA Helm リポジトリを追加し、GPU オペレータをインストールします。
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia helm repo update helm install --wait --generate-name -n gpu-operator --create-namespace nvidia/gpu-operator -
GPUオペレーターポッドが実行中であることを確認してください。 ドライバインストーラ、デバイスプラグイン、コンテナツールキット、DCGMエクスポーターは、ラベル付けされたノード上で実行されてはならないことに注意。
kubectl get pods -n gpu-operator -o wide出力例:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES gpu-operator-1778819096-node-feature-discovery-gc-84d98bd6nqw2z 1/1 Running 0 2m21s 172.17.64.94 10.240.0.64 <none> <none> gpu-operator-1778819096-node-feature-discovery-master-6b6cpnm9w 1/1 Running 0 2m21s 172.17.64.93 10.240.0.64 <none> <none> gpu-operator-1778819096-node-feature-discovery-worker-hm7ft 1/1 Running 0 2m21s 172.17.64.91 10.240.0.64 <none> <none> gpu-operator-76c686b9df-kn4dw 1/1 Running 0 2m21s 172.17.64.92 10.240.0.64 <none> <none>
ステップ3: クラスター・コントロール・プレーンのアップグレード
-
クラスタ・コントロール・プレーンをバージョン 1.36 にアップグレードします。
ibmcloud ks cluster master update --cluster <cluster_name> --version 1.36.0 -
コントロールプレーンのアップグレードを確認します。
ibmcloud ks cluster get -c <cluster_name>出力例:
Master Status: Ready State: deployed Health: normal Version: 1.36.0_1506
ステップ4: 一時的なGPUワーカーノードの追加
-
Kubernetes バージョン 1.36 でクラスタに一時的に2つ目のGPUワーカーを追加する。
ibmcloud ks worker-pool create vpc-gen2 --name temp-gpu-pool --cluster <cluster_name> --flavor gx3.16x80.l4 --size-per-zone 1 --zone us-south-1 -
一時ノードが準備できていることを確認する。
ibmcloud ks worker ls -c <cluster_name>元のノードと一時的なノードの両方を示す出力例:
ID Primary IP Flavor State Status Zone Version Operating System test-d8397vk20kb65iocenn0-btspstggput-default-000001e4 10.240.0.64 gx3.16x80.l4 normal Ready us-south-1 1.35.4_1528 UBUNTU_24_64 test-d8397vk20kb65iocenn0-tempgpupool-default-00000371 10.240.0.72 gx3.16x80.l4 normal Ready us-south-1 1.36.0_1507 UBUNTU_24_64 -
GPUオペレータポッドが新しい一時ノード上で動作していることを確認します。
kubectl get pods -n gpu-operator -o wideテンポラリノード上で動作しているドライバーとデバイスプラグインを示す出力例:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES gpu-feature-discovery-mw5km 1/1 Running 0 4m36s 172.17.116.201 10.240.0.72 <none> <none> nvidia-container-toolkit-daemonset-ns6p8 1/1 Running 0 4m36s 172.17.116.199 10.240.0.72 <none> <none> nvidia-cuda-validator-vgj45 0/1 Completed 0 96s 172.17.116.203 10.240.0.72 <none> <none> nvidia-dcgm-exporter-52cwh 1/1 Running 0 4m36s 172.17.116.204 10.240.0.72 <none> <none> nvidia-device-plugin-daemonset-2ql7x 1/1 Running 0 4m36s 172.17.116.202 10.240.0.72 <none> <none> nvidia-driver-daemonset-zql6m 1/1 Running 0 5m29s 172.17.116.197 10.240.0.72 <none> <none> nvidia-operator-validator-44xtz 1/1 Running 0 4m36s 172.17.116.200 10.240.0.72 <none> <none> -
一時ノードのGPU準備完了を確認します。
kubectl get nodes -o json | jq '.items[] | {name: .metadata.name, allocatable: .status.allocatable}'
ステップ5:ワークロードの移行と元のノードのアップグレード
-
GPUワークロードを一時的な 1.36 ワーカーノードに移行します。 ノードセレクタ、テイント、または手動によるポッド削除を使用して、ワークロードを移動できます。
-
元のGPUノードを置き換える。
ibmcloud ks worker replace -w test-d8397vk20kb65iocenn0-btspstggput-default-000001e4 -c <cluster_name> --update -
ノードのアップグレードを確認します。
ibmcloud ks worker ls -c <cluster_name>両ノードのバージョンを示す出力例 1.36:
ID Primary IP Flavor State Status Zone Version Operating System test-d8397vk20kb65iocenn0-btspstggput-default-00000485 10.240.0.68 gx3.16x80.l4 normal Ready us-south-1 1.36.0_1507 UBUNTU_24_64 test-d8397vk20kb65iocenn0-tempgpupool-default-00000371 10.240.0.72 gx3.16x80.l4 normal Ready us-south-1 1.36.0_1507 UBUNTU_24_64 -
GPUオペレータポッドがアップグレードされた元のノード上で動作していることを確認します。
kubectl get pods -n gpu-operator -o wide -
すべてのGPUワークロードが実行されていることを確認します。
kubectl get pods -o wide出力例:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES gpu-burn-46pml 1/1 Running 0 6m8s 172.17.116.205 10.240.0.72 <none> <none> gpu-burn-z6xnh 1/1 Running 0 44m 172.17.121.28 10.240.0.68 <none> <none>
ステップ6:一時ノードの削除(オプション)
元のノードが健全でワークロードが安定したら、オプションで一時GPUノードを削除できます。
-
一時ワーカープールを削除する。
ibmcloud ks worker-pool rm --cluster <cluster_name> --worker-pool temp-gpu-pool -
元のノードだけが残っていることを確認する。
ibmcloud ks worker ls -c <cluster_name>
例2: クラスタ内の複数のGPUノード
この例では、2つのGPUノードを持つクラスタを Kubernetes バージョン 1.35 から 1.36 に移行する例を示します。 複数ノードの場合、GPU容量を維持しながらノードを1つずつアップグレードできます。
ステップ1:クラスタの初期状態を取得する
-
クラスタ・コントロール・プレーンのバージョンを確認する。
ibmcloud ks cluster get -c <cluster_name>バージョンを示す出力例 1.35:
Master Status: Ready State: deployed Health: normal Version: 1.35.4_1528 -
ワーカーノードのバージョンを確認する。
ibmcloud ks worker ls -c <cluster_name>2つのGPUノードを示す出力例:
ID Primary IP Flavor State Status Zone Version Operating System test-d8397vk20kb65iocenn0-btspstggput-default-000001e4 10.240.0.64 gx3.16x80.l4 normal Ready us-south-1 1.35.4_1528 UBUNTU_24_64 test-d8397vk20kb65iocenn0-btspstggput-default-0000024b 10.240.0.66 gx3.16x80.l4 normal Ready us-south-1 1.35.4_1528 UBUNTU_24_64
ステップ2: NVIDIA GPU Operatorをインストールする
バージョン 1.36 が利用可能になる前に移行の準備の ステップに従った場合、このステップはすでに完了しているかもしれません。
-
既存のGPUワーカーノードにラベルを付けて、オペレータがプリインストールされたドライバと競合するリソースを配置しないようにします。
kubectl label node/10.240.0.64 nvidia.com/gpu.deploy.operands=false kubectl label node/10.240.0.64 nvidia.com/gpu.deploy.driver=false kubectl label node/10.240.0.66 nvidia.com/gpu.deploy.operands=false kubectl label node/10.240.0.66 nvidia.com/gpu.deploy.driver=false -
NVIDIA Helm リポジトリを追加し、GPU オペレータをインストールします。
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia helm repo update helm install --wait --generate-name -n gpu-operator --create-namespace nvidia/gpu-operator -
GPUオペレーターポッドが実行中であることを確認してください。 ドライバインストーラ、デバイスプラグイン、コンテナツールキット、DCGMエクスポーターは、ラベル付けされたノード上で実行されてはならないことに注意してください。
kubectl get pods -n gpu-operator -o wide出力例:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES gpu-operator-1778819096-node-feature-discovery-gc-84d98bd6nqw2z 1/1 Running 0 2m21s 172.17.64.94 10.240.0.64 <none> <none> gpu-operator-1778819096-node-feature-discovery-master-6b6cpnm9w 1/1 Running 0 2m21s 172.17.64.93 10.240.0.64 <none> <none> gpu-operator-1778819096-node-feature-discovery-worker-hm7ft 1/1 Running 0 2m21s 172.17.64.91 10.240.0.64 <none> <none> gpu-operator-1778819096-node-feature-discovery-worker-xh4qz 1/1 Running 0 2m21s 172.17.121.29 10.240.0.66 <none> <none> gpu-operator-76c686b9df-kn4dw 1/1 Running 0 2m21s 172.17.64.92 10.240.0.64 <none> <none>
ステップ3: クラスター・コントロール・プレーンのアップグレード
-
クラスタ・コントロール・プレーンをバージョン 1.36 にアップグレードします。
ibmcloud ks cluster master update --cluster <cluster_name> --version 1.36.0 -
コントロールプレーンのアップグレードを確認します。
ibmcloud ks cluster get -c <cluster_name>出力例:
Master Status: Ready State: deployed Health: normal Version: 1.36.0_1506
ステップ4:最初のワーカーノードをアップグレードする
-
最初のワーカーノードを交換してください。
ibmcloud ks worker replace -w test-d8397vk20kb65iocenn0-btspstggput-default-000001e4 -c <cluster_name> --update -
ノードのアップグレードを確認します。
ibmcloud ks worker ls -c <cluster_name>出力例:
ID Primary IP Flavor State Status Zone Version Operating System test-d8397vk20kb65iocenn0-btspstggput-default-0000024b 10.240.0.66 gx3.16x80.l4 normal Ready us-south-1 1.35.4_1528 UBUNTU_24_64 test-d8397vk20kb65iocenn0-btspstggput-default-00000371 10.240.0.72 gx3.16x80.l4 normal Ready us-south-1 1.36.0_1507 UBUNTU_24_64 -
GPUのワークロード状況を確認する。 新しいノードでスケジュールされたGPUワークロードは、ドライバがインストールされるまで
Pending。kubectl get pods -o wide出力例:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES gpu-burn-46pml 0/1 Pending 0 18s <none> <none> <none> <none> gpu-burn-z6xnh 1/1 Running 0 38m 172.17.121.28 10.240.0.66 <none> <none> -
GPUオペレータポッドが新しいノードで動作していることを確認します。
kubectl get pods -n gpu-operator -o wide新しいノード上で実行されているドライバーとデバイスプラグインを示す出力例:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES gpu-feature-discovery-mw5km 1/1 Running 0 4m36s 172.17.116.201 10.240.0.72 <none> <none> nvidia-container-toolkit-daemonset-ns6p8 1/1 Running 0 4m36s 172.17.116.199 10.240.0.72 <none> <none> nvidia-cuda-validator-vgj45 0/1 Completed 0 96s 172.17.116.203 10.240.0.72 <none> <none> nvidia-dcgm-exporter-52cwh 1/1 Running 0 4m36s 172.17.116.204 10.240.0.72 <none> <none> nvidia-device-plugin-daemonset-2ql7x 1/1 Running 0 4m36s 172.17.116.202 10.240.0.72 <none> <none> nvidia-driver-daemonset-zql6m 1/1 Running 0 5m29s 172.17.116.197 10.240.0.72 <none> <none> nvidia-operator-validator-44xtz 1/1 Running 0 4m36s 172.17.116.200 10.240.0.72 <none> <none> -
新しいノードでスケジュールされたGPUワークロードを確認します。
kubectl get pods -o wide出力例:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES gpu-burn-46pml 1/1 Running 0 6m8s 172.17.116.205 10.240.0.72 <none> <none> gpu-burn-z6xnh 1/1 Running 0 44m 172.17.121.28 10.240.0.66 <none> <none>
ステップ5:残りのノードのアップグレード
-
残りの各GPUノードについてステップ4を繰り返し、1ノードずつアップグレードします。
-
すべてのノードがアップグレードされた後、すべてのワーカーノードがバージョン 1.36 を実行していることを確認します。
ibmcloud ks worker ls -c <cluster_name>出力例:
ID Primary IP Flavor State Status Zone Version Operating System test-d8397vk20kb65iocenn0-btspstggput-default-00000371 10.240.0.72 gx3.16x80.l4 normal Ready us-south-1 1.36.0_1507 UBUNTU_24_64 test-d8397vk20kb65iocenn0-btspstggput-default-0000048c 10.240.0.73 gx3.16x80.l4 normal Ready us-south-1 1.36.0_1507 UBUNTU_24_64 -
すべてのGPUオペレータポッドが動作していることを確認します。
kubectl get pods -n gpu-operator -o wide -
すべてのGPUワークロードが実行されていることを確認します。
kubectl get pods -o wide出力例:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES gpu-burn-46pml 1/1 Running 0 18m 172.17.116.205 10.240.0.72 <none> <none> gpu-burn-ttcbt 1/1 Running 0 6m46s 172.17.75.77 10.240.0.73 <none> <none>
次のステップ
- GPUワークロードを監視し、それらが正しく実行されていることを確認します。
- 高度な設定オプションについては、 NVIDIA GPU Operatorのドキュメントを参照してください。
- NVIDIA DCGMエクスポーターを使用して、GPUメトリクスのモニタリングを設定します。