Kubernetes costs are high because most teams overprovision resources by default, run autoscaling on settings nobody tuned, and have no mechanism to hold anyone accountable for cloud spend. Our 2026 State of Kubernetes Optimization Report, drawn from direct telemetry across tens of thousands of production clusters, found average CPU utilization sitting at just 8%. That number was 10% the year before. The problem is getting worse, not better.
This post breaks down why the cost compounds, what the three structural causes are, and what a real fix looks like in practice.
Key Takeaways
- Our 2026 report found 69% of clusters over-provision CPU, up from 40% year-over-year. 79% over-provision memory.
- Average CPU utilization across production clusters sits at 8%. GPU utilization averages just 5%.
- The Cluster Autoscaler scales on requests, not real usage. Padded requests drive real node costs.
- Datadog found 83% of container costs go to idle resources.
- Only 14% of organizations run chargeback (CNCF 2024). Without accountability, waste accumulates.
- The fix follows a clear sequence: visibility first, then rightsizing, then autoscaling tuning, then continuous automation.
The Feedback Loop That Makes Kubernetes Expensive
Kubernetes cost overruns are not accidents. They are the predictable output of a feedback loop baked into how teams ship workloads. Understanding the loop is the first step to breaking it.
Here is how the cycle runs. A developer writes resource requests padded well above actual usage. The reason is rational: an OOM kill in production is embarrassing, and the cost of those padded requests is invisible at manifest-writing time. Next, the Cluster Autoscaler reads those inflated requests as genuine demand and provisions nodes to satisfy them. The cloud bill grows. However, nobody connects the growing bill back to those manifests, so the requests never get revisited. On the next deployment, the same pattern repeats.
This cycle is structural. The feedback between manifest authorship and cloud cost is broken by design in a default Kubernetes setup. Developers optimize for uptime because uptime is visible; cost is not.
The OOM Kill Myth
Many teams assume generous resource padding prevents OOM kills. Our telemetry contradicts this assumption directly. One customer cluster running with deliberately padded requests averaged 40 to 50 OOM kills per interval. After rightsizing, which involved reducing both CPU requests and memory requests to match actual consumption telemetry, OOM kills dropped to near zero.
The key driver was memory. Memory limits became realistic rather than padded to multiples of actual usage. That change removed the heap-expansion pressure pushing workloads into node memory ceilings, which was producing the exact OOM events teams thought padding would prevent.
Overprovisioning was not preventing instability. In many cases, it was contributing to it. Workloads allowed to grow their heap without pressure would expand until they hit the actual node ceiling. So the padding created a false sense of safety while also running up the bill.
Additionally, 68% of pods in our customer telemetry waste 3 to 8 times more memory than they actually consume. These are not edge cases. This is the baseline state of most production clusters.
The Three Structural Reasons Kubernetes Gets Expensive
Kubernetes becomes expensive for three structural reasons. These are not symptoms of poor cluster management. They emerge from how the platform is designed and how teams interact with it by default.
1. Developer Cost Blindness
At the moment a developer writes resources.requests, the cost of that decision is invisible. No CI gate flags wasteful requests. Helm chart defaults, typically set conservatively by upstream maintainers to avoid support tickets, ship into production and never get revisited. A chart that requests 2 vCPUs when 0.25 is sufficient will keep requesting 2 vCPUs until someone manually audits it, which rarely happens under delivery pressure.
According to CNCF 2024 data, 49% of organizations saw costs jump after adopting Kubernetes. Only 14% run any form of chargeback. Without chargeback, no developer or team owns the spend. Therefore, the spend grows because there is no forcing function to contain it.
Spectro Cloud’s 2025 survey found 42% of organizations now name cost as their number-one Kubernetes challenge. However, naming it a challenge and having the organizational structure to address it are different things. Most teams have the first without the second.
2. Autoscaling Defaults Amplify Waste
The Cluster Autoscaler scales up based on pod requests, not actual resource utilization. If pods request 4 vCPUs each and consume 0.3, the CA provisions nodes as if 4 vCPUs per pod are genuinely needed. This is the correct behavior given what the CA knows. The problem is that the requests it trusts are inflated.
Scale-down is worse. The CA defaults to a 10-minute delay before removing underutilized nodes. Most teams never tighten this delay. VPA is a separate component that must be installed; when deployed, it defaults to Off mode, which only generates recommendations without applying them. HPA, when misconfigured, creates oscillations that actively block scale-down by keeping CPU metrics near threshold. So clusters grow readily and shrink reluctantly.
The net effect: every padded request is a scale-up trigger with no corresponding scale-down correction. The autoscaler is doing exactly what it was configured to do. But the configuration is working against you.
3. No Spend Allocation Means No Accountability
Kubernetes waste is not only a technical problem. It is also an organizational one. Datadog found that 83% of container costs go to idle resources. Our 2026 report found that 69% of clusters over-provision CPU, up from 40% the prior year. The trend is worsening year over year, even as teams have access to more tooling.
The reason costs keep rising is that 86% of organizations run no chargeback. When no team owns the cloud bill for their workloads, no team has a budget-driven incentive to optimize. Infrastructure cost becomes a shared abstraction: real on the finance report, but invisible to the engineers who control it.
Consequently, the fix requires both technical intervention and organizational change. Getting real-time cost visibility per namespace, team, and workload is the entry point. A practical starting point is namespace-level labeling: enforce a team ownership label on all namespaces, then build showback dashboards by team before introducing any chargeback policy. Most organizations need a quarter of showback before teams will accept budget accountability without pushback. Chargeback enforcement comes after trust is established.
How to Fix Your Kubernetes Bill
Reducing Kubernetes costs follows a specific sequence. Skipping steps leads to optimization that decays within weeks. The sequence is: visibility first, then rightsizing, then autoscaling tuning, then continuous automation.
Step 1: Get Visibility Before You Optimize
You cannot rightsize what you cannot see. Start by establishing Kubernetes cost monitoring at the workload and namespace level. Cast AI’s monitoring dashboard provides this out of the box. Open-source options like OpenCost or Kubecost work as starting points for teams that want to build their own visibility layer first.
This gives you three things: a baseline against which to measure improvements, a map of where waste concentrates, and the data needed to assign accountability by team or service. Most teams discover that a small number of workloads drive a disproportionate share of costs. Targeting those workloads first produces the fastest returns and builds organizational credibility for the broader optimization effort.
Step 2: Rightsize Pods Continuously
Static rightsizing means setting requests once based on a snapshot of usage. That snapshot gets stale within weeks as workloads evolve, traffic patterns shift, and new versions ship with different resource profiles. Our automated workload rightsizing guide covers how continuous rightsizing works and why recommendations alone are not enough.
One important distinction: cutting requests is not the same as cutting limits. Request reduction adjusts the signals that the scheduler and autoscaler act on. Limits control burst behavior separately. Reducing requests without reviewing limits often leaves limits in place at their original padded values, which is fine for burst headroom but means VPA or manual audits should cover both fields together.
Also, consider the OOM kill data above. Rightsizing your Kubernetes pods properly, using real utilization data rather than intuition, tends to reduce OOM events rather than increase them. The instability most teams fear from cutting requests is typically not what manifests in practice.
Step 3: Tune Your Autoscaling Configuration
Autoscaling defaults are not optimized for cost. They are optimized to avoid accidental scale-down of production workloads. Tighten the CA scale-down delay below 10 minutes once you have confidence in your request accuracy. For stateless workloads, set --scale-down-unneeded-time=2m and --scale-down-delay-after-add=2m. For mixed clusters, 5 minutes is a reasonable starting point. Avoid tightening to under 2 minutes until you have validated your request accuracy across the fleet.
Review HPA thresholds to confirm they are not creating artificial stability events. For VPA, assess whether Auto mode is appropriate for your workload type, since stateful services and JVM-based applications may need additional care around restarts.
Our guide to Kubernetes autoscaling for cost optimization walks through each component, including trade-offs at scale. At 500 nodes, autoscaling misconfiguration creates compounding waste that is difficult to recover from without systematic tooling.
Step 4: Automate Continuously
One-time optimization decays. New workloads ship with default Helm values. Traffic patterns change seasonally. Teams update application code that alters resource consumption profiles. Without continuous automation, every optimization you perform manually will require re-doing within a quarter.
Rightsizing addresses the waste in what you provision. For the instance types you provision on, pairing rightsizing with spot or preemptible instances can deliver an additional 40 to 70 percent reduction on the compute layer for suitable workloads.
Cast AI’s Workload Autoscaler continuously monitors actual resource consumption and applies rightsizing without manual intervention. This closes the feedback loop described at the top of this post. As usage patterns shift, resource allocations shift with them. Teams that automate continuous rightsizing with Cast AI typically reduce their provisioned spend by 30 to 50 percent within one billing cycle. The CA then works with accurate signals instead of padded ones, and the cluster reaches a stable, efficient operating state rather than a costly default one.
Teams often ask whether Karpenter and VPA are sufficient for this. Karpenter handles node provisioning efficiently but does not rightsize pod-level resource requests. VPA in Auto mode adjusts requests but requires pod restarts, which is disruptive for stateful workloads. Cast AI’s Workload Autoscaler applies rightsizing continuously without restarts, and it operates at the workload level alongside whatever node provisioner you use.
A well-optimized Kubernetes cluster typically runs at 40 to 60 percent CPU utilization across the fleet. Getting from 8 percent to that range is the goal the four steps above are designed to achieve.
Conclusion
Kubernetes costs are high because the platform’s defaults optimize for availability, not efficiency. Developers have no cost signal at manifest-writing time. Autoscalers respond to inflated requests as if they represent real demand. Without chargeback, no team owns the waste, so the waste grows.
None of this is a Kubernetes bug. However, all of it is fixable. Start with visibility, move to rightsizing, tune autoscaling, and automate the cycle so optimization does not decay. If you want to see exactly where your cluster is wasting money, Cast AI’s cost monitoring gives you a real-time breakdown by workload and namespace. For every layer of the problem, including cluster configuration, autoscaling strategy, and FinOps process, our complete Kubernetes cost optimization guide covers the full picture.
Frequently Asked Questions
Kubernetes costs often exceed VM-based deployments because resource requests, not actual usage, drive node provisioning. Our 2026 telemetry from tens of thousands of production clusters shows average CPU utilization at just 8%. Teams set padded resource requests, the Cluster Autoscaler treats those requests as real demand, and nodes get provisioned far beyond what workloads actually consume. Traditional VM deployments tend to run closer to capacity because the cost of each VM is visible and directly attributed. In Kubernetes, that signal is broken by default.
Kubernetes overprovisioning has three root causes. First, developers set conservative resource requests at manifest-writing time because OOM kills are visible but cost is not. Second, Helm chart defaults ship conservatively and never get revisited under delivery pressure. Third, the Cluster Autoscaler scales on requests rather than measured utilization, so every padded request translates to provisioned capacity. Our 2026 report found 69% of clusters over-provision CPU (up from 40% year-over-year) and 79% over-provision memory. The problem is structural and worsens without active intervention.
The safest sequence is: start with cost visibility per workload and namespace, then rightsize resource requests using real utilization data rather than intuition, then tune autoscaling delays and thresholds, then automate the cycle so optimization does not decay. Reducing requests rarely increases OOM events when done with accurate data. One Cast AI customer averaged 40 to 50 OOM kills per interval before rightsizing and near zero afterward. The key is matching requests to actual consumption patterns continuously, not in a one-time audit.



