kubernetesfinopscost-optimizationrightsizing

Kubernetes resource requests and cost: the number that sets your bill

Resource requests, not actual usage, decide how many nodes Kubernetes buys, so they are the single biggest lever on cluster cost. Set them too high and you pay for idle capacity; too low and you risk instability. Here is how to get them right.

The C3X Team··5 min read

Quick answer

In Kubernetes, the scheduler places pods and sizes the cluster based on resource requests, not actual usage, so requests are the number that sets your bill. If pods request more than they use, the scheduler reserves that capacity and provisions extra nodes to fit it, and you pay for capacity that sits idle. If pods request too little, they risk being packed too tightly and hitting instability under load. Right-sizing requests to match real usage (with sensible headroom) is the single highest-leverage cost lever in a cluster.

Of everything you can tune in a Kubernetes cluster, resource requests have the most direct effect on cost, because they are what the scheduler uses to decide how much capacity to buy. Actual CPU and memory usage matters for performance, but it is the requests that drive node count and therefore the bill. Get requests right and the cluster runs lean; get them wrong and you either overpay or destabilize.

Why requests drive cost, not usage

ConceptRole
RequestCapacity reserved; drives scheduling and node count
UsageWhat the pod actually consumes at runtime
LimitCeiling the pod cannot exceed
Node countSet by total requests, not total usage

The scheduler reserves each pod's requested CPU and memory on a node, whether or not the pod uses it, and adds nodes when requests no longer fit. So the sum of requests, not the sum of usage, determines how many nodes you pay for. This is the mechanism behind both cost per pod and idle cost: over-requesting inflates both at once.

The cost of over-requesting

When pods request more than they need, the reserved-but-unused capacity cannot be used by other pods, so the cluster needs more nodes than actual load requires. A fleet requesting double its usage buys roughly double the nodes. This is the most common cause of a bloated cluster bill, and it is invisible if you only look at usage graphs, which show low utilization while the bill reflects high reservations. The fix is to bring requests down toward observed usage.

The risk of under-requesting

Under-requesting is not free savings, though. If requests are set below real needs, the scheduler packs pods too tightly, and when several spike at once the node runs out of capacity, causing throttling, evictions, or crashes. So requests should reflect real usage plus a sensible margin for spikes, not the theoretical minimum. The goal is the smallest request that keeps the workload stable, which balances cost against reliability rather than chasing either extreme.

Right-sizing in practice

Observe actual CPU and memory usage over a representative period (including peaks), set requests to cover the typical load with headroom for spikes, and revisit as workloads change. Tools like the vertical pod autoscaler can recommend requests from observed usage. Match your pods' CPU-to-memory request ratio to the node's ratio so neither resource strands the other. Because requests drive node count, disciplined requests are what make better autoscaling (see Karpenter versus Cluster Autoscaler) actually pay off, and they are the first thing to fix in any cluster cost review, high on any list of FinOps KPIs.

FAQ

Why do resource requests drive Kubernetes cost?

Because the scheduler places pods and sizes the cluster based on requests, not actual usage. Each pod's requested CPU and memory is reserved on a node whether or not it is used, and the cluster adds nodes when requests no longer fit. So the sum of requests, not the sum of usage, determines how many nodes you pay for, making requests the single biggest lever on cluster cost.

What happens if I set resource requests too high?

You overpay. Reserved-but-unused capacity cannot be used by other pods, so the cluster provisions more nodes than actual load requires, and you pay for idle capacity. A fleet requesting double its usage buys roughly double the nodes. This is invisible if you only watch usage graphs, which show low utilization while the bill reflects high reservations, so it often goes unnoticed.

What happens if I set resource requests too low?

You risk instability. The scheduler packs pods too tightly, and when several spike at once the node runs out of capacity, causing throttling, evictions, or crashes. Under-requesting is not free savings; it trades cost for reliability risk. Requests should reflect real usage plus a sensible margin for spikes, not the theoretical minimum, so the workload stays stable.

How do I right-size Kubernetes resource requests?

Observe actual CPU and memory usage over a representative period including peaks, set requests to cover typical load with headroom for spikes, and revisit as workloads change. The vertical pod autoscaler can recommend requests from observed usage. Match the pod's CPU-to-memory request ratio to the node's ratio so neither resource strands the other, keeping nodes well packed.

What is the difference between requests and limits for cost?

Requests are the reserved capacity the scheduler uses to place pods and size the cluster, so requests drive cost. Limits are the ceiling a pod cannot exceed at runtime, protecting nodes from a runaway pod but not affecting how many nodes are provisioned. For cost purposes requests are the number that matters; limits are about safety and isolation rather than capacity planning.

Does C3X account for resource requests in cost?

C3X prices the node and instance infrastructure behind your cluster from Terraform against a live catalog before deploy, so the cost of the capacity you provision is visible in the pull request. Requests are a runtime scheduling input you tune against observed usage, while C3X makes the underlying node cost that those requests ultimately drive clear at design time.

What to do next

Price the cluster capacity your requests will demand, before you deploy. C3X reads your Terraform and prices your resources against a live catalog. Start with the quickstart.

Try C3X on your own Terraform

Free and open source. No API key required. One command to install, one command to estimate.