Skip to content

NPU Driver Auto Upgrade

The operator replaces and validates drivers on each node according to the configured upgrade policy.

Automatic Upgrade Configuration

Set driver.upgradePolicy.autoUpgrade: true in your existing Helm values.

driver:
  enabled: true
  upgradePolicy:
    autoUpgrade: true
    maxParallelUpgrades: 1
    podRestartTimeoutSeconds: 1800
    waitForCompletion:
      timeoutSeconds: 0
      podSelector: ""
    npuPodDeletion:
      force: false
      timeoutSeconds: 300
      deleteEmptyDirData: false

Use npuPodDeletion to control which NPU pods may be evicted. In an RBLNClusterPolicy manifest, set these options under spec.driver.upgradePolicy.podDeletion.

For a complete example that upgrades Rebel100™ and ATOM™ nodes in turn and verifies the loaded version, see Upgrade NPU drivers automatically.

Upgrade Policy

Setting Effect Default
maxParallelUpgrades Maximum concurrent node upgrades 1
podRestartTimeoutSeconds Driver pod replacement timeout; expiry marks the node upgrade-failed 1800
waitForCompletion.podSelector Pods to wait for after cordon, before eviction. Empty = skip the wait ""
waitForCompletion.timeoutSeconds Wait limit, after which the upgrade proceeds. 0 = wait indefinitely 0
npuPodDeletion.force Allow eviction of NPU pods without a controller false
npuPodDeletion.timeoutSeconds Operator eviction timeout 300
npuPodDeletion.deleteEmptyDirData Allow eviction of NPU pods using emptyDir; contents are lost false

Starting and Stopping Automatic Upgrades

Update and apply driver.image.tag or the target instance's driver.instances.<key>.image.tag in your existing Helm values to start a rollout. For a directly managed RBLNDriver, update spec.version.

In automatic mode, the operator replaces driver pods itself, so the administrator does not need to delete them. If waitForCompletion is configured, the operator waits for the selected pods before eviction. It releases its own cordon after driver replacement and validation. Cordons set by an administrator remain in place.

Setting autoUpgrade: false stops the automatic rollout. The operator releases its own cordons, but upgrade-failed nodes stay cordoned until recovery. Resolve the cause and request a retry for failed nodes.

Node States

Read the current state from the rebellions.ai/npu-driver-upgrade-state node label.

State What to expect
upgrade-required Waiting for an upgrade slot
cordon-required Blocking new scheduling on the node
wait-for-jobs-required Waiting for Running or Pending pods matching waitForCompletion.podSelector; continues on timeout
pod-deletion-required Evicting NPU pods; blocked eviction results in upgrade-skipped
pod-restart-required Replacing the driver pod and waiting for readiness
validation-required Waiting up to 600 seconds for the operator validator to become Ready
uncordon-required Releasing the upgrade's cordon
upgrade-done Upgrade complete

maxParallelUpgrades limits concurrent upgrades. Failed nodes also hold a slot; skipped and completed nodes do not.

Upgrade Verification

Rollout Status

Query the rollout status with the following commands:

kubectl get rblnclusterpolicy
kubectl get rblnclusterpolicy <POLICY_NAME> -o yaml

status.driverUpgrade contains the following fields.

Field Meaning
total Total nodes tracked by the upgrade rollout
done Nodes whose upgrade is complete
inProgress Nodes currently upgrading, excluding pending, skipped, and failed nodes
pending Nodes waiting to start an upgrade
skipped Nodes whose upgrade was skipped before driver replacement; excluded from done
failed Nodes whose upgrade failed
state Rollout state, listed in the following table
progress Completed/total node count, with (N skipped) appended when nodes were skipped; for example, 12/40 (2 skipped)
lastTransitionTime Time when the per-state node counts last changed
Rollout state Meaning
Degraded At least one failed node; its upgrade slot remains occupied
InProgress Nodes are upgrading or waiting, with no failed nodes
PartiallyComplete No nodes remain in progress or pending, but some were skipped
Complete All tracked nodes completed the upgrade

Upgrade Conditions

Check the status and reason of the following conditions under status.conditions.

Condition When True reason when True reason when False
DriverUpgradeInProgress Nodes are upgrading or waiting UpgradeInProgress NoUpgradeInProgress
UpgradeDegraded Failed nodes exist FailedNodes NoFailedNodes
UpgradeIncomplete Skipped nodes remain, with no nodes upgrading or waiting NodesSkipped RolloutInProgress or NoSkippedNodes
UpgradeStalled Nodes are upgrading, but the per-state node counts have not changed for more than 30 minutes NoRecentTransition Progressing

When UpgradeIncomplete=False, the reason is RolloutInProgress if skipped nodes exist, or NoSkippedNodes otherwise. If failed nodes occupy every upgrade slot and no nodes are in progress, the conditions report UpgradeDegraded=True and UpgradeStalled=False.

Verifying the Running Driver

Check that the new driver pod on the target node is Ready, then run rbln-smi to check the upgraded driver version.

kubectl get pods -n rbln-system -o wide -l app.kubernetes.io/component=rbln-driver
kubectl exec -n rbln-system <DRIVER_POD> -c rbln-driver-container -- rbln-smi

Driver Installation Status

The RBLNClusterPolicy instance may report notReady while a driver is being replaced. If it does not return to ready, check the nodes named in the Ready condition message and inspect their driver initContainer logs.

kubectl get rblnclusterpolicy <POLICY_NAME> -o jsonpath='{.status.conditions[?(@.type=="Ready")].message}'

Node State and Annotations

kubectl get nodes -L rebellions.ai/npu-driver-upgrade-state
kubectl describe node <NODE_NAME>

All of the following annotation names have the rebellions.ai/ prefix.

Annotation Use
npu-driver-upgrade-failure-reason Failure details; long messages are truncated
npu-driver-upgrade-failure-step The step that failed
npu-driver-upgrade-skip-reason Eviction blocker; long messages are truncated
npu-driver-upgrade-cordon The component that cordoned the node; automatic upgrades set it to operator
npu-driver-upgrade-requested Set to true to request a retry

If an annotation message is truncated, check the operator logs for the full details.

Events

Event Meaning
DriverUpgradeStarted Node admitted for upgrade
DriverUpgradeSkipped Eviction blocked the attempt
DriverUpgradeFailed Driver pod replacement or validation failed
DriverUpgradePodStuck Driver pod has an image pull or startup error; repeats while waiting in the replacement step
DriverUpgradeCompleted Upgrade completed
1
2
3
kubectl get events -A \
  --field-selector involvedObject.kind=Node,involvedObject.name=<NODE_NAME> \
  --sort-by=.lastTimestamp

Skipping Driver Upgrades

To exclude a node from driver upgrades, set the following label:

kubectl label node <NODE_NAME> rebellions.ai/npu-driver-upgrade.skip=true

To re-enable upgrades, remove the label:

kubectl label node <NODE_NAME> rebellions.ai/npu-driver-upgrade.skip-

This label blocks new automatic upgrade attempts. It does not stop an upgrade already in progress or prevent a manual driver pod deletion.

Inspecting state

Check which nodes are excluded and the progress of each node:

1
2
3
4
kubectl get nodes \
  -L rebellions.ai/npu.present \
  -L rebellions.ai/npu-driver-upgrade-state \
  -L rebellions.ai/npu-driver-upgrade.skip

Skipped and Failed Nodes

The failure stage determines whether a node keeps its upgrade slot and cordon.

State Effect on the node Next action
upgrade-skipped Keeps the old driver and releases the upgrade's cordon. Administrator cordons and nodes in requestor mode remain cordoned Resolve the eviction blocker and retry
upgrade-failed Keeps its cordon and upgrade slot after a driver pod or validation failure Fix the driver pod or node, then retry

Requestor mode disables automatic uncordon for a node. It applies whenever the rebellions.ai/npu-driver-upgrade-requestor-mode annotation is present, regardless of its value.

Skip Reasons

Eviction targets pods requesting rebellions.ai/* resources or holding a container-mode NPU DRA claim. The default container DeviceClass is npu.rebellions.ai; custom classes bridged to rebellions.ai/* also qualify.

Blocker Action
emptyDir volume Set npuPodDeletion.deleteEmptyDirData: true, or move the workload. Eviction deletes the volume contents
No controller Set npuPodDeletion.force: true, or delete the pod
DaemonSet-managed NPU pod Exclude this node from the DaemonSet
PodDisruptionBudget Adjust the budget or scale the workload to allow disruption

Check the node's rebellions.ai/npu-driver-upgrade-skip-reason annotation for the cause. A PodDisruptionBudget blocking eviction may be reported as an eviction timeout.

Driver Pod Timeout

Image pull or container startup failures raise a DriverUpgradePodStuck warning. The node becomes upgrade-failed when podRestartTimeoutSeconds expires (default: 1800 seconds) or an unready container has restarted more than ten times. See timeout settings.

Retry Paths

After fixing the cause, request a retry and check the state:

kubectl annotate node <NODE_NAME> rebellions.ai/npu-driver-upgrade-requested=true --overwrite
kubectl get node <NODE_NAME> -L rebellions.ai/npu-driver-upgrade-state

If automatic upgrades are disabled, re-enable them before requesting a retry. Re-enabling automatic upgrades alone does not guarantee a retry for failed nodes.

In addition to an explicit retry request, upgrades resume under the following conditions.

Target Condition Result
Skipped or failed nodes A different driver version or driver container configuration is applied Return to the upgrade queue
Nodes that failed during driver pod replacement The pod matches the current configuration, is Running, and all containers are Ready Proceed to uncordon or completion
Nodes that failed during driver pod replacement The pod template has changed, and the existing pod is not being deleted Return to the upgrade queue to retry pod replacement

A node that failed validation does not recover on its own when its pod becomes Ready. Request a retry explicitly or change the driver version or driver container configuration.