Skip to content

Kubernetes node sizing calculator: how many nodes your pods need

Turn a workload description into a node count per instance type, using each cloud's real allocatable-resource rules, and see which constraint binds.

Runs in your browser. Your inputs are not uploaded.Open formulaPrices updated November 2026
How to verify this

Open your browser's network tab and change an input: nothing is sent. The page computes with the formulas and the dated price table below. Some entries in that table could not be checked against an official page and are labelled. The same engine answers the API and the MCP tool, so you can reproduce any scenario from code.

Jump to results

Your inputs

Cloud
Selects the system-reservation formula and the instance catalog.
Workload
Requests drive scheduling, so size on requests, not limits.
Used only for the memory overcommit warning. Must not be below the request.
Set through a share link or the API, not this form: a base64url-encoded JSON array of {name, replicas, cpu_request_m, mem_request_mib} (the API also accepts the JSON text). When present it replaces the services, replicas, CPU and memory fields above.
DaemonSets
Logging, CNI and monitoring agents. Every node pays this.
Counts against the max pods per node.
Capacity
High-availability and burst buffer on top of the summed requests.
Bin-packing waste.
The minimum node count equals the zone count.
Node settings
Used only when the cloud is Generic Kubernetes.
Compare
Instance types to compare
Leave all unticked to use the six popular general, compute and memory types of the selected cloud. Every choice must belong to that cloud.

120 pods need 3 × c6i.4xlarge (CPU, memory and AZ-minimum bound). CPU is 36.5% idle.

  • Note:Some data is unverified: m6i.2xlarge, m6i.4xlarge, c6i.2xlarge, c6i.4xlarge, r6i.2xlarge, r6i.4xlarge: prices come from instances.vantage.sh and were not confirmed on the cloud's own price page. Treat the numbers as estimates and check them before you commit.
Pods
120
30,000 m CPU and 61,440 MiB requested
Nodes
3
c6i.4xlarge, Amazon EKS
Monthly cost
$1,489
on-demand
Binding constraint
CPU, memory and AZ-minimum
Nodes asked for: CPU 3, memory 3, pods 1, zones 3
Candidate instances, cheapest first
InstanceNodesMonthly costBinding constraintCPU idleMemory idlePods per nodeMax pods per node
c6i.4xlarge3$1,489CPU, memory and AZ-minimum36.5%30.8%40234
c6i.2xlarge6$1,489CPU and memory35.6%32.3%2058
m6i.4xlarge3$1,682CPU and AZ-minimum36.5%67.2%40234
m6i.2xlarge6$1,682CPU35.6%67.5%2058
r6i.4xlarge3$2,208CPU and AZ-minimum36.5%84%40234
r6i.2xlarge6$2,208CPU35.6%84.1%2058

Allocatable on one c6i.4xlarge node

CPU

  • System reserved: 110 m (1%)
  • DaemonSets: 150 m (1%)
  • Usable by your pods: 15,740 m (98%)

Memory

  • System reserved: 2,829 MiB (9%)
  • Eviction threshold: 100 MiB (0%)
  • DaemonSets: 256 MiB (1%)
  • Usable by your pods: 29,583 MiB (90%)

98.4% of the CPU and 90.3% of the memory on this node is usable by your pods. Max pods per node: 234.

Nodes needed by instance type as the workload grows

Calculating the range…

How it is calculated

System reservation (CPU)

EKS and GKE: R_cpu(c) = 6% of the first 1000 m + 1% of the next 1000 m + 0.5% of the next 2000 m + 0.25% above 4000 m
AKS: a documented table (60, 100, 140, 180, 260, 420, 740 m at 1, 2, 4, 8, 16, 32, 64 cores)

System reservation (memory)

EKS:  R_mem = 255 + 11 × P MiB
GKE:  R_mem = 25% of the first 4 GiB + 20% of the next 4 + 10% of the next 8 + 6% of the next 112 + 2% above 128 GiB (255 MiB under 1 GiB)
AKS:  R_mem = min(20 × P + 50 MiB, 25% of node memory)
Generic: R_mem = the percentage you supply × node memory

Allocatable and usable

A_cpu = c − R_cpu
A_mem = M − R_mem − E          (E = hard eviction threshold, 100 MiB)
U = A − D                      (D = DaemonSet request per node; U is what is left for your pods)

Requirement and node count

S = T × (1 + h) × (1 + f)
n = max( ceil(S_cpu ÷ U_cpu), ceil(S_mem ÷ U_mem), ceil(N_pods × (1 + h) ÷ (P − p_ds)), n_az )

Waste, max pods and cost

waste = 1 − T ÷ (n × U)   (reported for CPU and memory)
EKS max pods: ENIs × (IPs per ENI − 1) + 2; with prefix delegation the dataset's higher value
monthly cost = n × hourly rate for the pricing mode × 730

Assumptions

  • T is the summed pod requests, h the headroom, f the fragmentation, P the max pods per node, p_ds the DaemonSet pods per node and n_az the zone count (the minimum node count).
  • Headroom also scales the pod count in the max-pods term. Fragmentation does not.
  • All pods are packed onto identical nodes of one instance type. A node must fit the DaemonSets and the largest single pod; an instance that cannot is shown as not fitting.
  • The binding constraint is every term equal to n, so ties are all reported. Waste is measured against the requests T, before headroom and fragmentation.
  • Reservations are whole millicores and MiB. Summed memory limits are compared with the allocatable memory of all n nodes for the overcommit warning; the table form of the workloads uses each row's own limit when given.
  • GKE uses the memory tiers for node pools created on 1.36 or earlier; newer pools can reserve less. AKS uses the 1.29-and-later memory rule and a CPU table that differs from the EKS and GKE schedule.
  • Prices are list prices in USD for one region per cloud (US East N. Virginia, us-central1, East US), 730 hours a month. Cluster management fees, storage, network, licences, discounts and autoscaler behaviour are not modelled.
  • EKS prices in the dataset are from a third-party aggregator and are flagged unverified. GKE and AKS prices were read from the cloud's own price pages.

The data behind it

Node types: specifications and hourly prices (USD). * = prices not confirmed on the cloud's own price page
InstanceCloudvCPUMemory (GiB)Max podsMax pods, prefix delegationOn-demand $/h1-year $/hSpot $/hChecked
m6i.xlarge *Amazon EKS41658110$0.192$0.127$0.099Specs 2026-11-05, prices not verified
m6i.2xlarge *Amazon EKS83258110$0.384$0.254$0.17Specs 2026-11-05, prices not verified
m6i.4xlarge *Amazon EKS1664234234$0.768$0.508$0.241Specs 2026-11-05, prices not verified
c6i.xlarge *Amazon EKS4858110$0.17$0.112$0.078Specs 2026-11-05, prices not verified
c6i.2xlarge *Amazon EKS81658110$0.34$0.225$0.154Specs 2026-11-05, prices not verified
c6i.4xlarge *Amazon EKS1632234234$0.68$0.45$0.481Specs 2026-11-05, prices not verified
r6i.xlarge *Amazon EKS43258110$0.252$0.167$0.223Specs 2026-11-05, prices not verified
r6i.2xlarge *Amazon EKS86458110$0.504$0.333$0.385Specs 2026-11-05, prices not verified
r6i.4xlarge *Amazon EKS16128234234$1.008$0.667$0.38Specs 2026-11-05, prices not verified
m6g.2xlarge *Amazon EKS83258110$0.308$0.193$0.149Specs 2026-11-05, prices not verified
c6g.2xlarge *Amazon EKS81658110$0.272$0.171$0.126Specs 2026-11-05, prices not verified
r6g.2xlarge *Amazon EKS86458110$0.403$0.254$0.156Specs 2026-11-05, prices not verified
n4-standard-4Google GKE416110—$0.1814$0.11428$0.1021842026-11-05
n4-standard-8Google GKE832110—$0.3628$0.22856$0.2043682026-11-05
n4-standard-16Google GKE1664110—$0.7256$0.45712$0.4087362026-11-05
n4-standard-32Google GKE32128110—$1.4512$0.91424$0.8174722026-11-05
n4-highcpu-8Google GKE816110—$0.30616$0.19288$0.1724642026-11-05
n4-highcpu-16Google GKE1632110—$0.61232$0.38576$0.3449282026-11-05
n4-highmem-8Google GKE864110—$0.47608$0.29992$0.2681762026-11-05
n4-highmem-16Google GKE16128110—$0.95216$0.59984$0.5363522026-11-05
c4-standard-8Google GKE830110—$0.39534$0.24907$0.236632026-11-05
c4-standard-16Google GKE1660110—$0.79068$0.49814$0.473262026-11-05
Standard_D4s_v5Azure AKS416110—$0.192$0.118493$0.0405312026-11-05
Standard_D8s_v5Azure AKS832110—$0.384$0.236872$0.0810622026-11-05
Standard_D16s_v5Azure AKS1664110—$0.768$0.473858$0.1621252026-11-05
Standard_D32s_v5Azure AKS32128110—$1.536$0.947717$0.324252026-11-05
Standard_F8s_v2Azure AKS816110—$0.338$0.2285218$0.074362026-11-05
Standard_F16s_v2Azure AKS1632110—$0.677$0.4577197$0.1517162026-11-05
Standard_E8s_v5Azure AKS864110—$0.504$0.297374$0.1061422026-11-05
Standard_E16s_v5Azure AKS16128110—$1.008$0.594749$0.2122852026-11-05
generic-4c-16gGeneric Kubernetes416110—n/an/an/aIllustrative shape
generic-8c-32gGeneric Kubernetes832110—n/an/an/aIllustrative shape
generic-16c-64gGeneric Kubernetes1664110—n/an/an/aIllustrative shape
generic-32c-128gGeneric Kubernetes32128110—n/an/an/aIllustrative shape
generic-8c-16gGeneric Kubernetes816110—n/an/an/aIllustrative shape
generic-8c-64gGeneric Kubernetes864110—n/an/an/aIllustrative shape
System reservation rules (checked against each provider's documentation at every refresh)
CloudCPU reservedMemory reservedEviction (MiB)Checked
Amazon EKS (AL2023 nodeadm defaults)6% of 0-1000 m, 1% of 1000-2000 m, 0.5% of 2000-4000 m, 0.25% of above 4000 m255 MiB + 11 MiB × max pods1002026-11-05
Google GKE Standard (node pools created on 1.36 or earlier)6% of 0-1000 m, 1% of 1000-2000 m, 0.5% of 2000-4000 m, 0.25% of above 4000 m25% of 0-4 GiB, 20% of 4-8 GiB, 10% of 8-16 GiB, 6% of 16-128 GiB, 2% of above 128 GiB; 255 MiB under 1 GiB1002026-11-05
Azure AKS (1.29 and later)1 core: 60 m; 2 cores: 100 m; 4 cores: 140 m; 8 cores: 180 m; 16 cores: 260 m; 32 cores: 420 m; 64 cores: 740 mthe lesser of 50 MiB + 20 MiB × max pods and 25% of node memory1002026-11-05
Generic Kubernetes (you supply the memory percentage)6% of 0-1000 m, 1% of 1000-2000 m, 0.5% of 2000-4000 m, 0.25% of above 4000 ma percentage you supply × node memory100Modelled
Hidden gotchas
TopicWhat catches people out
Allocatable is less than capacityThe kubelet, container runtime and eviction threshold take a share first, and the gap is proportionally larger on small nodes: a 2 vCPU node loses far more than a 32 vCPU one.
DaemonSets are per nodeLogging, CNI and monitoring agents cost the same on every node, so many small nodes pay the tax many times over.
Max pods can bind before CPUSmall pods on small instances hit the pod-count limit first. On EKS the limit comes from network interfaces and IPs; prefix delegation raises it where the instance allows.
Requests vs limitsRequests drive scheduling and therefore node count. Limits drive CPU throttling and out-of-memory kills. Sizing on requests while limits run far higher risks killed pods.
Managed node group capEKS managed node groups without a custom AMI cap max pods at 110 below 30 vCPUs and 250 above, even where the ENI formula allows more (for example 234 on a 16 vCPU instance).
Clouds reserve differentlyAKS reserves more CPU than EKS and GKE on the same core count, and its memory reservation depends on max pods per node. GKE pools created on 1.37 or later reserve less memory than older ones.
Autoscalers change packingCluster autoscalers and node provisioners choose instance mixes and consolidate nodes, so real packing differs from one fixed instance type.

Three ways to reduce this number

  1. Match the family to the binding constraint: compute-optimized instances when CPU binds, memory-optimized when memory binds.
  2. Right-size requests from observed usage. Requests set from guesses are the usual source of idle CPU and memory.
  3. Use spot capacity for stateless workloads, and reserve the steady base.

Use it from code

The same engine is available as a REST endpoint and as an MCP tool named calc_kubernetes_node_pod_sizing_calculator. Your scenario as an API call:

curl -X POST 'https://api.x12i.com/v1/calc/kubernetes-node-pod-sizing-calculator' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "input": {
    "cloud_target": "eks",
    "service_count": 40,
    "avg_replicas": 3,
    "avg_pod_cpu_request_m": 250,
    "avg_pod_mem_request_mib": 512,
    "daemonset_cpu_m_per_node": 150,
    "daemonset_mem_mib_per_node": 256,
    "daemonset_pod_count": 4,
    "headroom_pct": 25,
    "fragmentation_pct": 5,
    "az_count": 3,
    "eks_prefix_delegation": false,
    "generic_reserved_mem_pct": 10,
    "pricing_mode": "on_demand",
    "platform_team": false
  },
  "options": {
    "explain": false
  }
}'

Schema: GET /v1/calc/kubernetes-node-pod-sizing-calculator/schema

Frequently asked questions

How many nodes do I need for N pods?

Add up the CPU and memory requests of all pods, add headroom and a bin-packing allowance, and divide by what is usable on one node (allocatable minus DaemonSets). Do the same for the pod count against the node's max pods. Round each up, take the largest, and never go below your availability-zone count. The binding constraint is the one that sets the number.

How much CPU and memory is allocatable on EKS?

An 8 vCPU, 32 GiB instance with 58 max pods reserves 90 m of CPU and 255 + 11 × 58 = 893 MiB of memory, and the kubelet evicts at 100 MiB free. That leaves 7,910 m and 31,775 MiB allocatable, before DaemonSets.

What is the difference between requests and limits?

A request is what the scheduler reserves for a pod, so requests decide how many pods fit on a node. A limit is the ceiling the pod can use: CPU above its limit is throttled, and memory above its limit gets the pod killed. Limits that add up to more than the node's memory are overcommitted.