Kubernetes Resource Budget Calculator

Compares your workload's CPU and memory requests against node size to show how many nodes you need, which resource is the bottleneck, and the projected monthly cost. Every calculation runs in your browser.

Last updated:

Workload (Pod Requests)
1 core = 1000m. E.g. 250m = a quarter core.
1 GiB = 1024 Mi.
Node
Capacity reserved for kube-reserved, system-reserved and the eviction threshold. Typically 10-15%.
Currency-agnostic; leave blank to hide cost.

Results

1 Nodes needed
Bottleneck resource
CPU
CPU utilization
41.7%
Memory utilization
20.8%
Pods per node (average)
6.0

Assumes a maximum of 110 pods per node (kubelet default). DaemonSets, pod affinity and topology spread are not accounted for — this is a first-order estimate.

When this calculation actually earns its keep

Choosing an instance type

Node families differ far more in CPU-to-memory ratio than in price per core. Picking one before you know which resource your workload is bound by is how teams end up renting memory they never touch.

After an autoscaler surprise

A cluster autoscaler that keeps adding nodes is usually reporting a packing problem, not a load problem. Working out the binding resource by hand takes a minute and tells you whether to change the request or the node type. On my own cluster below the split is stark: CPU idles between 4% and 10% while memory sits at 38-49%, and a single GitLab pod holds 3.8 GiB against 61m of CPU.

Before a migration

Moving from one provider to another changes allocatable capacity even when the advertised specs match, because reserved amounts differ. Re-running the numbers against the target node shape avoids a nasty first invoice.

Worked example: paying for RAM you never use

A bursty public API: 60 replicas, 500m CPU and 384 Mi of memory requested per pod. Nodes are 8 vCPU and 32 GiB with 10% reserved for the system. Three separate limits get computed; the largest one wins.

  1. Allocatable per node: 7200m CPU and 29491 Mi of memory.
  2. CPU: 60 × 500m = 30000m. 30000 ÷ 7200 = 4.17 → 5 nodes.
  3. Memory: 60 × 384 Mi = 23040 Mi. 23040 ÷ 29491 = 0.78 → 1 node.
  4. Pod count: 60 pods against the 110-per-node ceiling. Not binding.
  5. Answer: 5 nodes, bound by CPU. That leaves memory sitting at roughly 16% used.

Five nodes are rented and five-sixths of the memory is dead weight. No amount of trimming memory requests helps here, which is exactly the opposite of the usual advice. The fix is the node shape: a compute-optimised family with half the RAM per core serves the same 60 replicas at a visibly lower monthly figure. Knowing which resource binds is what tells you which lever to pull.

Four mistakes worth avoiding

Treating limits as requests

The scheduler places pods on requests alone. Leaving the limit at 2 cores while the request sits at 100m means Kubernetes packs that pod as if it needed 100m. Nothing shows up on the invoice; latency shows up instead.

Confusing capacity with allocatable

A 16 GiB node will not take a 16 GiB pod. After kube-reserved, system-reserved and the eviction threshold, roughly 85-90% survives. That gap is what the overhead field above represents.

Forgetting the DaemonSets

Log shippers, metrics agents, CNI and CSI pods run one copy on every node, so their cost grows with the node count rather than the replica count. This calculator only covers your own workload; leave headroom on top.

Ignoring the 110-pod ceiling

Run enough small replicas and pod count becomes the binding limit while CPU and memory sit half empty. Buying bigger nodes does not help in that case; the kubelet max-pods setting is the thing to look at.

Tools commonly used alongside this one

  • CIDR / Subnet Calculator Compute the network address, broadcast, subnet mask, usable host range and address type from CIDR notation.
  • Cron Expression Parser Parse a cron expression field by field and see the next run times. For Kubernetes CronJobs and scheduled tasks.
  • UUID Generator Generate cryptographically secure UUID v4 and time-ordered v7. Bulk generation and format options.
  • Base64 Encoder-Decoder Encode text to Base64 or decode it back. Standard and URL-safe (base64url) variants; UTF-8 aware, in the browser.

Frequently Asked Questions

How many nodes does my Kubernetes workload need?

Node count is the largest of three limits: nodes required by CPU, by memory, and by pod count. The calculator works out each one and reports the largest as "nodes needed" — that limit is your bottleneck resource.

Why is a node's allocatable capacity lower than its total capacity?

Part of every node's capacity is reserved for the kubelet, container runtime and OS via kube-reserved and system-reserved, plus an eviction threshold. Pods are only scheduled onto the remaining "allocatable" capacity, which is why you enter an overhead percentage.

What is the default maximum pods per node?

The kubelet default is 110 pods per node. If you run many small replicas, this limit can become the bottleneck even when CPU and memory are plentiful.

Should I plan with requests or limits?

The Kubernetes scheduler makes placement decisions based on requests, not limits. This calculator uses request values for capacity planning. Limits affect throttling and OOM behaviour when a node is under pressure.

How accurate is this estimate?

It is a first-order capacity estimate. It does not account for DaemonSets, pod anti-affinity rules, topology spread constraints, vertical autoscaling or regional distribution. Use it as a baseline for production clusters, not a final figure.

Built from running real clusters

This calculator isn't theoretical: I use the same node-sizing math on the small production k3s cluster I run behind this site. Here is a current snapshot of it:

$ kubectl get nodes
NAME           STATUS   ROLES                  AGE    VERSION
bilal-server   Ready    <none>                 194d   v1.33.5+k3s1
k8s-master     Ready    control-plane,master   194d   v1.33.5+k3s1

$ kubectl top nodes
NAME           CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
bilal-server   333m         4%     7828Mi          49%
k8s-master     784m         10%    12097Mi         38%

$ kubectl top pods -n default
NAME                                 CPU    MEMORY
bilal-baget-6d568d945f-4hljh         5m     142Mi
bilal-filebrowser-76c987d67b-mgwwt   1m     10Mi
bilal-gitlab-57db68cdf-4thml         61m    3843Mi
bilal-mssql-59467b7576-wrl24         34m    1450Mi
bilal-registry-5c86777897-tffxm      2m     381Mi
bilal-website-c46c6fb8f-ctnck        26m    219Mi
maya-website-58877c476c-hvj9q        74m    263Mi

k3s v1.33.5 · 2 nodes · 194 days uptime · 4-10% CPU and 38-49% memory usage in steady state.