CostMonStart free

Calculator

Who is actually paying for your idle cluster?

Your cloud bill says $48,000 of EC2. Your cluster can't tell you who spent it. Drag in your real numbers to split that bill into used, workload idle, cluster idle, and system-reserved. Then see who should pay for the idle.

Capacity, allocatable, requested, and used

Why the cloud bill can't tell you who spent it

An AWS, GCP, or Azure invoice bills by node: the instance type, the hours it ran, and the region. Kubernetes bills nothing. It schedules pods onto available node capacity and lets you set requests and limits per container. These are two different accounting systems, and nothing reconciles them automatically. The provider bill tells you what the nodes cost. It does not tell you what a given team, namespace, or workload spent. On a shared cluster, people want that second answer.

This is why Kubernetes cost allocation is harder than ordinary cloud cost monitoring. You are billed for a node, by the hour. You care about a workload's fair share of that node. These are not the same unit. Idle capacity hides in the gap between them.

Capacity ≠ allocatable ≠ requested ≠ used: the four numbers, and which one you pay for

A node's advertised capacity (say, 8 vCPUs) is never what's schedulable. The kubelet, the container runtime, the OS, and any DaemonSets on every node each reserve a slice. This happens before the scheduler places a single application pod. What is left after that reservation is allocatable, and it is smaller than capacity. Requested is the sum of the CPU and memory requests of every scheduled pod. It is the amount the scheduler has promised, whether or not a pod touches it. Used is what those pods consume, measured continuously. It is often a fraction of what pods requested.

The bill is paid on capacity: every node, every hour, whether its allocatable slice is fully requested or empty. This is why the calculator exists. Capacity is a fixed cost, whatever the other three numbers are. The gaps between capacity, requested, and used are the buckets the calculator splits out below.

Requests vs. limits: the one is a bill, the other is a ceiling

A request is what the scheduler reserves on a pod's behalf. It's the number that determines whether a pod fits on a node at all, and it's the number this calculator's "requested" bucket is built from. A limit is a ceiling. At that point the kubelet throttles CPU or OOM-kills the container. A limit plays no part in scheduling and reserves nothing. Two pods can have identical limits and very different requests. The scheduler places them differently, and only the request changes what a node can still fit.

That distinction matters for this page specifically because it's easy to assume a generous limit is "safe" and stop there. But a high limit with no matching request makes a node look fuller than it is to a person reading the manifest. The scheduler sees only the request. Right-sizing that changes what a node can fit means changing requests, not limits.

Split the bill

See exactly where every dollar of the cluster goes

Enter the numbers you already have. Everything below computes in your browser. Nothing you type here is sent anywhere.

Your bill
$24,000

The number already on your bill: the node group or compute spend for this cluster, before any right-sizing

40

How many nodes make up that bill

Node overhead
12%

kube-reserved + system-reserved + eviction threshold + DaemonSets: capacity every node loses before a single pod can schedule on it

CPU
65%

What your pods ask the scheduler to set aside for CPU

18%

What your pods actually use, on average (clamped to never exceed CPU requests)

Memory
55%

What your pods ask the scheduler to set aside for memory

30%

What your pods actually use, on average (clamped to never exceed memory requests)

Right-sizing scenario
25%

How much margin above actual usage the right-sized requests keep, so it protects against normal variance rather than sizing to a single average

80%

How tightly the scheduler bin-packs the new, smaller requests onto nodes

Idle-cost policy

How the idle pool (cluster idle + system-reserved) gets billed back to teams

Team request shares

Each team's share of total requests, normalized to 100% whatever these add up to.

40%
25%
20%
15%
Where the bill actually goesUpdates live
Live
At these numbersYou pay $24,000/mo. 15.8% of it does work.Every $1 of real compute costs you $6.31.

This cluster is CPU-bound. $2,112/mo of memory capacity is stranded behind the CPU request.

Used
$3,802 (15.8%)
Workload idle
$9,926 (41.4%)
Cluster idle
$7,392 (30.8%)
System-reserved
$2,880 (12%)

Right-size scenario

Today40 nodes$24,000/mo
Right-sized19 nodes$11,400/mo

Saves $12,600/mo, or $151,200/yr

Who pays for the idle?

TeamDirect costIdle shareChargebackIdle tax
Platform teamplatform————
Product team A————
Product team B————
Product team C————
Workload idle dominant

Your pods are asking for far more than they use.

Workload idle is the biggest bucket: capacity requested but never used. That is a request-sizing problem. Pull P95 usage for each workload and right-size requests down to it. A Vertical Pod Autoscaler can automate the recommendation. Then re-run the scenario above with a headroom margin you accept.

See the right-sizing scenario above →
Start free

No vendor price table drives this. Every dollar figure comes from your own inputs. Computes entirely in your browser; nothing typed here is sent anywhere.

Showback, tagging, the levers, and what CostMon does here

Who pays for the idle? Showback vs. chargeback, and the trade-off of each

Direct cost is a team's share of what it requested. It is rarely the argument. The argument is the idle pool: cluster idle plus system-reserved capacity. This shared cost has no single owner. Showback reports the number without billing it. Chargeback bills it. Both need a policy to split the pool, and every policy this page models has a downside. No option is neutral.

Proportional splits the idle pool by each team's share of requests. It is the default because it scales with size. It hits the biggest team hardest in dollars, even when the idle is not mostly theirs. Even split divides the idle pool equally, whatever the team size. It is fairer to the biggest team. It can be a rounding error for a large team and a painful line item for the smallest. Platform-absorbs puts the whole idle pool on the platform team's line. Product-team numbers stay clean. But the idle sits in a cost center with no control over product-team request sizes. This hides the incentive to right-size instead of creating one.

None of the three is "correct." The right pick depends on your goal. To change behavior, choose proportional or even split, aimed at the teams that can act on the idle. For a clean chargeback number on product P&Ls, choose platform-absorbs. The cost is that the underlying idle may never get fixed.

Namespaces & labels: the tagging story for containers

Provider cost-allocation tags (an AWS cost allocation tag, a GCP label) live on the node or the resource. They don't know which pod, namespace, or team is running on that node at any given moment, especially once multiple workloads share it. Kubernetes has its own tagging layer: namespace, plus a `team`/`app`/`cost-center` label convention on pods. That layer maps spend to an owner inside the cluster. A provider's billing export cannot see it.

This is why a provider bill and an in-cluster allocation view are two systems that do not merge automatically. The provider knows the node's cost. Only a tool inside the cluster knows which workload owns that cost. It reads kubelet and cAdvisor metrics and namespace and label metadata. A consistent labeling convention makes any allocation model point to a real owner instead of a guess. Enforce it at manifest review, not after the fact. That includes the showback table above.

The levers, in the order that pays

Right-size requests first. It is the only lever with no infrastructure risk. On most clusters it is also the biggest bucket. On a cluster that has not been right-sized in a while, workload idle often outweighs cluster idle. To measure that bucket, use the Kubernetes Waste Analyzer instead of the sliders above. It reads your pod manifests and kubectl top output and names the workloads to right-size first. Bin-pack and fix node shape second. Once requests match real usage, a scheduler may still spread pods across too many nodes. Nodes may also have the wrong resource ratio. Both leave cluster idle that right-sizing does not touch.

Autoscaling third. A scale-down delay in the cluster autoscaler or Karpenter can be too long. Nodes then stay up long after load drops. This shows as cluster idle that looks structural but is a slow setting. Spot for the right workloads fourth. Stateless pods that tolerate interruption fit Spot best. Examples are batch jobs, CI runners, and fault-tolerant workers. Moving them off on-demand nodes lets you size the remaining on-demand footprint tighter.

Commitments on the stable floor fifth. Tune requests, packing, and autoscaling first. Then size a Savings Plan or Reserved Instance against the steady-state floor that remains. Do not stop at compute. Storage and egress line items run through the same cluster. They are real costs inside "the cluster", and none of the levers above touch them. Think persistent volume claims, load balancer data processing, and cross-AZ pod-to-pod traffic.

What CostMon does (and doesn't do) here

CostMon reads the provider bill. Your EKS, GKE, or AKS control-plane fee and node-group spend appear in the same normalized daily view as every other provider you connect. Anomaly alerts watch cluster cost drift like any other service. This covers the node-level, cross-provider half of the Kubernetes cost problem.

CostMon does not run in-cluster, and it does not do pod- or namespace-level cost allocation. It can't see the requested-vs-used split this calculator models, because that data only exists inside the cluster's own metrics, not on a provider's billing export. That half of the problem needs showback and chargeback numbers per namespace, computed continuously from live cluster data. For that, use an in-cluster tool such as OpenCost or Kubecost.

Sources

Where the utilization stats on this page come from

Every figure above is attributed to a named primary source, re-verified live as of 2026-08-01. Vendor telemetry is labeled as vendor telemetry. This page does not present it as an industry-wide fact.

  • Datadog — State of Cloud Costs

    83% of container cost is associated with idle resources: 54 points cluster idle, 29 points workload idle; and organizations use about 35% of EC2 compute spend running containers, up from 30% a year prior. This taxonomy is the calculator's model.

  • Datadog — State of Containers and Serverless

    Most workloads use less than half of their requested memory, and most consume less than 25% of their requested CPU.

  • CAST AI — 2026 State of Kubernetes Optimization Report

    Vendor telemetry from clusters that opted into an optimization product, collected before any automation ran: average CPU utilization ~8% (down from 10%), memory ~20% (down from 23%). Cited as vendor telemetry, not asserted as an industry-wide baseline, since the sample skews toward organizations already suspecting they're unoptimized.

  • AWS — Amazon EKS Pricing

    $0.10 per cluster per hour for standard Kubernetes version support. The control plane is nearly always the cheap part of an EKS bill next to the node group behind it.

FAQ

Common questions about Kubernetes cost allocation

Does this calculator need my actual Kubernetes metrics to work?

No. Every input is a percentage or a dollar figure you already roughly know. These are your bill, your node count, and approximate request and usage percentages from `kubectl top` or your metrics stack. It is a modeling tool, not a live integration, so an estimate works.

What's the difference between workload idle and cluster idle?

Workload idle is capacity your pods requested but don't use: a request-sizing problem, fixed by right-sizing requests down to observed usage. Cluster idle is capacity that's schedulable but was never even requested by any pod: a packing/autoscaling problem, fixed by bin-packing, autoscaler tuning, and node shape. The waste costs the same per dollar, but the fixes differ.

Why does the binding resource matter?

Kubernetes schedules against whichever resource (CPU or memory) a pod's request pressures harder, node by node. The resource with the higher request percentage sets how many nodes you need. The other resource's slack is stranded behind it. You already pay for that capacity on every node. Shrinking the binding resource's requests alone cannot reclaim it, because the binding resource sets node count.

Why does the idle-tax multiplier sometimes show a dash instead of a number?

The idle-tax multiplier is monthlyBill ÷ usedCost. It is undefined, not infinite, when usedCost is zero (0% usage). The calculator shows a dash for that one edge case instead of `Infinity` or a divide-by-zero artifact. Every other input combination shows a finite multiplier.

Which idle-cost policy should we use?

There's no policy without a trade-off. Proportional scales idle cost with team size but hits the biggest team hardest in absolute dollars. Even split is fairer to a large team but can hit a small team hard and arbitrarily. Platform-absorbs keeps product-team numbers clean but removes their incentive to fix the request sizing that drives idle. Pick based on whether the goal is to change behavior or to produce a clean chargeback number.

Is the right-sizing scenario a guarantee of what we will save?

No, it's a scenario, built from the usage percentages you enter plus a headroom margin and a target packing density, both of which you control. Real savings depend on two things. The new, smaller requests must re-pack as the packing-density input assumes. The autoscaler must scale down to the new node count. Treat it as a sizing target to test, not a committed number.

Does CostMon replace Kubecost or OpenCost?

No. CostMon reads the provider bill: your EKS/GKE/AKS control-plane fee and node-group spend, normalized alongside every other provider you connect, with drift alerts on top. It does not run in-cluster and does not compute pod- or namespace-level allocation, which is what Kubecost and OpenCost are built for. The two tools answer different halves of the same question, and the page above links a full side-by-side comparison.

Where do the utilization statistics on this page come from?

Datadog's State of Cloud Costs report is independent, published research. It found that 83% of container cost is idle: 54% cluster idle and 29% workload idle. About 35% of EC2 compute spend now runs containers. Datadog's State of Containers and Serverless report found that most workloads use under half of requested memory and under 25% of requested CPU. CAST AI's 2026 State of Kubernetes Optimization Report is vendor telemetry from clusters that opted into an optimization product. It reports average CPU utilization of ~8% and memory of ~20%. That sample skews toward unoptimized baselines. This page cites it as vendor telemetry, not as an industry-wide fact.

The meter you don't watch still grows.

Waste rarely hides in the service you check every week. CostMon watches every meter on your stack, including the ones you forgot were running.

Esc