Upgrade Failure¶
Symptom¶
An AKS upgrade does not start, stalls mid-rollout, or completes on the control plane while one or more node pools remain unhealthy.
Possible Causes¶
- PodDisruptionBudgets block drain and surge progression.
- Deprecated APIs or incompatible controllers block the target Kubernetes version.
- Node image rollout is stuck after the version move is accepted.
- Surge nodes cannot be created because subnet or IP capacity is exhausted.
Diagnosis Steps¶
flowchart TD
A[Upgrade failed or stalled] --> B{Where is the failure?}
B -->|Drain blocked| C[Upgrade Blocked by Pod Disruption Budget]
B -->|Target rejected| D[Upgrade Blocked by Deprecated API]
B -->|Node image rollout stuck| E[Node Image Upgrade Stuck]
B -->|Surge nodes cannot start| F[Surge Upgrade IP Exhaustion] -
Review the control-plane result and node-pool state.
az aks show \ --resource-group "$RG" \ --name "$CLUSTER_NAME" \ --query "{version:currentKubernetesVersion,autoUpgradeProfile:autoUpgradeProfile,provisioningState:provisioningState}" \ --output yamlCommand Purpose az aks showShow version, auto-upgrade profile, and state. --resource-groupResource group that contains the AKS cluster. --nameName of the AKS cluster. --querySelects version, auto-upgrade profile, and provisioning state. --outputOutput format for the result. -
Review cluster events and the current node and PDB picture.
-
Route to the focused playbook that matches the first hard failure:
- Upgrade Blocked by Deprecated API
- Node Image Upgrade Stuck
- Surge Upgrade IP Exhaustion
Resolution¶
- Use the focused playbook that matches the actual blocker.
- Do not keep retrying the same upgrade path until the blocking condition is removed.
Prevention¶
- Keep support-window tracking continuous, not quarterly.
- Rehearse upgrade and validation in non-production with the same PDB and surge assumptions.
- Prefer blue/green for the highest-risk production upgrades.