Nutanix Kubernetes Platform(NKP)で GPU ノード プールを作成すると、デフォルトでは GPU を必要としない Pod であっても、GPU ノードで起動されてしまいます。そこで、Kubernetes の Taint と toleration により、GPU Pod が起動されるノードを調整してみます。
今回の内容です。
GPU Pod の起動制御について
Nutanix Enterprise AI(NAI)では、推論サービス エンドの GPU Pod を起動します。そのため、NAI のドキュメントでは、下記のように、Kubernetes の Taint と toleration で GPU Pod が起動されるノードを調整する方法が案内されています。
Nutanix Enterprise AI Requirements
After you configure a worker node pool with NVIDIA GPUs, ensure that you taint the worker nodes with the key nvidia.com/gpu and the effect NoSchedule, to enable inference pods with matching toleration to be scheduled on the tainted worker node. Any pods that do not require GPUs will not be scheduled on the tainted worker node.
これは、下記のように Pod の起動を制御します。
- GPU を搭載している Kubernetes ノードには、Pod を起動しないように Taint を設定する。
- GPU Pod には、その Taint を許容する Toleration を設定して起動可能にする。
今回の環境
NKP の Kubernetes クラスタを用意してあります。今回は、NKP の管理クラスタをそのまま NAI を展開しています。
demo@nkp-work-01:~$ kubectl get nodes NAME STATUS ROLES AGE VERSION nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm Ready <none> 34d v1.33.5 nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 Ready <none> 102d v1.33.5 nkpnai-md-0-xqwvn-zlrmk-62gc2 Ready <none> 102d v1.33.5 nkpnai-md-0-xqwvn-zlrmk-c5h88 Ready <none> 102d v1.33.5 nkpnai-md-0-xqwvn-zlrmk-knrqk Ready <none> 102d v1.33.5 nkpnai-md-0-xqwvn-zlrmk-zhdm4 Ready <none> 102d v1.33.5 nkpnai-vvzvd-cctr2 Ready control-plane 102d v1.33.5 nkpnai-vvzvd-ck76s Ready control-plane 102d v1.33.5 nkpnai-vvzvd-k4z42 Ready control-plane 102d v1.33.5
GPU を搭載したノード プール(nkpnai-gpupool-1-z9mz6)に、2ノード展開してあります。
demo@nkp-work-01:~$ kubectl get machinedeployments.cluster.x-k8s.io NAME CLUSTER REPLICAS READY UPDATED UNAVAILABLE PHASE AGE VERSION nkpnai-gpupool-1-z9mz6 nkpnai 2 2 2 0 Running 102d v1.33.5 nkpnai-md-0-xqwvn nkpnai 4 4 4 0 Running 102d v1.33.5
kubectl get nodes で、GPU ノードのみ取得してみます。このクラスタには NVIDIA GPU Operator がインストールされているので、GPU 搭載ノードには「nvidia.com/gpu.present: true」ラベルが付与されています。
demo@nkp-work-01:~$ kubectl get nodes -l nvidia.com/gpu.present=true NAME STATUS ROLES AGE VERSION nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm Ready <none> 34d v1.33.5 nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 Ready <none> 102d v1.33.5
NAI の nai-system Namespace の Pod の起動ノードを確認すると、GPU を必要としていない Pod(nai-db-0 など)も、GPU ノード(nkpnai-gpupool-1-z9mz6-~)で起動されています。ちなみに、全ノードで起動される DaemonSet など、GPU を必要としていなくても GPU ノードで起動される例外もあります。
demo@nkp-work-01:~$ kubectl get pod -n nai-system -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES chi-nai-clickhouse-server-chcluster1-0-0-0 1/1 Running 0 40d 192.168.2.168 nkpnai-md-0-xqwvn-zlrmk-knrqk <none> <none> chk-nai-clickhouse-keeper-chkeeper-0-0-0 1/1 Running 0 40d 192.168.3.242 nkpnai-md-0-xqwvn-zlrmk-62gc2 <none> <none> iam-database-bootstrap-8wrkc-n9jhm 0/1 Completed 0 40d 192.168.2.141 nkpnai-md-0-xqwvn-zlrmk-knrqk <none> <none> iam-proxy-b798b7fcd-7kldt 1/1 Running 0 40d 192.168.3.168 nkpnai-md-0-xqwvn-zlrmk-62gc2 <none> <none> iam-proxy-control-plane-8674b9c87b-j7mxp 1/1 Running 0 40d 192.168.3.24 nkpnai-md-0-xqwvn-zlrmk-62gc2 <none> <none> iam-themis-7787f8dff4-66czf 1/1 Running 0 40d 192.168.3.232 nkpnai-md-0-xqwvn-zlrmk-62gc2 <none> <none> iam-themis-bootstrap-jdybv-7fsqg 0/1 Completed 0 40d 192.168.3.233 nkpnai-md-0-xqwvn-zlrmk-62gc2 <none> <none> iam-ui-55bcb984f9-zmk74 1/1 Running 0 40d 192.168.2.77 nkpnai-md-0-xqwvn-zlrmk-knrqk <none> <none> iam-user-authn-7f754498cf-mgg26 1/1 Running 0 40d 192.168.3.225 nkpnai-md-0-xqwvn-zlrmk-62gc2 <none> <none> nai-api-5d4795bf9f-qjvn4 1/1 Running 0 40d 192.168.1.179 nkpnai-md-0-xqwvn-zlrmk-c5h88 <none> <none> nai-api-db-migrate-lylzy-kc976 0/1 Completed 0 40d 192.168.4.235 nkpnai-md-0-xqwvn-zlrmk-zhdm4 <none> <none> nai-clickhouse-schema-job-1770036715-twbl4 0/1 Completed 0 40d 192.168.1.52 nkpnai-md-0-xqwvn-zlrmk-c5h88 <none> <none> nai-db-0 1/1 Running 0 40d 192.168.7.78 nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 <none> <none> nai-iep-model-controller-5c74b76dc9-sflrw 1/1 Running 0 40d 192.168.2.26 nkpnai-md-0-xqwvn-zlrmk-knrqk <none> <none> nai-labs-8448976b65-dj4gh 1/1 Running 0 40d 192.168.1.251 nkpnai-md-0-xqwvn-zlrmk-c5h88 <none> <none> nai-oauth2-proxy-585dc57587-8d66d 1/1 Running 0 40d 192.168.3.51 nkpnai-md-0-xqwvn-zlrmk-62gc2 <none> <none> nai-oidc-client-registration-wcazn-t92zm 0/1 Completed 0 40d 192.168.4.163 nkpnai-md-0-xqwvn-zlrmk-zhdm4 <none> <none> nai-operators-nai-clickhouse-operator-584d9f7b44-lsgwz 2/2 Running 0 40d 192.168.7.138 nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 <none> <none> nai-otel-collector-collector-4hzkt 0/1 Init:0/1 0 40d <none> nkpnai-vvzvd-k4z42 <none> <none> nai-otel-collector-collector-4phpg 0/1 Init:0/1 0 40d <none> nkpnai-vvzvd-ck76s <none> <none> nai-otel-collector-collector-5jp8s 0/1 Init:0/1 0 40d <none> nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 <none> <none> nai-otel-collector-collector-7mt45 0/1 Init:0/1 0 40d <none> nkpnai-md-0-xqwvn-zlrmk-c5h88 <none> <none> nai-otel-collector-collector-bbhjf 0/1 Init:0/1 0 40d <none> nkpnai-md-0-xqwvn-zlrmk-62gc2 <none> <none> nai-otel-collector-collector-bdwkr 0/1 Init:0/1 0 40d <none> nkpnai-md-0-xqwvn-zlrmk-zhdm4 <none> <none> nai-otel-collector-collector-cghpt 0/1 Init:0/1 0 40d <none> nkpnai-md-0-xqwvn-zlrmk-knrqk <none> <none> nai-otel-collector-collector-qf65b 0/1 Init:0/1 0 40d <none> nkpnai-vvzvd-cctr2 <none> <none> nai-otel-collector-collector-rjxww 0/1 Init:0/1 0 34d <none> nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm <none> <none> nai-otel-collector-targetallocator-7f4654bd9c-kbtl6 1/1 Running 0 40d 192.168.3.159 nkpnai-md-0-xqwvn-zlrmk-62gc2 <none> <none> nai-pulse-job-29558885-jj4cn 0/1 Completed 0 11h 192.168.8.242 nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm <none> <none> nai-ui-7bd775976b-wvkbj 1/1 Running 0 40d 192.168.7.155 nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 <none> <none> redis-standalone-86cb5b9c4d-nskkm 2/2 Running 0 40d 192.168.3.34 nkpnai-md-0-xqwvn-zlrmk-62gc2 <none> <none>
Namespace 横断(-A オプション)で、「gpupool」を含む名前のノードで起動されている Pod の、Pod 名のみを表示してみます。ここでも、GPU を使用していなそうな多くの Pod が、GPU ノードで起動されていることがわかります。
demo@nkp-work-01:~$ kubectl get pod -A -o wide | grep gpupool | awk '{print $2}'
envoy-gateway-667545bc7d-6vp85
git-operator-admin-credentials-rotate-29556000-9q8pj
git-operator-admin-credentials-rotate-29557440-hpggd
git-operator-admin-credentials-rotate-29558880-clnfh
git-operator-git-0
ai-navigator-app-7c4d994b45-cfxcj
alertmanager-kube-prometheus-stack-alertmanager-0
create-kommander-thanos-query-stores-configmap-x5t8j
dkp-ceph-prereq-job-xqh57
gpu-feature-discovery-kwwk8
gpu-feature-discovery-l88mj
grafana-logging-548947487c-8dwxz
grafana-loki-pre-install-zr6qj
kommander-capimate-7bfd498cc9-p2vjn
kommander-webhook-9786644c6-tqnsf
kube-prometheus-stack-grafana-74b7f5f98-97m4r
kube-prometheus-stack-kube-state-metrics-58b99f6dc7-dw59v
kube-prometheus-stack-operator-57f998d8d7-ws6qx
kube-prometheus-stack-prometheus-node-exporter-md6lv
kube-prometheus-stack-prometheus-node-exporter-v47b8
kubecost-aggregator-0
kubecost-cost-analyzer-6645f49489-644jz
kubecost-pre-install-m4zjx
kubernetes-dashboard-api-6b948766f5-btmhf
kubernetes-dashboard-auth-66ccf9f644-87qtm
kubernetes-dashboard-kong-5d8d8bc7b8-np4mn
kubernetes-dashboard-metrics-scraper-7fbb77f87f-pbbp9
kubernetes-dashboard-web-6cd6897bc7-wpkzd
kubetunnel-5ff4dcd89-zmcng
logging-operator-6bbf786d9d-vhntl
logging-operator-logging-fluentbit-bfkvf
logging-operator-logging-fluentbit-bzjj4
logging-operator-logging-fluentd-0
nkp-insights-management-mgmt-cm-f799c5db5-9zmbv
nvidia-container-toolkit-daemonset-9l5r8
nvidia-container-toolkit-daemonset-x5tbz
nvidia-cuda-validator-9ddj2
nvidia-cuda-validator-z629w
nvidia-dcgm-5xlwt
nvidia-dcgm-exporter-77tb5
nvidia-dcgm-exporter-m9fz5
nvidia-dcgm-wdslq
nvidia-device-plugin-daemonset-bcs44
nvidia-device-plugin-daemonset-rmjqx
nvidia-operator-validator-tvx78
nvidia-operator-validator-wb926
prometheus-kube-prometheus-stack-prometheus-0
rook-ceph-crashcollector-nkpnai-gpupool-1-z9mz6-pl9k2-9xdncb7qm
rook-ceph-exporter-nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9-66dcscvdc
rook-ceph-mon-c-6677bd9675-bblzt
rook-ceph-osd-1-7649b4c9fd-ckqtl
rook-ceph-osd-prepare-rook-ceph-osd-set1-data-0vnfjx-5lr2w
rook-ceph-rgw-dkp-object-store-a-78c469b85f-xwbrd
thanos-query-54bb4455d-npzp2
velero-f5fdcccc-hp2fp
velero-pre-install-gb8h8
kserve-controller-manager-59d84566d-vrntb
cilium-4zvfr
cilium-envoy-2s6zw
cilium-envoy-9bd9h
cilium-p8kpp
kube-proxy-lrj8t
kube-proxy-rtd8g
metallb-speaker-lkjnf
metallb-speaker-mmfgw
llama32-iep-predictor-566f5bdd89-2llq5
nai-db-0
nai-operators-nai-clickhouse-operator-584d9f7b44-lsgwz
nai-otel-collector-collector-5jp8s
nai-otel-collector-collector-rjxww
nai-pulse-job-29558885-jj4cn
nai-ui-7bd775976b-wvkbj
node-feature-discovery-worker-gl2hk
node-feature-discovery-worker-p2t9f
nutanix-csi-node-qflqg
nutanix-csi-node-tv9lk
GPU ノードの Taint 設定
まず、Kubernetes ノードの Taint の設定状況を確認しておきます。デフォルトでは、GPU ノード プールで展開されたノード(nkpnai-gpupool-1-z9mz6-~)には Taint が設定されていません。
demo@nkp-work-01:~$ 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-gpupool-1-z9mz6-pl9k2-4n5fm true <none> nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 true <none> nkpnai-md-0-xqwvn-zlrmk-62gc2 <none> <none> nkpnai-md-0-xqwvn-zlrmk-c5h88 <none> <none> nkpnai-md-0-xqwvn-zlrmk-knrqk <none> <none> nkpnai-md-0-xqwvn-zlrmk-zhdm4 <none> <none> nkpnai-vvzvd-cctr2 <none> [map[effect:NoSchedule key:node-role.kubernetes.io/control-plane]] nkpnai-vvzvd-ck76s <none> [map[effect:NoSchedule key:node-role.kubernetes.io/control-plane]] nkpnai-vvzvd-k4z42 <none> [map[effect:NoSchedule key:node-role.kubernetes.io/control-plane]]
GPU が搭載されている Kubernetesノードに、Taint を設定します。今回は、「nvidia.com/gpu.present: true」ラベルの付与されているノード(2台)に、まとめて Taint を設定しています。
- Taint:nvidia.com/gpu=true:NoSchedule
demo@nkp-work-01:~$ kubectl taint node -l nvidia.com/gpu.present=true nvidia.com/gpu=true:NoSchedule node/nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm tainted node/nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 tainted
これで、ノードに Taint が設定されました。
demo@nkp-work-01:~$ 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-gpupool-1-z9mz6-pl9k2-4n5fm true [map[effect:NoSchedule key:nvidia.com/gpu value:true]] nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 true [map[effect:NoSchedule key:nvidia.com/gpu value:true]] nkpnai-md-0-xqwvn-zlrmk-62gc2 <none> <none> nkpnai-md-0-xqwvn-zlrmk-c5h88 <none> <none> nkpnai-md-0-xqwvn-zlrmk-knrqk <none> <none> nkpnai-md-0-xqwvn-zlrmk-zhdm4 <none> <none> nkpnai-vvzvd-cctr2 <none> [map[effect:NoSchedule key:node-role.kubernetes.io/control-plane]] nkpnai-vvzvd-ck76s <none> [map[effect:NoSchedule key:node-role.kubernetes.io/control-plane]] nkpnai-vvzvd-k4z42 <none> [map[effect:NoSchedule key:node-role.kubernetes.io/control-plane]]
すぐに Pod を移動するために、「kubectl drain ~」を実行してノードで起動されている Pod を退避しておきます。
kubectl drain nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm --ignore-daemonsets --delete-emptydir-data
ノードで Pod のスケジュールが停止されます。
demo@nkp-work-01:~$ kubectl get nodes NAME STATUS ROLES AGE VERSION nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm Ready,SchedulingDisabled <none> 34d v1.33.5 nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 Ready <none> 102d v1.33.5 nkpnai-md-0-xqwvn-zlrmk-62gc2 Ready <none> 102d v1.33.5 nkpnai-md-0-xqwvn-zlrmk-c5h88 Ready <none> 102d v1.33.5 nkpnai-md-0-xqwvn-zlrmk-knrqk Ready <none> 102d v1.33.5 nkpnai-md-0-xqwvn-zlrmk-zhdm4 Ready <none> 102d v1.33.5 nkpnai-vvzvd-cctr2 Ready control-plane 102d v1.33.5 nkpnai-vvzvd-ck76s Ready control-plane 102d v1.33.5 nkpnai-vvzvd-k4z42 Ready control-plane 102d v1.33.5
ノードの Drain を解除するには、下記のように kubectl uncordon を実行します。
kubectl uncordon nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm
これを GPU ノードで1台ずつ実施すると、GPU ノードから、GPU が不要な Pod が退避できます。今回の構成であれば、2台目の GPU ノードでも同様に Drain → Uncordon を実行します。
kubectl drain nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 --ignore-daemonsets --delete-emptydir-data kubectl uncordon nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9
GPU Pod と、DaemonSet から起動された Pod 以外は、GPU ノード以外に移動されました。
demo@nkp-work-01:~$ kubectl get pod -A -o wide | grep gpupool kommander gpu-feature-discovery-kwwk8 1/1 Running 0 102d 192.168.7.219 nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 <none> <none> kommander gpu-feature-discovery-l88mj 1/1 Running 0 34d 192.168.8.102 nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm <none> <none> kommander kube-prometheus-stack-prometheus-node-exporter-md6lv 2/2 Running 0 102d 10.1.7.242 nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 <none> <none> kommander kube-prometheus-stack-prometheus-node-exporter-v47b8 2/2 Running 0 34d 10.1.7.237 nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm <none> <none> kommander logging-operator-logging-fluentbit-bfkvf 1/1 Running 0 34d 192.168.8.52 nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm <none> <none> kommander logging-operator-logging-fluentbit-bzjj4 1/1 Running 0 102d 192.168.7.148 nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 <none> <none> kommander nvidia-container-toolkit-daemonset-9l5r8 1/1 Running 0 34d 192.168.8.215 nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm <none> <none> kommander nvidia-container-toolkit-daemonset-x5tbz 1/1 Running 0 102d 192.168.7.56 nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 <none> <none> kommander nvidia-dcgm-5xlwt 1/1 Running 0 34d 192.168.8.106 nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm <none> <none> kommander nvidia-dcgm-exporter-77tb5 1/1 Running 3 (102d ago) 102d 192.168.7.165 nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 <none> <none> kommander nvidia-dcgm-exporter-m9fz5 1/1 Running 0 34d 192.168.8.85 nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm <none> <none> kommander nvidia-dcgm-wdslq 1/1 Running 0 102d 192.168.7.240 nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 <none> <none> kommander nvidia-device-plugin-daemonset-bcs44 1/1 Running 0 34d 192.168.8.209 nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm <none> <none> kommander nvidia-device-plugin-daemonset-rmjqx 1/1 Running 0 102d 192.168.7.142 nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 <none> <none> kommander nvidia-operator-validator-tvx78 1/1 Running 0 34d 192.168.8.223 nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm <none> <none> kommander nvidia-operator-validator-wb926 1/1 Running 0 102d 192.168.7.111 nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 <none> <none> kube-system cilium-4zvfr 1/1 Running 0 34d 10.1.7.237 nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm <none> <none> kube-system cilium-envoy-2s6zw 1/1 Running 0 34d 10.1.7.237 nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm <none> <none> kube-system cilium-envoy-9bd9h 1/1 Running 0 102d 10.1.7.242 nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 <none> <none> kube-system cilium-p8kpp 1/1 Running 0 102d 10.1.7.242 nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 <none> <none> kube-system kube-proxy-lrj8t 1/1 Running 0 34d 10.1.7.237 nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm <none> <none> kube-system kube-proxy-rtd8g 1/1 Running 0 102d 10.1.7.242 nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 <none> <none> metallb-system metallb-speaker-lkjnf 4/4 Running 0 102d 10.1.7.242 nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 <none> <none> metallb-system metallb-speaker-mmfgw 4/4 Running 0 34d 10.1.7.237 nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm <none> <none> nai-admin llama32-iep-predictor-566f5bdd89-nkdd4 1/1 Running 0 10m 192.168.8.3 nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm <none> <none> nai-system nai-otel-collector-collector-2hgh5 0/1 Init:0/1 0 47m <none> nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm <none> <none> nai-system nai-otel-collector-collector-cf6mq 0/1 Init:0/1 0 49m <none> nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 <none> <none> node-feature-discovery node-feature-discovery-worker-gl2hk 1/1 Running 0 34d 192.168.8.131 nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm <none> <none> node-feature-discovery node-feature-discovery-worker-p2t9f 1/1 Running 0 102d 192.168.7.88 nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 <none> <none> ntnx-system nutanix-csi-node-qflqg 3/3 Running 0 102d 10.1.7.242 nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 <none> <none> ntnx-system nutanix-csi-node-tv9lk 3/3 Running 1 (34d ago) 34d 10.1.7.237 nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm <none> <none>
GPU Pod の Toleration の様子
GPU Pod には、下記のように Toleration(容認)を設定することで、Taint(nvidia.com/gpu=true:NoSchedule)が設定されている GPU ノードでも、Pod を起動できるようになります。これは、NAI で推論サービスを起動(エンドポイントを作成)した際には、自動設定されます。
demo@nkp-work-01:~$ kubectl get pod -n nai-admin llama32-iep-predictor-566f5bdd89-2llq5 -o yaml
apiVersion: v1
kind: Pod
metadata:
(省略)
spec:
(省略)
tolerations:
- effect: NoSchedule
key: nvidia.com/gpu
operator: Exists
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
(省略)
おまけ:Taint の解除
ノードから Taint を削除するには、Taint の末尾に「-」を付与して、「kubectl taint node」を実行します。
demo@nkp-work-01:~$ kubectl taint node -l nvidia.com/gpu.present=true nvidia.com/gpu=true:NoSchedule- node/nkpnai-gpupool-1-z9mz6-pl9k2-4n5fm untainted node/nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 untainted
下記のように、Taint が削除されたことを確認できます。
demo@nkp-work-01:~$ 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-gpupool-1-z9mz6-pl9k2-4n5fm true <none> nkpnai-gpupool-1-z9mz6-pl9k2-9xdn9 true <none> nkpnai-md-0-xqwvn-zlrmk-62gc2 <none> <none> nkpnai-md-0-xqwvn-zlrmk-c5h88 <none> <none> nkpnai-md-0-xqwvn-zlrmk-knrqk <none> <none> nkpnai-md-0-xqwvn-zlrmk-zhdm4 <none> <none> nkpnai-vvzvd-cctr2 <none> [map[effect:NoSchedule key:node-role.kubernetes.io/control-plane]] nkpnai-vvzvd-ck76s <none> [map[effect:NoSchedule key:node-role.kubernetes.io/control-plane]] nkpnai-vvzvd-k4z42 <none> [map[effect:NoSchedule key:node-role.kubernetes.io/control-plane]]
以上。
