Cloud & infrastructure

Three distinct bottlenecks limit Kubernetes control plane scaling

Kubernetes clusters fail at scale due to node churn, object state, or write intensity, not just node count. New architectural seams offer targeted fixes for each bottleneck.

Illustration of Kubernetes scaling bottlenecks represented as mechanical gears with adjustable seams.
Illustration generated for this article

Kubernetes scaling challenges are often misdiagnosed as simple node-count limits, but recent analysis reveals three distinct failure modes: churn, state, and node capacity. As clusters grow beyond five thousand nodes or handle intense agent workloads, standard horizontal scaling of API servers can exacerbate memory pressure rather than relieve it. Understanding these specific bottlenecks allows infrastructure teams to apply targeted architectural fixes using stock upstream components.

What happened

Many engineering teams assume that scaling a Kubernetes control plane is a linear problem solved by adding more API servers. However, real-world production clusters demonstrate that this approach often fails when the underlying bottleneck is not request volume but memory residency or write intensity. For example, a training fleet might sit stable at a few thousand nodes before jumping to fifteen thousand, causing etcd complaints and API server memory exhaustion. In contrast, an agent platform with only a few thousand nodes may suffer from thousands of object transitions per minute, creating a write storm that overwhelms the control plane regardless of node count.

A third scenario involves platform clusters with hundreds of operators and tens of thousands of static objects. Here, the issue is not activity but state: every API server holds a copy of all objects in its watch cache. Adding more API servers in this context replicates the entire cache, increasing memory usage without improving performance. These three scenarios—node-bound, churn-bound, and state-bound—require different solutions, yet most public guidance focuses exclusively on node counts up to five thousand.

The lack of documented strategies for larger or more complex clusters leads teams to make counterproductive changes. Adding API servers to a state-bound cluster increases memory pressure because each new instance replicates the full watch cache. The solution lies not in custom forks but in understanding the "seams" of Kubernetes architecture, where components can be decoupled and configured independently to handle specific types of load.

How it works

Kubernetes scalability is constrained by four architectural "seams," which are substitution points between components. The first seam is storage, which determines which backend holds which resource types. Not all data requires the same durability; ephemeral items like node leases and events can be routed away from the primary etcd cluster to reduce write load. The second seam is node liveness, which handles how heartbeat data reaches the control plane. By absorbing lease renewals in a node-facing tier or using in-memory lease refreshes in etcd, clusters can drastically reduce the write QPS generated by thousands of kubelets.

The third seam is sharding, which defines how objects are divided across controllers and caches. If layers do not agree on the sharding axis, controllers waste resources reaching for objects outside their scope. The fourth seam is cache residency, which controls what an API server keeps in memory. A state-bound cluster suffers because every API server caches every object. By restricting cache contents to only the objects relevant to a specific shard or role, memory usage can be cut significantly, though some baseline overhead for RBAC objects remains unavoidable.

Key details

  • Node-bound clusters are limited by kubelet heartbeats, with lease renewals accounting for roughly 70% of write QPS at scale.
  • Churn-bound clusters face high write rates from short-lived custom resources, such as agent sessions, independent of node count.
  • State-bound clusters are constrained by memory usage, as each API server replicates the entire watch cache of tens of thousands of objects.
  • KEP-4743 defines the storage-interface boundary, allowing resource types to be routed to different backends via --etcd-servers-overrides.
  • KEP-5866 introduces hash-range filtering for API traffic, laying the foundation for consistent sharding across controllers and caches.
  • Role-Split configurations separate machine pools for API serving, scheduling, and etcd, enabling scaling up to 20,000 nodes.

Why it matters

For software engineers and infrastructure leads, recognizing the specific type of scale limitation is critical to avoiding costly misconfigurations. Treating a churn-bound agent platform as a node-bound problem leads to over-provisioning compute while ignoring the write bottleneck in etcd. Similarly, adding API servers to a state-bound platform cluster increases memory costs without improving latency. By identifying whether the cluster is limited by node heartbeats, object churn, or state residency, teams can apply precise fixes rather than brute-force scaling.

These insights also highlight the importance of using stock upstream components with deliberate configuration rather than relying on undocumented forks. The proposed "recipe ladder" provides a path from classic high-availability setups to partitioned stores and sharded slices, all tested with continuous integration. This approach ensures that scaling strategies remain valid across Kubernetes releases, as configuration failures are caught early in the CI pipeline rather than in production.

What you can do

  • Identify your cluster’s primary bottleneck by analyzing write QPS sources, distinguishing between node leases, custom resource churn, and static object state.
  • Implement role-split configurations to separate API serving, scheduling, and etcd onto dedicated machine pools for clusters up to 20,000 nodes.
  • Use --etcd-servers-overrides to route ephemeral resources like events and leases to separate backends, reducing load on the primary etcd cluster.
  • Evaluate node-facing tiers to absorb lease renewals and propagate only real state transitions, lowering the write burden on the control plane.
  • Contribute real-world write rate data from churn-bound clusters to SIG API Machinery to help shape future support for per-CRD storage configuration.
  • Review prototype branches for KEP-5866 and cache residency extensions to prepare for upcoming sharding and memory optimization features.
  • #kubernetes
  • #scaling
  • #infrastructure
  • #devops
  • #cloud-native

Tools from the Bytechap store

Keep reading

All stories