Skip to content

LeadershipNot yet confirmed elsewhere1 publisher2 min readPublished

Kubernetes v1.35 kubelet refuses to start on cgroup v1 nodes by default

Kubernetes v1.35 sets failCgroupV1 to true by default, so the kubelet will not start on a node still running cgroup v1. Teams below v1.35 now decide before upgrading between migrating every Linux node and carrying a temporary override the project plans to remove.

The Board Room · Leadership desk

How we use AISend a correction

Illustration accompanying Kubernetes v1.35 kubelet refuses to start on cgroup v1 nodes by default
Generated illustration
v1.35 kubelet won't start on cgroup v1 nodes by default How the v1.35 failCgroupV1 default reaches each kind of cluster, team and workload, and what each must decide, carry or can gain.

Clusters below v1.35 must migrate or plan the override. Clusters on v1.35 or later see leftover cgroup v1 nodes fail at kubelet startup. kubeadm preflight errors at init, join, upgrade. The override is temporary. I/O-heavy Pods still face evictions. Only cgroup v2 nodes get Memory QoS.

v1.35 kubelet won't start on cgroup v1 nodes by default
WhoHowKindClaim
Clusters below v1.35Before upgrading, migrate every Linux node to cgroup v2 or plan the temporary failCgroupV1: false overridedecision4
Clusters on v1.35 or laterUnder the default configuration, any remaining cgroup v1 node fails during kubelet startupexposure5
kubeadm-managed clustersSystemVerification preflight returns an error at init, join and upgrade on cgroup v1 with kubelet v1.35 or laterconstraint6
Teams keeping the overridefailCgroupV1: false is temporary; its removal follows the Kubernetes deprecation policycost2
I/O-intensive workloadsMoving to cgroup v2 does not change active_file counting; a large page cache can still trigger Pod evictionsexposure9
Nodes migrated to cgroup v2Only cgroup v2 nodes can run Memory QoS; cgroup v1 cannot provide its protection modelcapability12

What happened

  • In kubeadm clusters, the v1.35 SystemVerification preflight check returns an error at init, join and upgrade when it finds cgroup v1 with a v1.35 or later kubelet.
  • Moving to cgroup v2 does not change how the kubelet counts active_file memory, so large page caches can still trigger memory pressure and Pod evictions.
  • Memory QoS, which remains alpha in v1.36, runs only on cgroup v2 nodes because cgroup v1 cannot provide its memory protection model.

Why it matters

  • decision Choosing the override this quarter commits a team to the same migration at a later upgrade, on a timetable set by the Kubernetes deprecation policy instead of its own plan.
  • constraint kubeadm fleets need a complete per-node cgroup inventory before the upgrade window opens, since the preflight check catches a missed node at the start of the operation.
  • capability Migrated nodes can later adopt tiered memory protection for Guaranteed and Burstable Pods, an option cgroup v1 nodes will never have.

The default flip puts the failure at kubelet startup. On v1.35 or later, under the default configuration, any remaining cgroup v1 node fails as the kubelet starts [5]. For clusters still below v1.35, the project tells operators to migrate every Linux node to cgroup v2 before upgrading, or to plan for the temporary override [4]. Clusters already on v1.35 should confirm that every Linux node runs cgroup v2, or that any override is there on purpose [5].

The project gave a long notice period before the flip. By v1.35, cgroup v2 support had been stable for ten minor releases [18], and cgroup v1 had spent four releases in maintenance mode [19]. Kubernetes has deprecated cgroup v1 [16].

A platform lead with a full roadmap could fairly say the override makes this next year's problem. For the kubelet, that holds for a while. Operators can set failCgroupV1: false in the kubelet configuration file, and the project describes the setting as temporary [2]. Its removal will follow the Kubernetes deprecation policy, with the remaining work tracked in KEP-5573 [2][3]. We think the override is defensible for a team that needs v1.35 this quarter for other reasons and already has a dated migration plan.

kubeadm fleets hit the check sooner. The project calls the v1.35 SystemVerification preflight check an earlier, stricter check, and it applies to init, join and upgrade alike [6]. The post does not say whether the kubelet override changes that preflight result.

Teams hoping the move would end page-cache evictions on I/O-heavy workloads will still need the existing workaround. That means equal memory requests and limits for containers doing intensive I/O, set after measuring an appropriate value [10]. The underlying kubelet behaviour is tracked as kubernetes/kubernetes#43916 [9].

We would not count Memory QoS as a reason to migrate this quarter. The feature was introduced as alpha in v1.22 and is still alpha in v1.36 [11], fourteen minor releases later [20]. The project's general advice is to keep alpha features out of production [13]. Its new tiered mode maps Guaranteed Pod memory requests to hard protection and Burstable requests to soft protection [15]. Teams that enable it in production are told to test the configuration and account for hard-reserved memory first [17]. The recommendation is kernel 5.9 or later. Below that, a known livelock can be set off by memory.high reclaim, and starting with v1.36 the kubelet writes a warning to its log if Memory QoS is turned on with one of those affected kernels [14].

What to watch

  • Which Kubernetes release removes the failCgroupV1 override under KEP-5573 and the deprecation policy.
  • Project guidance on whether setting failCgroupV1: false also clears the kubeadm SystemVerification preflight error.
  • Whether Memory QoS with tiered reservation leaves alpha in a release after v1.36.

Clarity's read

What the record supports and how the coverage leans. The claims behind it follow.

Reality

Evidence72
Adoption
Insufficient
Hype gap0
Incentives
Insufficient
Confidence68
Why these scores

Claim ledger

Ranked by verification strength, evidence, and original report placement.

  1. [1]

    Starting with Kubernetes v1.35, failCgroupV1 defaults to true, so the kubelet does not start on a cgroup v1 node by default.

    ReportedSupportedView cited source
  2. [2]

    Administrators can temporarily set failCgroupV1: false in the kubelet configuration file, but removal will follow the Kubernetes deprecation policy.

    ReportedSupportedView cited source
  3. [3]

    Further removal work is tracked in KEP-5573: Remove cgroup v1 support.

    ReportedSupportedView cited source

Sources

1 independent publisher whose own reporting we read for this story.

  1. kubernetes.io

    1 article · October 10, 2026

    The Shift to cgroup v2 in Kubernetes: What You Need to Know

Share your take

Let Clarity write the post for you.

Signed-in readers get a short post drafted on this story in the register they choose — narrative, analytical, or a direct position — editable to the last word before it goes anywhere. The share buttons at the top of this story work without an account.

Topics and entities

Follow any of these and your For You feed starts watching them — no settings page required.

Topics

  • Linux cgroupsFollow
  • Kubernetes node resource managementFollow
Loading related stories