Upgrade hop
Kubernetes 1.30 → 1.31
1.31 is itself end of life. If you are on 1.30 today, plan the whole path to a supported version (at least 1.35) with the upgrade planner.
1 · Fix removed APIs first
No API versions are removed between 1.30 and 1.31.
2 · Other changes that can bite
Removed in 1.31
- The last in-tree cloud provider integrations are gone; every cluster now needs an external cloud provider integration.
- In-tree CephFS volume plugin removed, so cephfs volumes no longer work. Switch to the CephFS CSI driver and redeploy affected apps.
- In-tree Ceph RBD volume plugin and its CSI migration removed, so rbd volumes no longer work. Switch to the RBD CSI driver.
- kubelet flag --keep-terminated-pod-volumes, deprecated since 2017, removed.
- Alpha InTreePlugin*Unregister feature gates for AWS, Azure Disk, Azure File, GCE, OpenStack and vSphere removed as redundant.
- AzureDiskLimits, CinderLimits, EBSLimits and GCEPDLimits dropped from the scheduler's default plugin list.
Deprecated in 1.31
- Node field .status.nodeInfo.kubeProxyVersion deprecated because the kubelet cannot report it reliably; DisableNodeKubeProxyVersion now defaults to true, so the kubelet stops filling it.
- All non-CSI volume-limit scheduler plugins deprecated; custom scheduler configs should use NodeVolumeLimits instead.
- cgroup v1 support enters maintenance mode: no new features, security fixes still provided, other bug fixes best-effort. Start moving nodes to cgroup v2.
- SHA-1 signed certificates for webhooks or aggregated API servers only work with GODEBUG=x509sha1=1, and that opt-in disappears with Go 1.24.
Our summary of the 1.31 release announcement (CC BY 4.0). Read the full changelog for your components.
3 · Upgrade in this order
- Prepare. Move every node to 1.28 or newer if any are older: a 1.31 API server supports kubelets back to 1.28 only. Upgrade to the newest 1.30 patch,
1.30.14. - kube-apiserver to 1.31 (in HA clusters, one instance at a time; old and new may differ by one minor during the roll). Use the newest patch,
1.31.14. - kube-controller-manager, kube-scheduler, cloud-controller-manager to 1.31, once every API server is on 1.31.
- kubelet on each node (drain first). Optional in this hop: kubelets from 1.28 to 1.31 all work with a 1.31 control plane.
- kube-proxy: no newer than the API server, and within the same window as the kubelet it runs beside.
- kubectl: 1.30 to 1.32 all talk to a 1.31 API server.
From the official version skew policy. Managed services run the control-plane steps for you; node pools are still yours to schedule.