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. インストール前の段階 :クラスタがまだバージョン 1.35 またはそれ以前を実行している間に、 NVIDIA GPU Operator をクラスタにインストールします。 インストール中に、既存のGPUノードにラベルを貼り、オペレータがプリインストールされたドライバと競合するドライバリソースを展開しないようにします。

  2. コントロール・プレーンのアップグレード :クラスタ・コントロール・プレーンをバージョン 1.36 にアップグレードします。

  3. ワーカーノードのアップグレード :各ワーカノードを置き換えてバージョンアップする 1.36。 こうすると、ドライバーの配備を妨げていたラベルは自動的に削除されます。 これにより、 NVIDIA GPU Operatorは、新しいノードにドライバー・スタックをデプロイすることができます。

  4. ワークロードの自動回復 :オペレータが交換したノードにドライバをインストールすると、保留中のGPUワークロードは自動的に Running。

バージョン 1.36 が利用可能になる前の移行準備

バージョン 1.36 がリリースされる前にプレインストールステップを完了することで、クラスタをよりスムーズに移行できるように準備することができます:

  1. 既存のGPUワーカーノードにラベルを付けて、オペレータがプリインストールされたドライバと競合するリソースをデプロイしないようにします。

    kubectl label node/<node_name> nvidia.com/gpu.deploy.operands=false
    kubectl label node/<node_name> nvidia.com/gpu.deploy.driver=false
    
  2. NVIDIA GPU Operatorインストールガイドに従って、 NVIDIA GPU Operatorをインストールします。

  3. オペレータがインストールされているが、ラベル付けされたノードにドライバリソースをデプロイしていないことを確認します。

    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:クラスタの初期状態を取得する

  1. クラスタ・コントロール・プレーンのバージョンを確認する。

    ibmcloud ks cluster get -c CLUSTER_NAME
    

    バージョンを示す出力例 1.35:

    Master
    Status:     Ready
    State:      deployed
    Health:     normal
    Version:    1.35.4_1528
    
  2. ワーカーノードのバージョンを確認する。

    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 が利用可能になる前に移行の準備の ステップに従った場合、このステップはすでに完了しているかもしれません。

  1. 既存の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
    
  2. 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
    
  3. 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. クラスタ・コントロール・プレーンをバージョン 1.36 にアップグレードします。

    ibmcloud ks cluster master update --cluster <cluster_name> --version 1.36.0
    
  2. コントロールプレーンのアップグレードを確認します。

    ibmcloud ks cluster get -c <cluster_name>
    

    出力例:

    Master
    Status:     Ready
    State:      deployed
    Health:     normal
    Version:    1.36.0_1506
    

ステップ4: 一時的なGPUワーカーノードの追加

  1. 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
    
  2. 一時ノードが準備できていることを確認する。

    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
    
  3. 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>
    
  4. 一時ノードのGPU準備完了を確認します。

    kubectl get nodes -o json | jq '.items[] | {name: .metadata.name, allocatable: .status.allocatable}'
    

ステップ5:ワークロードの移行と元のノードのアップグレード

  1. GPUワークロードを一時的な 1.36 ワーカーノードに移行します。 ノードセレクタ、テイント、または手動によるポッド削除を使用して、ワークロードを移動できます。

  2. 元のGPUノードを置き換える。

    ibmcloud ks worker replace -w test-d8397vk20kb65iocenn0-btspstggput-default-000001e4 -c <cluster_name> --update
    
  3. ノードのアップグレードを確認します。

    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
    
  4. GPUオペレータポッドがアップグレードされた元のノード上で動作していることを確認します。

    kubectl get pods -n gpu-operator -o wide
    
  5. すべての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ノードを削除できます。

  1. 一時ワーカープールを削除する。

    ibmcloud ks worker-pool rm --cluster <cluster_name> --worker-pool temp-gpu-pool
    
  2. 元のノードだけが残っていることを確認する。

    ibmcloud ks worker ls -c <cluster_name>
    

例2: クラスタ内の複数のGPUノード

この例では、2つのGPUノードを持つクラスタを Kubernetes バージョン 1.35 から 1.36 に移行する例を示します。 複数ノードの場合、GPU容量を維持しながらノードを1つずつアップグレードできます。

ステップ1:クラスタの初期状態を取得する

  1. クラスタ・コントロール・プレーンのバージョンを確認する。

    ibmcloud ks cluster get -c <cluster_name>
    

    バージョンを示す出力例 1.35:

    Master
    Status:     Ready
    State:      deployed
    Health:     normal
    Version:    1.35.4_1528
    
  2. ワーカーノードのバージョンを確認する。

    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 が利用可能になる前に移行の準備の ステップに従った場合、このステップはすでに完了しているかもしれません。

  1. 既存の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
    
  2. 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
    
  3. 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. クラスタ・コントロール・プレーンをバージョン 1.36 にアップグレードします。

    ibmcloud ks cluster master update --cluster <cluster_name> --version 1.36.0
    
  2. コントロールプレーンのアップグレードを確認します。

    ibmcloud ks cluster get -c <cluster_name>
    

    出力例:

    Master
    Status:     Ready
    State:      deployed
    Health:     normal
    Version:    1.36.0_1506
    

ステップ4:最初のワーカーノードをアップグレードする

  1. 最初のワーカーノードを交換してください。

    ibmcloud ks worker replace -w test-d8397vk20kb65iocenn0-btspstggput-default-000001e4 -c <cluster_name> --update
    
  2. ノードのアップグレードを確認します。

    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
    
  3. 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>
    
  4. 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>
    
  5. 新しいノードでスケジュールされた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:残りのノードのアップグレード

  1. 残りの各GPUノードについてステップ4を繰り返し、1ノードずつアップグレードします。

  2. すべてのノードがアップグレードされた後、すべてのワーカーノードがバージョン 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
    
  3. すべてのGPUオペレータポッドが動作していることを確認します。

    kubectl get pods -n gpu-operator -o wide
    
  4. すべての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メトリクスのモニタリングを設定します。