Availability-Zone-Imbalanced Node Pools and Spread Failures¶
Symptom¶
The workload's placement rules are reasonable, but AZ recovery still fails because one zone has fewer nodes, zero nodes, a lower max-count, or a zone-specific quota or SKU constraint that prevents AKS from restoring balanced capacity.
Possible Causes¶
- One zone has no dedicated node pool or its pool scaled down much further than the others.
max-countis lower in the zone that must absorb the missing replicas.- The requested VM SKU is unavailable in one of the target zones.
- Cluster autoscaler is enabled, but zonal scale behavior is misaligned with the workload's strict spread constraints.
- The cluster relies on a multi-zone pool when the workload actually needs zone-aligned scaling control.
Diagnosis Steps¶
flowchart TD
A[Spread contract looks correct] --> B[Inspect per-zone node-pool counts and bounds]
B --> C{Zone missing capacity or max headroom?}
C -->|Yes| D[Check autoscaler profile and per-zone pool symmetry]
C -->|No| E[Check SKU support quota and regional capacity]
D --> F[Rebuild balanced zonal pool model]
E --> F -
Map the current node inventory by zone and pool.
-
Compare Azure-side pool counts, zones, and autoscaler bounds.
az aks nodepool list \ --resource-group "$RG" \ --cluster-name "$CLUSTER_NAME" \ --query "[].{name:name,zones:availabilityZones,count:count,enableAutoScaling:enableAutoScaling,minCount:minCount,maxCount:maxCount,vmSize:vmSize}" \ --output tableCommand Purpose az aks nodepool listList node pools with zones and scaling. --resource-groupResource group that contains the AKS cluster. --cluster-nameName of the AKS cluster. --querySelects name, zones, count, autoscaling, and VM size. --outputOutput format for the result. -
If a zone looks empty or permanently smaller, check whether the pool design itself is asymmetric.
Look for patterns such as:
- zone 1 pool
max-count6, zone 2 poolmax-count2, zone 3 pool absent - one shared multi-zone pool plus one extra zone-aligned pool that biases recovery
- zone 1 pool
-
Verify that the requested VM family is actually accepted in the needed zones.
Command Purpose az aks list-vm-skusList VM SKUs supported for AKS node pools. --locationAzure region to query. --outputOutput format for the result. -
Check the cluster autoscaler design if the workload depends on zone-aligned recovery.
Command Purpose az aks showShow the cluster autoscaler profile. --resource-groupResource group that contains the AKS cluster. --nameName of the AKS cluster. --querySelects the autoscaler profile. -
If a zone cannot scale because of quota or broader capacity, pivot to Azure-side capacity evidence.
Command Purpose az vm list-usageShow regional vCPU quota usage. --locationAzure region to query. --outputOutput format for the result. If the cluster uses node auto-provisioning for some workloads, also cross-check NAP Fails to Provision.
Resolution¶
- Rebuild the zonal pool model so each required zone has explicit, reachable headroom.
- Raise
max-countsymmetrically across per-zone pools when the workload requires even recovery behavior. - Enable
balance-similar-node-groupswhen multiple similar zonal pools back the same workload. - Move from one multi-zone pool to one pool per zone when strict zonal behavior matters more than simplified pool management.
- Relax the accepted VM family or request additional quota when one zone cannot provision the current SKU.
Prevention¶
- Treat zonal node-pool symmetry as part of the workload contract, not as an incidental scaling detail.
- Review node-pool counts and bounds after every cost-optimization or autoscaler-policy change.
- Validate the chosen VM size in every target zone before standardizing on it for strict spread workloads.
- Keep Topology Spread Skew Under Capacity linked in incident runbooks so responders distinguish manifest intent from cluster-shape defects.
See Also¶
- Topology Spread Skew Under Capacity
- When You Need Explicit Placement and Disruption Control
- Cluster Autoscaler Issues
- NAP Fails to Provision
- Node Pools