You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Add the gcp-driver-installer component — Google's cos-gpu-installer
DaemonSet as a values-gated, AICR-managed component — and replace the
GKE gpuStack value driver-installer with bundle-installer, which owns it.
The gpuStack family on GKE COS is now:
- gke-default (default, unchanged): GKE's managed driver install and
GKE's managed device plugin as the nvidia.com/gpu advertiser.
- bundle-installer: opt-out pools
(gke-no-default-nvidia-gpu-device-plugin=true, created with
gpu-driver-version=disabled) — the GPU Operator's device plugin is the
sole advertiser and the bundle's gcp-driver-installer component
supplies the driver. The version is pinned in the recipe
(gcp-driver-installer.driverVersion, default matching the GPU Operator
chart's driver pin; must be COS-qualified) and upgrades roll with the
bundle — nothing is applied out-of-band.
The component sits unconditionally in the gke-cos chain, gated on the
nested installer.enabled path (top-level install/enabled are
component-presence gates and would deadlock profile resolution — ADR-015
sketch amended); under gke-default it renders a template-less no-op
chart. The two values are distinguished at generation time by the
opt-out pool label (negated vs positive), which resolves ADR-015
Deferred Decision 5 without any post-deployment signal.
BREAKING: driver-installer (shipped v0.19.0) is removed; selecting it
fails closed with the valid-values list. Migration for pools that used a
hand-applied standalone nvidia-driver-installer DaemonSet: delete that
DaemonSet (the bundle's DaemonSet shares its name in kube-system and
Helm will not adopt the pre-existing object), regenerate with
--profile gpuStack=bundle-installer, and deploy the bundle. Nodes with a
loaded driver are untouched (installer fast path).
Also: CheckNVSentinelDriverLabelDetectable accepts bundle-installer (the
bundle-carried installer IS a driver pod the labeler detects); the
deployment validator's static-assert suppression is generalized
(gatedHealthCheckSuppressed) so a values-gated component whose render is
empty skips its DaemonSet health check; cos-nvidia-installer:fixed gets
a digest-pin exemption (COS-node-local image, never pulled or mirrored);
parity goldens, BOM, and recipe-health docs regenerated.
Fixes#1716
Related #2344
Signed-off-by: Atif Mahmood <atif1996@users.noreply.github.com>
| all GPU nodes label-absent | ✅ resolves | ❌ fails closed: constraint expects the label on every GPU node |
71
71
| all GPU nodes `gke-no-default-nvidia-gpu-device-plugin=true`| ❌ fails closed: constraint expects no labeled GPU node | ✅ resolves |
@@ -85,9 +85,9 @@ the snapshot, and the check is NEVER skipped when a snapshot is present:
85
85
| Invocation | Selected value | Node-label check |
86
86
|---|---|---|
87
87
| no `--profile`, no `--snapshot`| declaration default (`gke-default`) | none possible (no cluster data) — the constraint is still recorded in the recipe and enforced at `aicr validate` readiness |
88
-
|`--profile gpuStack=driver-installer`, no `--snapshot`|`driver-installer`| same — deferred to validate |
88
+
|`--profile gpuStack=bundle-installer`, no `--snapshot`|`bundle-installer`| same — deferred to validate |
89
89
| no `--profile`, `--snapshot`| default (`gke-default`) | checked at generation: no GPU node may carry the opt-out label, else generation fails closed naming the observed state |
90
-
|`--profile gpuStack=driver-installer`, `--snapshot`|`driver-installer`| checked at generation: every GPU node must carry `gke-no-default-nvidia-gpu-device-plugin=true`, else fails closed |
90
+
|`--profile gpuStack=bundle-installer`, `--snapshot`|`bundle-installer`| checked at generation: every GPU node must carry `gke-no-default-nvidia-gpu-device-plugin=true`, else fails closed |
91
91
92
92
If you need an unverified recipe deliberately, generate criteria-only (drop
93
93
`--snapshot`): the artifact is honest about being unqualified, and the
@@ -165,7 +165,7 @@ override is needed:
165
165
166
166
Because the path is profile-owned, a bundle-time `--set` diverging from the
167
167
selected value is **rejected** rather than silently applied. The explicit
168
-
`false` under `driver-installer` is deliberate: skipping detection there would
168
+
`false` under `bundle-installer` is deliberate: skipping detection there would
169
169
keep the label applied across an unloaded driver.
170
170
171
171
The value renders the labeler's `--assume-driver-installed` argument — the
@@ -176,7 +176,7 @@ recommended, permanent mechanism for host-installed drivers (no automatic
176
176
detection fallback will be added). Under `gke-default` a recipe that reaches
177
177
bundle generation without it is a **blocking error**
178
178
(`CheckNVSentinelDriverLabelDetectable`), so the silent half-rollout cannot
179
-
ship. Under `driver-installer` the gate does not fire: the standalone installer
179
+
ship. Under `bundle-installer` the gate does not fire: the bundle's installer
180
180
supplies an observable driver pod.
181
181
182
182
**Labeling the nodes by hand does not persist.** Applying the label manually:
@@ -191,28 +191,34 @@ its next reconcile. Design 018 documents manual labeling as the procedure for
191
191
this case, so an operator following it will see it work and later find the
192
192
DaemonSets back at 0 desired.
193
193
194
-
### Alternative: Let GPU Operator Manage the Device Plugin
194
+
### Alternative: Let the Bundle Own the GPU Stack
195
195
196
196
If you prefer the GPU Operator's device plugin to own `nvidia.com/gpu`
197
197
advertisement, select the mode at recipe generation:
198
198
199
199
```shell
200
200
aicr recipe --service gke --accelerator h100 --os cos --intent training \
0 commit comments