@@ -122,23 +122,28 @@ spec:
122122 enabled : false
123123` ` `
124124
125- ### Label GPU nodes for the DRA kubelet plugin
126-
127- A bundle that enables both ` gpu-operator` and `nvidia-dra-driver-gpu` schedules
128- the DRA kubelet plugin only on nodes labeled
129- ` nvidia.com/dra-kubelet-plugin=true` (or the pair given to
130- ` aicr bundle --dra-eviction-node-label` ). Set it **in the node pool
131- definition**, with the other required node labels — an ad hoc
132- ` kubectl label node` does not survive node replacement, recycling,
133- autoscaling, or a pool scaled from zero, so later nodes arrive unlabeled.
134-
135- An unlabeled GPU node fails silently : it runs no kubelet plugin and publishes
136- no `ResourceSlices`, and neither Helm nor the bundle's `deploy.sh` reports an
137- error. With no labeled GPU node at all the DaemonSet sits at `DESIRED=0`; with
138- only some labeled, those nodes work while the rest silently lack DRA.
139- This applies to existing clusters too — adding the selector during an
140- upgrade removes a plugin that was previously working.
141- See [Prepare DRA nodes before applying upgraded bundles](../user/bundling.md#prepare-dra-nodes-before-applying-upgraded-bundles).
125+ ### Label GPU nodes for the DRA kubelet plugin (opt-in only)
126+
127+ DRA eviction coordination is opt-in and **does nothing on the default AKS
128+ profile**. Under ` gpuStack=azure-managed` the node image installs the driver, so
129+ GPU Operator sets `driver.enabled=false`, deploys no driver pod and runs no
130+ Driver Manager — there is nothing to coordinate with, and no node label is
131+ needed. Bundles generated without `--dra-eviction-node-label` add no such
132+ selector, and the DRA kubelet plugin runs on every accelerated node.
133+
134+ The label matters only if you both run an operator-managed driver (see the
135+ ` gpuStack=operator-managed` procedure below) and generate the bundle with
136+ ` aicr bundle --dra-eviction-node-label key=value` . In that case set it **in the
137+ node pool definition**, with the other required node labels — an ad hoc
138+ ` kubectl label node` does not survive node replacement, recycling, autoscaling,
139+ or a pool scaled from zero, so later nodes arrive unlabeled.
140+
141+ When you have opted in, an unlabeled GPU node fails silently : it runs no kubelet
142+ plugin and publishes no `ResourceSlices`, and neither Helm nor the bundle's
143+ ` deploy.sh` reports an error. With no labeled GPU node at all the DaemonSet sits
144+ at `DESIRED=0`; with only some labeled, those nodes work while the rest silently
145+ lack DRA.
146+ See [Prepare DRA nodes when opting in to eviction coordination](../user/bundling.md#prepare-dra-nodes-when-opting-in-to-eviction-coordination).
142147
143148# # GPU Driver Setup
144149
@@ -258,8 +263,7 @@ az aks nodepool add \
258263 --resource-group <rg> \
259264 --name gpupool \
260265 --node-vm-size Standard_ND96isr_H100_v5 \
261- --node-count 1 \
262- --labels nvidia.com/dra-kubelet-plugin=true
266+ --node-count 1
263267` ` `
264268
265269No changes to AICR recipes are needed — this is the AKS family's `gpuStack`
@@ -591,17 +595,40 @@ az aks nodepool add \
591595 --name gpupool \
592596 --node-vm-size Standard_ND96isr_H100_v5 \
593597 --gpu-driver none \
594- --node-count 1 \
595- --labels nvidia.com/dra-kubelet-plugin=true
598+ --node-count 1
596599` ` `
597600
601+ Add the eviction label to this pool only if you also opt in at bundle time. The
602+ node label and the flag value must be the **same `key=value` pair** — the flag
603+ selects the convention, and AICR renders exactly what you pass :
604+
605+ ` az aks nodepool update --labels` **replaces** the pool's entire user-label map
606+ rather than merging, so repeat every label the pool already carries or they are
607+ dropped — including the accelerated-node selector the bundle relies on :
608+
609+ ` ` ` shell
610+ az aks nodepool update \
611+ --cluster-name <cluster> --resource-group <rg> --name gpupool \
612+ --labels nodeGroup=gpu-worker nvidia.com/dra-kubelet-plugin=true
613+ ` ` `
614+
615+ Prefer setting both at pool creation time (`az aks nodepool add --labels ...`)
616+ so there is no map to preserve.
617+
618+ Then pass the same pair to `aicr bundle` in the generation step below. See
619+ [Label GPU nodes for the DRA kubelet plugin (opt-in only)](#label-gpu-nodes-for-the-dra-kubelet-plugin-opt-in-only).
620+
598621Then select the mode at recipe generation time with the `gpuStack`
599622configuration profile — one flag flips every ownership path together :
600623
601624` ` ` shell
602625aicr recipe --service aks --accelerator h100 --os ubuntu --intent training \
603626 --profile gpuStack=operator-managed -o recipe.yaml
604- aicr bundle -r recipe.yaml -o ./bundles
627+ # AKS requires a keyed accelerated-node toleration; add
628+ # --dra-eviction-node-label only if you opted in and labelled the pool.
629+ aicr bundle -r recipe.yaml -o ./bundles \
630+ --accelerated-node-toleration nvidia.com/gpu:NoSchedule \
631+ --dra-eviction-node-label nvidia.com/dra-kubelet-plugin=true
605632` ` `
606633
607634The `operator-managed` value sets `driver.enabled=true`, `toolkit.enabled=true`,
0 commit comments