cluster.ninja

Upgrade hop

Kubernetes 1.30 → 1.31

1.30End of lifeEOL 15 Jul 2025 1.31End of lifeEOL 11 Nov 2025

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

  1. 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.
  2. 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.
  3. kube-controller-manager, kube-scheduler, cloud-controller-manager to 1.31, once every API server is on 1.31.
  4. 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.
  5. kube-proxy: no newer than the API server, and within the same window as the kubelet it runs beside.
  6. 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.