NAP Fails to Provision¶
Symptom¶
Pods remain pending after NAP is enabled, and no suitable NAP-managed nodes appear even though workload demand should have triggered provisioning.
Possible Causes¶
- Azure quota or regional capacity blocks the requested VM family.
- No
NodePoolmatches the pod's resource, taint, or affinity requirements. - The referenced
AKSNodeClassis misconfigured. - Networking or identity prerequisites for NAP are not satisfied.
- The cluster still depends on fixed-size pools for workloads that NAP rules do not cover.
Diagnosis Steps¶
flowchart TD
A[NAP not provisioning nodes] --> B[Check pending pod scheduling reason]
B --> C[Inspect NodePool and AKSNodeClass definitions]
C --> D{Matching NodePool exists?}
D -->|No| E[Fix requirements taints or limits]
D -->|Yes| F[Check quota capacity and networking prerequisites]
F --> G[Review karpenter-events and NodeClaims]
G --> H[Fallback to fixed pool only if workload coverage is incomplete] -
Inspect the pending pod event stream.
-
List NodePools and confirm at least one exists.
-
Inspect the matching NodePool and AKSNodeClass.
-
Review Karpenter events.
-
Confirm whether the workload actually matches NAP rules for SKU family, priority type, subnet expectations, and taints.
Resolution¶
- Expand or correct
NodePoolrequirements and limits. - Fix the
AKSNodeClassreference, subnet, OS, or kubelet settings. - Request additional Azure quota or relax SKU family constraints.
- Keep a fixed-size fallback pool temporarily while migrating workloads whose NAP rules are incomplete.
Prevention¶
- Create mutually understandable NodePools instead of overlapping ambiguous ones.
- Validate new NodePool and AKSNodeClass combinations with a synthetic pending workload.
- Review quota and capacity assumptions before introducing new VM families.
- Migrate from Cluster Autoscaler to NAP deliberately, not mid-incident.