Build1 publisher3 min readPublished
NodeWright lets a training pod's label hold a GPU node out of a fleet-wide rollout
NVIDIA has open-sourced the host configuration controller it ran internally as Skyhook. Its interruption budget and non-interrupt pod labels are the two fields that set how long a fleet-wide kernel change takes.
The Engineer · Build desk

What happened
- NVIDIA has introduced NodeWright, an open-source Kubernetes-native package manager that declaratively configures and updates the operating systems on cluster nodes without stopping the workloads running on them.
- It handles host changes from installation through configuration, upgrade and uninstallation, and does so while respecting PodDisruptionBudgets, node selectors, taints and tolerations.
- NodeWright sits in the DSX OS AI-Ready Foundation alongside the GPU Operator, the Network Operator, Topograph, the DRA driver, the Cluster Readiness Engine and NVSentinel.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- constraint Fleet change pace becomes a configured percentage, and raising it to finish sooner also raises how much GPU capacity is out of service at the same moment.
- decision Someone has to approve a controller holding standing authority to cordon and drain GPU nodes on a label match. That is a change-control decision before it is a tooling one.
- capability Kernel and package failures land in the cluster as resource state, so host-level rollouts can be alerted on with the same machinery that watches pods.
- exposure A verification script that reports a false failure halts the rollout partway, leaving one pool running two different host configurations until someone intervenes.
Two fields in NVIDIA's example resource set the schedule. `interruptionBudget: percent: 33` caps how much of the selected pool can be under change at once, and the selector in that sample is `nodepool: gpu` [5]. Take the case NVIDIA uses to frame the problem, one kernel parameter across 200 GPU nodes [11]. A 33 percent budget allows 66 of them in flight, so covering the pool takes four batches [15].
The second field is `podNonInterruptLabels`, matching `workload: long-running-training` [5]. NVIDIA's specific complaint about existing tooling is that it will not cordon a node before making changes, wait for a critical pod to finish, or drain workloads before rebooting [8]. A node running a pod with that label therefore sits out the rollout for as long as the pod runs. The post does not say what the operator does when such a pod outlasts the change window. The scenario NVIDIA opens with is a CVE that has to be remediated across the whole fleet this week [16].
NVIDIA writes that the usual answer today is "a spreadsheet, a maintenance window, and an engineer watching a terminal at 3 a.m." [7]. What the controller sets is how many nodes that engineer is watching at once.
The operator itself is a Kubernetes controller that watches for these custom resources and manages the lifecycle of changes across nodes [3]. Packages are container images carrying the scripts, configuration and binaries [4]. An Ansible role does not port into that shape unchanged; it becomes an image, plus a verifier that has to fail loudly enough to stop a fleet.
NVIDIA's production evidence is its own fleet. The project ran internally as Skyhook, and this post introduces the NodeWright name [2]. For that record to transfer, two things have to hold on your cluster. Your host changes have to be expressible as images with verification scripts. And your nodes have to be ones a controller may cordon and drain under PodDisruptionBudgets, node selectors, taints and tolerations [9]. The example carries `apiVersion: nodewright.nvidia.com/v1alpha1` and pins the `nvidia-tuned` package at 0.9.0 [5].
The narrow version of the argument is the one I find convincing. NVIDIA says Ansible and Puppet were designed for machines managed individually, not for a cluster actively running sensitive workloads [12]. It also says they do not track success or failure inside the cluster where the rest of your observability already lives [8]. NodeWright packages are Custom Resources, so they go out through kubectl, Helm, Argo CD, Flux or whatever GitOps tooling is already running [10].
The wider claim is that the unit of change is the fleet, and it rests on the scarcity case. NVIDIA says a GPU node cannot simply be discarded for a fresh one, replacements can take hours, and long-running training jobs cannot simply be rescheduled [6].
What to watch
- Whether the nodewright.nvidia.com API group leaves v1alpha1, and whether the custom resource field names survive the move.
- Documentation for what the operator does when a pod matching podNonInterruptLabels outlives the rollout: timeout, force, or wait indefinitely.
- Whether the package catalogue at ghcr.io grows past nvidia-tuned. That decides whether this replaces host runbooks or only wraps them.