Kubernetes Promised Efficiency. Your Cluster Delivered Something Else.
Photo: DFID - UK Department for International Development, CC BY 2.0, via Wikimedia Commons
The pitch was compelling when it arrived, and it has only grown more persuasive over time. Container orchestration, the argument went, would finally solve the resource utilization problem that had plagued enterprise computing for decades. By abstracting workloads away from physical hardware and scheduling them dynamically across available capacity, platforms like Kubernetes would eliminate the padding, the overprovisioning, and the idle cycles that had made traditional infrastructure so wasteful.
That promise has not been kept — at least not at the scale the industry anticipated. For a significant portion of the engineering organizations that have adopted Kubernetes in production, utilization rates remain stubbornly low, idle compute persists in new and harder-to-detect forms, and the operational complexity introduced by container orchestration has, in many cases, made the waste more difficult to find and address than it was before.
This is not an argument against Kubernetes. It is an examination of why the efficiency gains the platform theoretically enables so frequently fail to materialize in practice.
The Utilization Paradox
Kubernetes clusters are, by design, supposed to improve bin packing — the process of fitting workloads onto nodes as efficiently as possible, minimizing the amount of allocated but unused capacity. The scheduler is sophisticated, the tooling is mature, and the underlying architecture is well suited to the task.
And yet, studies of production Kubernetes environments consistently find that a substantial portion of requested compute resources go unused. Datadog's annual container report, along with independent analyses from several platform engineering consultancies, has placed the gap between requested and actually consumed CPU and memory in the range of 50 to 70 percent across sampled production clusters.
The paradox is that Kubernetes did not create this problem — it inherited it from the humans configuring it, and then made it structurally harder to resolve.
Resource Requests as the Original Sin
The most pervasive source of waste in Kubernetes environments is also the most mundane: developers setting resource requests and limits without adequate data to inform those values.
Resource requests tell the Kubernetes scheduler how much CPU and memory a pod requires. The scheduler uses these values — not actual consumption — to decide where to place workloads. If a developer specifies a CPU request of 500 millicores for a service that consistently consumes 80, the scheduler reserves the larger figure. Multiply that pattern across hundreds or thousands of pods, and the gap between reserved and consumed capacity becomes enormous.
The reasons this happens are understandable. Developers setting resource requests are often working from intuition, from values copied from documentation examples, or from a reasonable desire to avoid resource contention. The incentive structure mirrors the broader overprovisioning dynamic: the cost of under-requesting is a throttled or evicted pod; the cost of over-requesting is invisible.
"Engineers don't feel the cost of an inflated resource request," noted one staff engineer at a SaaS company in Seattle who has spent the past two years working on platform efficiency. "It's not their cloud bill. It's not their on-call alert. The feedback loop is completely broken."
Orphaned Workloads and the Cluster Archaeology Problem
Beyond misconfigured requests, production clusters accumulate waste through a different mechanism: workloads that were deployed for legitimate purposes and never decommissioned.
A staging environment stood up for a feature that shipped six months ago. A batch job that was superseded by a new pipeline but whose CronJob definition was never removed. A deployment scaled to three replicas for a load test and never scaled back down. These orphaned workloads are common in clusters that have been running for more than a year, and they are disproportionately expensive because they tend to carry the resource requests of their original, often peak-load-oriented configuration.
Auditing a mature production cluster for orphaned workloads is a process that platform teams frequently describe as archaeological. The original engineers who deployed a given workload may no longer be with the organization. Documentation is inconsistent. Deleting an unrecognized deployment carries risk. The path of least resistance is to leave it running.
Tools like Goldilocks, Robusta, and Kubecost have emerged specifically to address this visibility gap, surfacing underutilized and potentially orphaned workloads alongside recommendations for right-sizing. Adoption of these tools remains uneven, however, and their recommendations are only as useful as the organizational will to act on them.
Namespace Sprawl and Scheduling Fragmentation
A subtler source of waste arises from the way large organizations structure their clusters. Namespace-based multi-tenancy — the practice of running multiple teams or environments within a single cluster, separated by namespace — is standard practice, but it introduces scheduling constraints that can fragment capacity in ways that defeat the scheduler's bin-packing logic.
When namespaces carry resource quotas, and when teams provision their quotas conservatively to avoid being throttled, the scheduler may be unable to place workloads on nodes that technically have available capacity, because the namespace quota for the requesting team has been exhausted. The node sits partially idle; the workload queues. The cluster appears full while remaining underutilized.
This is not a Kubernetes bug. It is a predictable consequence of applying human organizational boundaries to a system designed to optimize across them. The solution — relaxing namespace quotas, implementing hierarchical resource management, or restructuring multi-tenancy models — requires cross-team coordination that is organizationally difficult to execute.
Toward Genuine Efficiency
The engineering teams that have made meaningful progress on Kubernetes utilization share several characteristics. They instrument actual consumption, not just requests, and they make that data visible to the engineers who own the workloads. They establish ownership accountability for cluster resources — if a service's idle compute has a dollar figure attached to it in a shared dashboard, engineers engage with it differently than if it is an abstract configuration value.
They also treat the cluster scheduler as a collaborator rather than an obstacle, using Vertical Pod Autoscaler in recommendation mode to surface right-sizing suggestions without automatically applying them, and gradually shifting toward automated adjustment as confidence in the tooling grows.
Perhaps most importantly, they acknowledge that the efficiency gains Kubernetes promises are not automatic. They are the output of deliberate, ongoing engineering work — work that is easy to deprioritize when feature development dominates the roadmap, and whose absence accumulates silently in the form of idle compute that costs real money every hour it runs.
The platform is not the problem. The assumption that deploying it was sufficient is.