Some node setup has to finish before anything else runs there: a driver, a
security agent, a kernel setting. runtimeRequired: true makes that a rule. The
node carries a taint that blocks ordinary pods, and the operator lifts it only
once the NodeWright is complete on that node.
Package pods tolerate the taint automatically. Your workloads do not, which is the point.
- The node has the runtime-required taint,
nodewright.nvidia.com=runtime-required:NoScheduleby default. - A NodeWright with
runtimeRequired: truetargets the node and runs its packages. - When they finish on that node, the operator removes the taint.
- Pods that were waiting get scheduled.
The taint is per node. A slow node does not hold back a healthy one.
Pick one node, label it, and taint it by hand. Pre-tainting is how you would do it in production, by having the node join the cluster already tainted:
NODE=<node-name>
kubectl label node "$NODE" nodewright.nvidia.com/example=runtime-required
kubectl taint node "$NODE" nodewright.nvidia.com=runtime-required:NoScheduleStart a workload pinned to that node. It has no toleration:
kubectl apply -f examples/runtime-required/workload.yaml
kubectl get pod runtime-required-demoIt is Pending. kubectl describe pod runtime-required-demo shows why: the node
has a taint the pod does not tolerate.
Now apply the NodeWright:
kubectl apply -f examples/runtime-required/nodewright.yaml
kubectl get nodewright runtime-required-demo -wThe package takes about 45 seconds. When it completes, the taint comes off and the pod starts:
kubectl get node "$NODE" -o jsonpath='{.spec.taints}' ; echo
kubectl get pod runtime-required-demo- It will not taint a node for you unless you also set
autoTaintNewNodes: true. Without a taint on the node,runtimeRequiredgates nothing. autoTaintNewNodesis a fallback, not a replacement for pre-tainting. There is a short window between a node joining and the operator tainting it. It also treats a node as new only if no NodeWright has ever touched it, andkubectl nodewright resetdoes not make it new again.- A broken package leaves the node tainted. Test packages on a few nodes before
setting
runtimeRequiredacross a fleet. - Do not combine it with
sequencing: all. One unhealthy node would hold the whole fleet tainted. See Strict Ordering.
kubectl delete -f examples/runtime-required/workload.yaml
kubectl delete -f examples/runtime-required/nodewright.yaml
kubectl label node "$NODE" nodewright.nvidia.com/example-
kubectl taint node "$NODE" nodewright.nvidia.com=runtime-required:NoSchedule-The last command matters if you clean up before the package finished: with no
NodeWright left to remove it, the taint stays and the node stays unschedulable.
It reports not found if the operator already removed the taint, which is fine.
- Runtime Required: auto-tainting,
the taint key rename from
skyhook.nvidia.com, andruntimeRequiredCordonAfter - Taints: how package pods tolerate taints, and
what
blockedmeans