Duvaxa

Free tool

Kubernetes waste calculator

See what your cluster spends each month on CPU and memory that's requested but never used, overall or workload by workload.

Mode
Example value. Use your own node price.
Example value.
Example value.

Runs in your browser. Nothing is uploaded, including anything you paste.

Why clusters overspend

Kubernetes schedules pods by their resource requests, and you pay for the nodes those requests fill. A pod that requests 2 CPU cores and uses 0.3 still reserves 2 cores, and nothing else can be placed in that space. Across a cluster, requests are commonly two to five times real usage, because teams copy values from templates, set them once during a load test, or add a margin "just in case" and never revisit it.

What this calculator does

In simple mode, enter the total CPU and memory your workloads request, what they actually use on average, and what a vCPU-hour and a GB-hour cost you. The difference, priced over an average month of 730 hours, is the waste. In paste mode, it reads the output of two kubectl commands in your browser, matches each running pod to its requests and its live usage, and groups pods into workloads (a Deployment's pods are grouped under the Deployment's name).

  • kubectl top pods -A gives live CPU and memory per pod (it needs metrics-server in the cluster).
  • kubectl get pods -A -o json gives each pod's requests and its owner.

Prices are yours to enter. The values shown are examples, not any provider's price list. A simple way to get yours: divide a node's hourly price between its vCPUs and memory in the proportion your provider uses, or use your committed-use or Savings Plan rate.

Requests, limits and safe right-sizing

CPU is compressible: a pod that wants more CPU than its limit is slowed (throttled), not killed. Memory isn't: a pod that goes over its memory limit is OOMKilled. So right-size the two differently.

  • CPU requests: set close to typical (for example p90) usage. Be careful with CPU limits on latency-sensitive services; throttling shows up as slow responses.
  • Memory requests: set at or above peak usage plus headroom, and set the memory limit equal to the request so the scheduler's view matches reality.
  • Use at least a week, ideally two, of usage history, including your busiest days. A single kubectl top is a snapshot.

From numbers to savings

Lower requests only save money when nodes are removed. After right-sizing, the cluster autoscaler (or Karpenter) can pack pods onto fewer nodes; without an autoscaler, reduce node counts yourself. Start with the workloads at the top of the table: a few large ones usually account for most of the waste.

FAQ

Questions

Is the data I paste sent anywhere?

No. Both outputs are parsed in your browser. Pod names and namespaces never leave your device.

Why is the waste so high?

Requests are often set once and never revisited. Templates, load-test values and safety margins add up, and you pay for requests, not usage.

Can I just set requests to current usage?

Not for memory. Use peak usage plus headroom; a pod that exceeds its memory limit is killed. For CPU, typical usage is a reasonable starting point.

Does kubectl top show averages?

No. It shows current usage from metrics-server. For sizing, use a week or more of history from Prometheus or your monitoring tool; PodRight does this for you.

Which prices should I use?

Your own: the hourly price of your nodes split into CPU and memory, or your discounted rate. The example values are only placeholders.

Does this work for EKS, GKE and AKS?

Yes. The kubectl output is the same on every Kubernetes distribution.