EKS 1.34 to 1.35 upgrade: what breaks at this step
Kubernetes 1.35 has been on EKS since January 27, 2026. On December 2, 2026 1.34 leaves standard support and bills at the extended rate: $0.60 per cluster-hour instead of $0.10. 1.35 itself is on standard support until March 27, 2027.
One hop, no API removals, and the two things that can stop a node only affect custom node configurations. For every item below: what breaks, AWS's own words, a command to check your cluster, the fix, and what kube-upgrade-check reports for it.
Why now
Three dates and one price set the pace.
Nothing in 1.35 removes an API, and the two changes that can stop a node (cgroup v1 and a removed kubelet flag) only bite custom node configurations. For most clusters this is the cheapest EKS upgrade in years; the work is in confirming that. See what extended support costs your fleet →
At a glance
The items that stop a node, and the ones to plan around. Details and commands are below.
| Step | Fix before you click Update | Watch for |
|---|---|---|
| 1.34 → 1.35 |
|
|
Removed APIs: none
The deprecation guide has no 1.35 entry. Check for leftovers from 1.32 anyway.
No Kubernetes API is removed in 1.35
The Kubernetes deprecated API migration guide has no entry for 1.35: nothing you apply today stops being served at this hop. The last removal on the EKS path was flowcontrol.apiserver.k8s.io/v1beta3 at 1.32, and a chart or manifest that still uses it has failed on every version since. Run the check anyway. It is the one item that is cheap to fix today and expensive to find during the window.
kubectl get --raw /metrics | grep apiserver_requested_deprecated_apis # a line here is a client that called a deprecated API since the API server last restartedgrep -rn 'flowcontrol.apiserver.k8s.io/v1beta3' . # run in your manifests and charts repoNothing for 1.35. Move any leftover flowcontrol.apiserver.k8s.io/v1beta3 manifest to v1; the fields are the same.
Lists every removed and deprecated API still in use, read from the live cluster, so a 1.32 leftover shows up here even though 1.35 removes nothing new.
cgroup v1
The one change in 1.35 that stops a node from joining. Stock AL2023 and Bottlerocket are fine; custom configurations are not.
Nodes on cgroup v1: the 1.35 kubelet refuses to start
Cgroup v1 Support Removed: Kubernetes 1.35 deprecates cgroup v1 support, meaning the kubelet will refuse to start by default on nodes using cgroup v1.Amazon EKS user guide, Kubernetes versions on standard support
Action required: Customers who manually configured AL2023 to use cgroup v1 must either migrate to cgroups v2 or manually set failCgroupV1: false in kubelet configuration.Amazon EKS user guide, Kubernetes versions on standard support
Bottlerocket: Bottlerocket 1.35 uses cgroup v2 by default, however sets failCgroupV1: false in the kubelet configuration, maintaining backward compatibility.Amazon EKS user guide, Kubernetes versions on standard support
Fargate: Fargate continues to use cgroup v1.Amazon EKS user guide, Kubernetes versions on standard support
A node that boots on cgroup v1 with a 1.35 kubelet never joins the cluster. AL2023 is cgroup v2 by default, so stock node groups are fine. The risk is a launch template or nodeadm config that put AL2023 back on cgroup v1 (systemd.unified_cgroup_hierarchy=0 on the kernel command line is the usual way) and custom AMIs built on an older base. Bottlerocket 1.35 sets failCgroupV1: false itself, and Fargate is unaffected.
kubectl get nodes -o custom-columns=NODE:.metadata.name,OS:.status.nodeInfo.osImage,KERNEL:.status.nodeInfo.kernelVersion # the OS image tells you which nodes to look at; cgroup mode is not in the Node objectstat -fc %T /sys/fs/cgroup/ # on the node (SSM, or kubectl debug node/<node>): cgroup2fs is v2, tmpfs is v1- Move the node group to cgroup v2: drop the cgroup v1 kernel parameter from user data, or rebuild the custom AMI on AL2023 and let it default.
- If a workload really needs cgroup v1, set
failCgroupV1: falsein the kubelet config (nodeadmNodeConfig→spec.kubelet.config) before rolling nodes to 1.35. That keeps you on a deprecated mode, so plan the migration anyway.
Reads kubelet_cgroup_version from each kubelet's /metrics and lists the hosts still on v1 (rule rtz-k8s-node-cgroupv1-fails-1.35). It needs nodes/metrics access for that; without it the item is reported as unchecked, not as clean.
containerd 1.x
Still runs on 1.35, blocked at 1.36. Fix it on this version.
containerd 1.x: 1.35 is the last version that runs it
Containerd 1.x End of Support: Kubernetes 1.35 is the last release supporting containerd 1.x. You must switch to containerd 2.0 or later before upgrading to the next Kubernetes version.Amazon EKS user guide, Kubernetes versions on standard support
Containerd updated to 2.1 in Version 1.34 for launch.Amazon EKS user guide, Kubernetes versions on standard support
Nothing stops at this hop. EKS-optimized AMIs have shipped containerd 2.1 since 1.34, so managed node groups on a current AMI are already done. Custom AMIs and self-managed nodes that pinned containerd 1.7 keep working on 1.35 and are blocked at 1.36. Treat 1.35 as the version where you fix it, because the next hop will not wait.
kubectl get nodes -o wide # CONTAINER-RUNTIME column: containerd://2.x is ready, containerd://1.x is notkubectl get nodes -o custom-columns=NODE:.metadata.name,RUNTIME:.status.nodeInfo.containerRuntimeVersion --no-headers | grep 'containerd://1\.' # every node printed needs a new AMI before 1.36- Rebuild custom AMIs on a containerd 2.x base (the EKS AL2023 and Bottlerocket images already are) and test anything that writes
/etc/containerd/config.toml: the config schema changed between 1.x and 2.x. - Roll those node groups while you are on 1.35, so the 1.36 hop is only a version change.
Reads kubelet_cri_losing_support from each kubelet's /metrics, the gauge the kubelet sets when its own container runtime loses support at a coming version (rule rtz-k8s-node-cri-losing-support), and prints the node and the version it is lost at.
--pod-infra-container-image
A removed kubelet flag. Only custom AMIs and hand-written user data carry it, and nothing in the cluster can see it.
The --pod-infra-container-image kubelet flag is gone
Kubelet Flag Removal: The --pod-infra-container-image flag has been removed from kubelet. Custom AMI users must remove this flag from kubelet configuration before upgrading to 1.35.Amazon EKS user guide, Kubernetes versions on standard support
A kubelet started with a flag it no longer knows exits at once, so a node that still passes --pod-infra-container-image never becomes Ready on 1.35. EKS-optimized AMIs don't set it. Where it hides: bootstrap user data (--kubelet-extra-args on AL2, spec.kubelet.flags in a nodeadm NodeConfig on AL2023), Karpenter EC2NodeClass user data, and custom AMI build scripts. Kubelet flags live on the host, not in any Kubernetes object, so no cluster-side query sees them.
aws ec2 describe-launch-template-versions --launch-template-id <lt-id> --versions '$Latest' --query 'LaunchTemplateVersions[0].LaunchTemplateData.UserData' --output text | base64 -d | grep -n pod-infra-container-image # repeat per node group launch templatekubectl get ec2nodeclasses -o json | jq -r '.items[] | select(.spec.userData != null and (.spec.userData | test("pod-infra-container-image"))) | .metadata.name' # Karpenter user data, if you run itgrep -rn pod-infra-container-image /etc/eks /etc/kubernetes /etc/systemd/system/kubelet.service.d 2>/dev/null # on one node of each custom AMI- Delete the flag. The pause image is containerd's to pick: set
sandbox_imageunder the CRI plugin in/etc/containerd/config.tomlif you need a copy from a private registry. - Boot one 1.35 node from the changed template before rolling the group.
Does not check kubelet command-line flags, and says so rather than reporting clean: they are a host-level fact with no object in the API, so the catalog marks rtz-k8s-kubelet-pod-infra-container-image-removed not detectable. Grep the user data yourself.
IPVS kube-proxy
Deprecated, still working. Plan the move to nftables outside the upgrade window.
kube-proxy in IPVS mode is deprecated
Deprecation Notice - IPVS Mode: IPVS mode in kube-proxy is deprecated and will be removed in a future Kubernetes release. Migrate to nftables mode.Amazon EKS user guide, Kubernetes versions on standard support
Marked `ipvs` mode in kube-proxy as deprecated, which will be removed in a future version of Kubernetes. Users are encouraged to migrate to `nftables`.Kubernetes 1.35 changelog
Nothing breaks at 1.35: IPVS keeps working and logs a deprecation warning. EKS defaults to iptables, so this only applies if someone set mode: ipvs in the kube-proxy add-on configuration. The replacement is nftables, GA since 1.33, which needs a 5.13 or newer kernel (AL2023 and Bottlerocket qualify). Switching the proxy mode is a data-plane change: give it its own window, not the upgrade's.
kubectl -n kube-system get cm kube-proxy-config -o jsonpath='{.data.config}' | grep -E '^\s*mode:' # empty or iptables: nothing to do; ipvs: plan the move- Follow AWS's nftables guide: set
mode: nftablesin the kube-proxy add-on configuration and roll the kube-proxy pods. Check first that nothing on the nodes manages its own iptables rules that nftables mode would bypass. - Don't change the proxy mode and the Kubernetes version in the same change.
Reads mode: from the kube-proxy ConfigMap and reports ipvs as deprecated from 1.35 (rule rtz-kube-proxy-1.35-ipvs-mode-deprecated). A mode passed only as a container argument is not read.
Ingress NGINX
Not a version break, but AWS flags it in the 1.35 notes: the controller was retired upstream in March 2026.
Ingress NGINX is retired upstream. Not a version break, but AWS flags it here
In March 2026, the upstream Kubernetes project will retire Ingress NGINX, a critical infrastructure component for many Kubernetes environments.Amazon EKS user guide, Kubernetes versions on standard support
Existing deployments will continue to work, but remaining with Ingress NGINX after retirement leaves your environment vulnerable to security risks, as none of the available alternatives are direct drop-in replacements and will require planning and engineering time.Amazon EKS user guide, Kubernetes versions on standard support
Nothing about 1.35 changes how the controller runs. The problem is that there are no more releases: the next CVE in the controller or in the bundled NGINX stays open, and the last release's compatibility table ends at 1.35, so a later Kubernetes hop has no supported version to move to. AWS puts this in the 1.35 notes because this is the upgrade window in which to start the migration.
kubectl get deploy,ds -A | grep ingress-nginxkubectl get ingressclass -o custom-columns=NAME:.metadata.name,CONTROLLER:.spec.controller # k8s.io/ingress-nginx is the retired controller- Pick a target: Gateway API with a maintained implementation, or a maintained Ingress controller. Inventory the
nginx.ingress.kubernetes.io/*annotations you depend on first; snippets and auth annotations are where the direct translation stops. - Pin the last release in the meantime and watch its image for CVEs.
Lists ingress-nginx under add-on compatibility with the version window its own release notes publish; the newest release covers Kubernetes 1.31 to 1.35. The retirement itself is not a version check. At the 1.36 hop no release lists the target, and the report says so instead of passing it.
Add-on versions for 1.35
Move the EKS add-ons to their 1.35 builds after the control plane hop and before the node roll. The command below prints the default build per add-on for 1.35, so you can re-check.
| Add-on | AWS default on 1.35 | Note |
|---|---|---|
| Amazon VPC CNI | v1.22.4-eksbuild.10 | Not the newest release (v1.23.2). Moving to v1.23 later needs Network Policy Agent v1.4.1 or newer on the same update. |
| CoreDNS | v1.13.2-eksbuild.62 | Upstream CoreDNS is at 1.14.7; the AWS build lags by design. Read the Corefile rules before moving past 1.13. |
| kube-proxy | v1.35.3-eksbuild.62 | Move to the 1.35 build after the control plane hop. Builds from 1.32 to 1.35 are inside the version-skew window. |
| Amazon EBS CSI driver | v1.67.2-eksbuild.1 | No Kubernetes compatibility table published; current upstream release. |
| EKS Pod Identity Agent | v1.4.1-eksbuild.3 | Not in the rule catalog; the AWS default is the only reference. |
for a in vpc-cni coredns kube-proxy aws-ebs-csi-driver eks-pod-identity-agent; do echo "== $a"; aws eks describe-addon-versions --kubernetes-version 1.35 --addon-name "$a" --query 'addons[].addonVersions[?compatibilities[?defaultVersion==`true`]].addonVersion' --output text; doneThese are the versions AWS installs on a new 1.35 cluster as of November 1, 2026, not minimums: an older build can keep running after the hop. Add-ons older than the 1.34 default should be upgraded before the control plane, so the hop starts from a supported pair. Pass your add-on configuration explicitly on every update; an add-on update can reset fields you set by hand, such as the IAM role on the aws-node service account.
What you get after
In AWS's words, one line each.
In-place pod resize is stable
allows users to adjust CPU and memory resources without restarting Pods or containers
— Only CPU and memory: a resize that touches any other resource is rejected.
PreferSameNode traffic distribution is stable
allow services to strictly prioritize endpoints on the local node when available, falling back to remote endpoints otherwise
— PreferClose is deprecated at the same time; PreferSameZone is the explicit spelling.
StatefulSet maxUnavailable is beta
enables parallel Pod updates by setting maxUnavailable (e.g., 3 or 10%)
— Opt in per StatefulSet; the default stays one pod at a time.
Windows Server 2025 nodes
EKS 1.35 adds support for Windows Server 2025
— New Windows node groups can start on the current server release.
Frequently asked questions
Still curious? hello@runtimez.io
Does EKS 1.35 remove any Kubernetes APIs?
No. The Kubernetes deprecated API migration guide has no entry for 1.35, so nothing you apply today stops being served at this hop. The last removal on the EKS path was flowcontrol.apiserver.k8s.io/v1beta3 at 1.32; a manifest that still uses it has failed since then and should move to v1.
Will my nodes break on cgroup v1?
Yes, unless you opt out. From 1.35 the kubelet refuses to start by default on a cgroup v1 host. AL2023 is cgroup v2 by default, so stock node groups are fine; anyone who manually set AL2023 to cgroup v1 must migrate or set failCgroupV1: false in the kubelet config. Bottlerocket 1.35 sets failCgroupV1: false itself, and Fargate still uses cgroup v1 and is unaffected. Check a node with stat -fc %T /sys/fs/cgroup/: cgroup2fs means v2.
Do I need containerd 2 for 1.35?
Not yet. 1.35 is the last Kubernetes release that supports containerd 1.x, so it still runs here, but you must be on containerd 2.0 or later before upgrading to 1.36. EKS-optimized AMIs moved to containerd 2.1 at 1.34; the risk is custom AMIs. Check the CONTAINER-RUNTIME column of kubectl get nodes -o wide.
When does 1.34 extended support billing start?
December 2, 2026. From that date every EKS 1.34 cluster bills at $0.60 per cluster-hour instead of $0.10, about $365 more per cluster per month. 1.35 is on standard support until March 27, 2027.
Can I skip from 1.34 to 1.36?
No. Amazon EKS updates the control plane one minor version at a time, so 1.34 to 1.36 is two upgrades: 1.35 first, then 1.36. Managed node groups and Fargate nodes must be brought to the control plane's version between hops, and the containerd 1.x nodes that still run on 1.35 are blocked at 1.36.
Check your cluster, then watch it.
Connect the read-only agent and Runtimez runs every rule above continuously, with the add-on and runtime end-of-life dates. Or run the open-source CLI once, from your laptop. Nothing leaves your machine.
helm repo add runtimez https://charts.runtimez.iohelm install runtimez-agent runtimez/runtimez-agent --set token=<token>kube-upgrade-check --target 1.35Sources
Every quote above is copied from one of these. Checked November 1, 2026.
- Amazon EKS user guide, Kubernetes versions on standard support
- Kubernetes 1.35 changelog
- Kubernetes docs, Deprecated API migration guide
- Amazon EKS best practices, Running kube-proxy in nftables mode
- Kubernetes docs, About cgroup v2
- Amazon EKS user guide, Update existing cluster to new Kubernetes version
Last updated
