Cluster Upgrades
Upgrade the control plane first, then node groups and add-ons, one minor version at a time.
Kubernetes releases a new minor version roughly every quarter, and EKS supports each for a limited window. Upgrading on schedule keeps you supported and on the standard price.
The safe order
- Read the release notes and check for deprecated APIs your manifests use.
- Upgrade the control plane one minor version (you cannot skip versions).
- Update the add-ons to compatible versions.
- Upgrade the node groups so kubelet matches the control plane.
Node upgrades are graceful
Managed node groups roll nodes one at a time, cordoning and draining each before replacing it, so workloads keep running.
Example
# Upgrade the control plane, then the node group
eksctl upgrade cluster --name demo --version 1.31 --approve
eksctl upgrade nodegroup \
--cluster demo \
--name ng-default \
--kubernetes-version 1.31When to use it
- A platform team plans a 1.29 to 1.30 cluster upgrade, running kubectl api-resources first to find any deprecated API usage in their deployed manifests.
- An SRE team upgrades the control plane first and verifies nodes stay healthy before rolling node groups, following the one-version-at-a-time EKS rule.
- A DevOps engineer uses eksctl upgrade nodegroup to replace nodes with the new AMI using a rolling update, draining one node at a time.
More examples
Check for deprecated API usage
Runs pluto against the live cluster to find any resources using APIs deprecated or removed in the target Kubernetes version before upgrading.
# Install pluto
brew install pluto
# Scan all cluster manifests
pluto detect-all-in-cluster --target-versions k8s=v1.30Upgrade control plane version
Upgrades the EKS control plane to version 1.30 in place, then verifies the new version is active.
eksctl upgrade cluster \
--name prod \
--version 1.30 \
--approve
aws eks describe-cluster \
--name prod \
--query 'cluster.version' \
--output textRoll node group to new version
Rolls the managed node group to the EKS-optimized AMI for 1.30, draining and replacing nodes one at a time to maintain workload availability.
eksctl upgrade nodegroup \
--cluster prod \
--name workers \
--kubernetes-version 1.30
kubectl get nodes -o wide
Discussion