Skip to content

2. Scope

2.1 Scope and Compatibility

Supported environments

EnvironmentStatus
EKS Auto ModePrimary target
Self-managed Karpenter v1+ on EKSSupported
Karpenter on other CNCF (AKS NAP, etc.)Best-effort
  • EKS Auto Mode: the 21-day hard cap is the strongest motivating constraint.
  • Other CNCF distributions: the CRD API is the same, but underlying operator behavior may differ.

Karpenter compatibility policy

karpenter.sh/v1 is required; earlier versions (v1beta1, v1alpha5) are not supported.

The compatibility contract is the stable karpenter.sh/v1 CRD surface — not a specific Karpenter controller minor. This matters for EKS Auto Mode, which does not expose the exact managed Karpenter minor to users.

  • Runtime target: any cluster serving a compatible karpenter.sh/v1 NodePool/NodeClaim API
  • Build/test baseline: the bundled sigs.k8s.io/karpenter Go module version in go.mod (currently v1.13.0). This pins the typed Go API, not a runtime requirement
  • Interaction boundary: solely through Kubernetes API objects (NodeClaim/NodePool CRDs, plus core Node/Pod). No Karpenter internals, no cloud-provider API
  • Runtime enforcement: a startup preflight (§5.1) fails fast when the cluster does not serve karpenter.sh/v1 or RBAC cannot read it

Required compatibility surface

The controller depends only on the following public karpenter.sh/v1 fields:

Kind / field / keyUsed for
NodeClaim, NodePoolRotation unit and owning pool
NodeClaim.spec.expireAfterPer-node deadline (§3.2)
NodeClaim.spec.terminationGracePeriodDrain bound for t_rot (§3.2)
NodeClaim.spec.requirementsPlaceholder requirement fallback (§3.3)
NodeClaim.status.nodeNameClaim → Node mapping (§3.3, §5.2)
NodeClaim.status.conditions[Ready]Selection eligibility (§3.2)
NodePool.spec.template.spec.expireAfterRepresentative E for validation
NodePool.spec.template.spec.terminationGracePeriodRepresentative tGP
NodePool.spec.template.spec.requirementsPlaceholder requirement replication (§3.3)
NodePool.spec.template.spec.taintsPlaceholder tolerations (§3.3)
NodePool.spec.limitsSurge headroom check (§3.2, §5.2)
NodePool.status.resourcesProvisioned footprint for headroom
label karpenter.sh/nodepoolPairing nodes/placeholder to pool
annotation karpenter.sh/do-not-disruptFreeze surge pair (§3.3)

Anything outside this set — including all Karpenter controller internals — is irrelevant to compatibility.

2.2 Composition with Existing Mechanisms

MechanismRelationship
Consolidation / DriftCoexists
NodePool expireAfterCoexists as backstop
terminationGracePeriodDepended on
PodDisruptionBudgetDepended on
topologySpreadConstraintsDepended on
  • Consolidation / Drift: the controller takes over only the Expiration path. Voluntary disruption from Consolidation/Drift still flows through Karpenter.
  • expireAfter: the derived ageThreshold sits below expireAfter by construction (A = E − (K·P + t_rot), §3.2). Validation fails (fatal) when the schedule cannot guarantee the configured rotation chances — the gap is not hand-tuned.
  • terminationGracePeriod: after the controller deletes an old NodeClaim, Karpenter's termination controller honors PDBs during drain, bounded by terminationGracePeriod.
  • PodDisruptionBudget: drain follows the voluntary path, so PDBs are strictly respected.
  • topologySpreadConstraints: even with surge, all pods on a node disappear together when that node is drained. Spreading remains essential.