February 28, 2024·4 min read·engineeringkubernetesmaintenanceupgrades

Kubernetes 1.26 reaches the limit of upstream maintenance

The end of Kubernetes 1.26 support separates a running cluster from a maintained release. Version skew and sequential upgrades explain why that distinction needs attention before the deadline.

An older Kubernetes cluster can continue to run after its upstream maintenance ends. That continuity makes an end-of-life date easy to underestimate. Applications may remain healthy while the project stops supplying the fixes that protect the release against newly discovered defects. The Kubernetes 1.26 release page puts that boundary on February 28, 2024. The release no longer receives upstream security updates or bug fixes.

The date changes the maintenance arrangement around the cluster. It does not describe a new failure in the cluster itself. This distinction matters because apparent operational stability says little about whether anyone will produce the next necessary patch. A maintained release has an organized process for reviewing and distributing applicable fixes. An unsupported release no longer has that upstream commitment.

I trust Kubernetes's reconciliation design because controllers can resume work from the state they observe. That property is valuable during failures and interrupted operations. It does not remove the need to replace the software implementing those controllers. A functioning reconciliation loop can continue executing an implementation whose maintenance window has closed.

Why the support window is bounded

The history behind the deadline appears in KEP-1498, Kubernetes yearly support period. The proposal responds to a practical mismatch between a nine-month maintenance window and organizations whose financial and operational planning follows annual cycles. Extending support gives operators more room to schedule upgrades without asking the community to maintain every old release indefinitely.

The proposal describes twelve months of support with an additional two-month upgrade period. It explicitly excludes a conventional long-term-support release maintained for several years. That boundary matters when someone interprets a longer window as permission to standardize on one minor release indefinitely. The proposal tries to make ordinary upgrades easier to schedule while retaining a finite upstream maintenance burden.

Support also depends on software outside Kubernetes. The KEP says that the project will pick up security fixes from dependencies when their maintainers make suitable fixes available. It does not promise to maintain forks of major dependencies or backport fixes into dependencies abandoned by their own communities. Extending Kubernetes support alone cannot create an unlimited maintenance lifetime for everything it contains.

This makes the end-of-life date an engineering constraint as well as a project policy. Keeping a release supported requires people to review backports and maintain test infrastructure. The KEP discusses those costs directly. A longer window helps operators, but it also assigns more maintenance work to the release process. The agreed window is the period within which those responsibilities remain bounded.

Compatibility does not extend maintenance

The version skew policy as documented before this deadline explains which combinations of component versions Kubernetes supports. Those rules allow a cluster to pass through mixed versions during an upgrade. They do not turn every older component in a permitted combination into a release with renewed patch support.

For example, kubelets must not be newer than the API servers they use. Kubelets at version 1.25 and later can be up to three minor versions older than the API server. Controller managers and the scheduler have a narrower allowance. They are expected to match the API server's minor version, with one older minor version permitted for live upgrades. These different limits reflect different component relationships.

The API servers themselves must remain within one minor version in a highly available cluster. That constraint applies while an upgrade is in progress, including the period when a load balancer may send a request to either version. The allowed versions for clients and other components must work with every API server they can reach. Looking only at the newest server can therefore give the wrong answer.

I regard this policy as a description of a transition, with explicit limits on its intermediate states. It gives an operator room to replace components without requiring an instantaneous cluster-wide change. It does not justify leaving the oldest permitted components untouched until the next upgrade makes them incompatible.

Delaying an upgrade preserves the intermediate work

The same policy requires API server upgrades to proceed without skipping minor versions. A cluster that waits through several releases still has to cross the intervening control-plane versions. A later target does not remove those transitions. This is one reason an apparently economical decision to postpone maintenance can accumulate additional work at a less convenient time.

Upgrade order follows the component constraints. API servers advance before the controllers that must not be newer than them. The documentation also calls for draining pods before a minor kubelet upgrade. These rules explain why replacing a version number in a deployment record is an incomplete account of the operation. The running cluster moves through a sequence of compatible states.

For a 1.26 installation, the immediate question is who provides maintenance after February 28. Any distributor commitment must be evaluated on its own terms because it is separate from the upstream release window. For installations relying on upstream support, moving through the documented upgrade sequence is the way to regain that maintenance. The destination and the intermediate component versions both belong in that decision.