NKP の Kubernetes クラスタに、Nutanix Enterprise AI(NAI)2.6 を展開してみます。今回は、NKP に GPU ノード プールを追加してみます。
前回はこちら。
今回の内容です。
- 0. NVIDIA GPU Operator のインストール
- 1. GPU ノード用 OS イメージ(Ubuntu 24.04)の作成
- 2. GPU ノード プールの追加
- 3. GPU ノードの Taint 設定
- おまけ:GPU ノード プールの削除

ドキュメントでは下記のあたりが参考になります。
0. NVIDIA GPU Operator のインストール
Kubernetes クラスタで NVIDIA GPU を利用可能にする NVIDIA GPU Operator は、今回は下記の投稿で事前にインストールしてあります。
ちなみに、GPU Operator のインストールは、GPU ノード プール追加の後でも大丈夫です。
1. GPU ノード用 OS イメージ(Ubuntu 24.04)の作成
GPU を使用できる Ubuntu 24.04 の OS イメージを作成します。
nkp create image nutanix ubuntu-24.04 \ --endpoint=10.1.7.25 \ --cluster=DX-Cluster \ --subnet=vlan-0-ipam \ --gpu-name="Ampere 16" \ --insecure
コマンドを実行すると、イメージが作成され、下記のようにイメージ名が表示されます。
- 作成されたイメージの名前:nkp-ubuntu-24.04-gpu-1.34.3-20260327170243
nutanix.nkp_image: RUNNING HANDLER [config : restart containerd] **********************************
nutanix.nkp_image: ok: [default]
nutanix.nkp_image:
nutanix.nkp_image: PLAY RECAP *********************************************************************
nutanix.nkp_image: default : ok=181 changed=92 unreachable=0 failed=0 skipped=200 rescued=0 ignored=0
nutanix.nkp_image:
==> nutanix.nkp_image: Halting the virtual machine...
==> nutanix.nkp_image: Creating image(s) from virtual machine nkp-ubuntu-24.04-gpu-1.34.3-20260327170243...
==> nutanix.nkp_image: Found disk to copy: SCSI:0
==> nutanix.nkp_image: Image successfully created: nkp-ubuntu-24.04-gpu-1.34.3-20260327170243 (2e5c7e25-ce40-4d2f-a183-4daa9f4a009c)
==> nutanix.nkp_image: Deleting virtual machine...
==> nutanix.nkp_image: Virtual machine successfully deleted
==> nutanix.nkp_image: Running post-processor: custom-post-processor (type shell-local)
==> nutanix.nkp_image (shell-local): Running local shell script: /tmp/packer-shell3226816332
==> nutanix.nkp_image: Running post-processor: packer-manifest (type manifest)
Build 'nutanix.nkp_image' finished after 12 minutes 46 seconds.
==> Wait completed after 12 minutes 46 seconds
==> Builds finished. The artifacts of successful builds are:
--> nutanix.nkp_image: nkp-ubuntu-24.04-gpu-1.34.3-20260327170243
--> nutanix.nkp_image: nkp-ubuntu-24.04-gpu-1.34.3-20260327170243
--> nutanix.nkp_image: nkp-ubuntu-24.04-gpu-1.34.3-20260327170243
ちなみにこの処理では、NKP Image Builder のコンテナ イメージが自動的にダウンロードされ、そのコンテナか ら packer build によるイメージ作成が実行されます。そして Cluster API のための設定には Ansible が利用されています。
gowatana@nkp-work-02:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE mesosphere/konvoy-bootstrap v2.17.1 8e340f81effb 2 weeks ago 2.92GB mesosphere/nkp-image-builder v2.17.1 a4d641c8824d 46 years ago 1.63GB
2. GPU ノード プールの追加
この環境の NKP クラスタは、default Namespace に作成されています。
gowatana@nkp-work-02:~$ kubectl get cluster -A NAMESPACE NAME CLUSTERCLASS PHASE AGE VERSION default nkpnai nkp-nutanix-v2.17.1 Provisioned 2d14h v1.34.3
現在のノード プールを確認してみます。
gowatana@nkp-work-02:~$ nkp get nodepool -c nkpnai NODEPOOL DESIRED READY KUBERNETES VERSION md-0 4 4 v1.34.3
ノード プールに対応する Machine Deployment も、default Namespace に作成されています。
gowatana@nkp-work-02:~$ kubectl get machinedeployments.cluster.x-k8s.io -A NAMESPACE NAME CLUSTER REPLICAS READY UPDATED UNAVAILABLE PHASE AGE VERSION default nkpnai-md-0-7pmtn nkpnai 4 4 4 0 Running 2d14h v1.34.3
ノード プールを作成します。
nkp create nodepool nutanix gpupool-1 \ --cluster-name=nkpnai \ --prism-element-cluster=PE \ --subnets=vlan-0-ipam \ --vm-image=nkp-ubuntu-24.04-gpu-1.34.3-20260327170243 \ --vcpus=16 \ --memory=40 \ --disk-size=300 \ --gpu-count=1 \ --gpu-name="Ampere 16"
少し待つと、gpupool-1 ノード プールによるノードが追加されます。
gowatana@nkp-work-02:~$ kubectl get nodes NAME STATUS ROLES AGE VERSION nkpnai-d9vzg-lnr76 Ready control-plane 7h32m v1.34.3 nkpnai-d9vzg-m6qcq Ready control-plane 7h28m v1.34.3 nkpnai-d9vzg-w9vkr Ready control-plane 7h24m v1.34.3 nkpnai-gpupool-1-6cszv-rkxtx-d5l9g Ready <none> 55s v1.34.3 nkpnai-md-0-7pmtn-lhd8x-ds29q Ready <none> 7h32m v1.34.3 nkpnai-md-0-7pmtn-lhd8x-mq4tt Ready <none> 7h34m v1.34.3 nkpnai-md-0-7pmtn-lhd8x-mxhw9 Ready <none> 7h31m v1.34.3 nkpnai-md-0-7pmtn-lhd8x-z2d4q Ready <none> 7h27m v1.34.3
3. GPU ノードの Taint 設定
Kubernetes クラスタに GPU ノードを追加すると、デフォルトでは GPU を使用しない Pod も起動されてしまいます。そこで、下記の投稿にあるように、GPU を使用しない Pod が GPU ノードで起動されないように、GPU ノードに Taint を設定しておきます。
gowatana@nkp-work-02:~$ kubectl taint node -l nvidia.com/gpu.present=true nvidia.com/gpu=true:NoSchedule node/nkpnai-gpupool-1-6cszv-rkxtx-d5l9g tainted
GPU ノードに Taint が追加されました。
gowatana@nkp-work-02:~$ kubectl get nodes -o 'custom-columns=NAME:.metadata.name,GPU_PRESENT:.metadata.labels.nvidia\.com/gpu\.present,TAINTS:.spec.taints' NAME GPU_PRESENT TAINTS nkpnai-d9vzg-lnr76 <none> [map[effect:NoSchedule key:node-role.kubernetes.io/control-plane]] nkpnai-d9vzg-m6qcq <none> [map[effect:NoSchedule key:node-role.kubernetes.io/control-plane]] nkpnai-d9vzg-w9vkr <none> [map[effect:NoSchedule key:node-role.kubernetes.io/control-plane]] nkpnai-gpupool-1-6cszv-rkxtx-d5l9g true [map[effect:NoSchedule key:nvidia.com/gpu value:true]] nkpnai-md-0-7pmtn-lhd8x-ds29q <none> <none> nkpnai-md-0-7pmtn-lhd8x-mq4tt <none> <none> nkpnai-md-0-7pmtn-lhd8x-mxhw9 <none> <none> nkpnai-md-0-7pmtn-lhd8x-z2d4q <none> <none>
ただし、ラボ環境でハードウェア リソースが限られているようであれば、あえて Taint を設定しないで、空きのあるノードで Pod を起動するという使い方も考えられます。
おまけ:GPU ノード プールの削除
ノード プールを削除する場合は、下記のようにコマンドを実行します。
gowatana@nkp-work-02:~$ nkp delete nodepool -c nkpnai gpupool-1 ✓ Deleting default/gpupool-1 nodepool resources
つづく。
