Kubernetes and EKS compatibility
Karpenter requires a minimum Kubernetes version depending on the Karpenter release. Use the table below to verify your cluster version is compatible.| Kubernetes | 1.29 | 1.30 | 1.31 | 1.32 | 1.33 | 1.34 | 1.35 |
|---|---|---|---|---|---|---|---|
| Karpenter | >= 0.34 | >= 0.37 | >= 1.0.5 | >= 1.2 | >= 1.5 | >= 1.6 | 1.9.x |
Release types
| Type | Description | Production-safe? |
|---|---|---|
Stable (e.g. 1.9.0) | Recommended for all environments | Yes |
Release candidate (e.g. 1.9.0-rc.0) | Early access for testing before GA | No |
| Snapshot | Built from every merged commit, available in a private ECR repo | No |
CRD upgrades
Karpenter ships Custom Resource Definitions (CRDs) that must be kept in sync with the controller version. Helm does not automatically upgrade CRDs after initial installation. Karpenter publishes CRDs in two ways:- Standalone
karpenter-crdchart (recommended) — manages CRD lifecycle independently via Helm - Bundled in the
karpenterchart — installs CRDs only on first install; subsequent upgrades do not update them
If you see
invalid ownership metadata; label validation error: when installing the karpenter-crd chart from an older version, see the Troubleshooting Guide.Upgrade process
Review compatibility and breaking changes
Check the compatibility matrix to confirm your Kubernetes version is supported by the target Karpenter version.Read the version-specific sections in Breaking changes by version for every minor version between your current and target release.
Back up your current configuration
Save your existing Document your current Karpenter version:
NodePool and EC2NodeClass resources:Validate in a staging environment
Deploy the target version to a staging cluster first. Run tests that cover:
- Node provisioning (scale up a deployment)
- Disruption (manually delete nodes, verify replacement)
- NodePool and EC2NodeClass validation webhooks
- Controller health (
kubectl get pods -n kube-system -l app.kubernetes.io/name=karpenter)
Upgrade the Karpenter controller
--reuse-values to carry forward your existing Helm values, or pass an explicit values file with -f values.yaml.Breaking changes by version
This section covers the key changes to be aware of when upgrading to each version. Read every section between your current version and your target version.Upgrading to 1.9.0+
- The IAM policy in the getting-started CloudFormation template has been split from one policy into five policies. If your IAM role depends on that policy, attach all five new policies. There are no permission changes from v1.8.
Upgrading to 1.8.0+
- Adds support for Static Capacity. Upgrade your Karpenter CRDs to use this feature.
Upgrading to 1.7.0+
- Instance profiles are now created with the path
/karpenter/{region}/{cluster-name}/{nodeclass-uid}/instead of/. No action needed for existing profiles; new ones use the new path. - The Karpenter controller role now requires the additional IAM permission
iam:ListInstanceProfiles. - Metric
karpenter_pods_pods_drained_totalrenamed tokarpenter_pods_drained_total. - Metric reason label
livenessonkarpenter_nodeclaims_disrupted_totalrenamed toregistration_timeout. - Pods with
ResourceClaimrequests are explicitly ignored. DRA is not currently supported by Karpenter.
Upgrading to 1.6.0+
- Native ODCR support graduated to beta and is enabled by default. If you were using open ODCRs with earlier Karpenter versions and have not migrated to native ODCR support, review the capacity reservations guide before upgrading.
- New configuration option
MinValuesPolicy: controls how the scheduler treatsminValues. Options:Strict(default, existing behavior) orBestEffort. - New configuration option
DisableDryRun(v1.6.2+): disables dry-run calls duringEC2NodeClassvalidation.
Upgrading to 1.5.0+
No breaking changes.Upgrading to 1.4.0+
No breaking changes.Upgrading to 1.3.0+
- Alpha metric
karpenter_ignored_pod_countrenamed tokarpenter_scheduler_ignored_pod_count. - With the
ReservedCapacityfeature gate, a newkarpenter.sh/capacity-typevalue (reserved) is introduced. Applications that usenodeSelectorto explicitly selecton-demandand want to use ODCR capacity must update their requirements to usenodeAffinityand include bothreservedandon-demand.
Upgrading to 1.2.0+
- Metric reason labels on
karpenter_voluntary_disruption_queue_failures_totalandkarpenter_nodeclaims_disrupted_totalchanged from camelCase to snake_case:Drifted→driftedEmpty→emptyExpired→expiredUnderutilized→underutilized
nodeclass.terminationandnodeclass.statuscontrollers merged into a singlenodeclasscontroller. Update any log queries or metric dashboards that reference the old controller names.
Upgrading to 1.1.0+
v1beta1compatibility annotations are removed. Complete migration before upgrading.nodeClassRef.groupandnodeClassRef.kindare now strictly required on allNodePoolsandNodeClaims. Set these values before upgrading.- Bottlerocket
amiFamilynow supportsinstanceStorePolicy: RAID0. This configuration requires Bottlerocket v1.22.0+. Earlier Bottlerocket versions withRAID0will fail to join the cluster. - AWS Neuron accelerator label (
karpenter.k8s.aws/instance-accelerator-name) values corrected totrainium,inferentia,inferentia2. Previously all Neuron accelerators returnedinferentia. - Karpenter now uses
eks:eks-cluster-nameinstead ofkarpenter.k8s.aws/clusterfor launch template tagging. - Generic operator metrics deprecated and replaced by resource-specific metrics.