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.
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.
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.
| Instance | Nodes | Monthly cost | Binding constraint | CPU idle | Memory idle | Pods per node | Max pods per node |
|---|---|---|---|---|---|---|---|
| c6i.4xlarge | 3 | $1,489 | CPU, memory and AZ-minimum | 36.5% | 30.8% | 40 | 234 |
| c6i.2xlarge | 6 | $1,489 | CPU and memory | 35.6% | 32.3% | 20 | 58 |
| m6i.4xlarge | 3 | $1,682 | CPU and AZ-minimum | 36.5% | 67.2% | 40 | 234 |
| m6i.2xlarge | 6 | $1,682 | CPU | 35.6% | 67.5% | 20 | 58 |
| r6i.4xlarge | 3 | $2,208 | CPU and AZ-minimum | 36.5% | 84% | 40 | 234 |
| r6i.2xlarge | 6 | $2,208 | CPU | 35.6% | 84.1% | 20 | 58 |
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
| Instance | Cloud | vCPU | Memory (GiB) | Max pods | Max pods, prefix delegation | On-demand $/h | 1-year $/h | Spot $/h | Checked |
|---|---|---|---|---|---|---|---|---|---|
| m6i.xlarge * | Amazon EKS | 4 | 16 | 58 | 110 | $0.192 | $0.127 | $0.099 | Specs 2026-11-05, prices not verified |
| m6i.2xlarge * | Amazon EKS | 8 | 32 | 58 | 110 | $0.384 | $0.254 | $0.17 | Specs 2026-11-05, prices not verified |
| m6i.4xlarge * | Amazon EKS | 16 | 64 | 234 | 234 | $0.768 | $0.508 | $0.241 | Specs 2026-11-05, prices not verified |
| c6i.xlarge * | Amazon EKS | 4 | 8 | 58 | 110 | $0.17 | $0.112 | $0.078 | Specs 2026-11-05, prices not verified |
| c6i.2xlarge * | Amazon EKS | 8 | 16 | 58 | 110 | $0.34 | $0.225 | $0.154 | Specs 2026-11-05, prices not verified |
| c6i.4xlarge * | Amazon EKS | 16 | 32 | 234 | 234 | $0.68 | $0.45 | $0.481 | Specs 2026-11-05, prices not verified |
| r6i.xlarge * | Amazon EKS | 4 | 32 | 58 | 110 | $0.252 | $0.167 | $0.223 | Specs 2026-11-05, prices not verified |
| r6i.2xlarge * | Amazon EKS | 8 | 64 | 58 | 110 | $0.504 | $0.333 | $0.385 | Specs 2026-11-05, prices not verified |
| r6i.4xlarge * | Amazon EKS | 16 | 128 | 234 | 234 | $1.008 | $0.667 | $0.38 | Specs 2026-11-05, prices not verified |
| m6g.2xlarge * | Amazon EKS | 8 | 32 | 58 | 110 | $0.308 | $0.193 | $0.149 | Specs 2026-11-05, prices not verified |
| c6g.2xlarge * | Amazon EKS | 8 | 16 | 58 | 110 | $0.272 | $0.171 | $0.126 | Specs 2026-11-05, prices not verified |
| r6g.2xlarge * | Amazon EKS | 8 | 64 | 58 | 110 | $0.403 | $0.254 | $0.156 | Specs 2026-11-05, prices not verified |
| n4-standard-4 | Google GKE | 4 | 16 | 110 | — | $0.1814 | $0.11428 | $0.102184 | 2026-11-05 |
| n4-standard-8 | Google GKE | 8 | 32 | 110 | — | $0.3628 | $0.22856 | $0.204368 | 2026-11-05 |
| n4-standard-16 | Google GKE | 16 | 64 | 110 | — | $0.7256 | $0.45712 | $0.408736 | 2026-11-05 |
| n4-standard-32 | Google GKE | 32 | 128 | 110 | — | $1.4512 | $0.91424 | $0.817472 | 2026-11-05 |
| n4-highcpu-8 | Google GKE | 8 | 16 | 110 | — | $0.30616 | $0.19288 | $0.172464 | 2026-11-05 |
| n4-highcpu-16 | Google GKE | 16 | 32 | 110 | — | $0.61232 | $0.38576 | $0.344928 | 2026-11-05 |
| n4-highmem-8 | Google GKE | 8 | 64 | 110 | — | $0.47608 | $0.29992 | $0.268176 | 2026-11-05 |
| n4-highmem-16 | Google GKE | 16 | 128 | 110 | — | $0.95216 | $0.59984 | $0.536352 | 2026-11-05 |
| c4-standard-8 | Google GKE | 8 | 30 | 110 | — | $0.39534 | $0.24907 | $0.23663 | 2026-11-05 |
| c4-standard-16 | Google GKE | 16 | 60 | 110 | — | $0.79068 | $0.49814 | $0.47326 | 2026-11-05 |
| Standard_D4s_v5 | Azure AKS | 4 | 16 | 110 | — | $0.192 | $0.118493 | $0.040531 | 2026-11-05 |
| Standard_D8s_v5 | Azure AKS | 8 | 32 | 110 | — | $0.384 | $0.236872 | $0.081062 | 2026-11-05 |
| Standard_D16s_v5 | Azure AKS | 16 | 64 | 110 | — | $0.768 | $0.473858 | $0.162125 | 2026-11-05 |
| Standard_D32s_v5 | Azure AKS | 32 | 128 | 110 | — | $1.536 | $0.947717 | $0.32425 | 2026-11-05 |
| Standard_F8s_v2 | Azure AKS | 8 | 16 | 110 | — | $0.338 | $0.2285218 | $0.07436 | 2026-11-05 |
| Standard_F16s_v2 | Azure AKS | 16 | 32 | 110 | — | $0.677 | $0.4577197 | $0.151716 | 2026-11-05 |
| Standard_E8s_v5 | Azure AKS | 8 | 64 | 110 | — | $0.504 | $0.297374 | $0.106142 | 2026-11-05 |
| Standard_E16s_v5 | Azure AKS | 16 | 128 | 110 | — | $1.008 | $0.594749 | $0.212285 | 2026-11-05 |
| generic-4c-16g | Generic Kubernetes | 4 | 16 | 110 | — | n/a | n/a | n/a | Illustrative shape |
| generic-8c-32g | Generic Kubernetes | 8 | 32 | 110 | — | n/a | n/a | n/a | Illustrative shape |
| generic-16c-64g | Generic Kubernetes | 16 | 64 | 110 | — | n/a | n/a | n/a | Illustrative shape |
| generic-32c-128g | Generic Kubernetes | 32 | 128 | 110 | — | n/a | n/a | n/a | Illustrative shape |
| generic-8c-16g | Generic Kubernetes | 8 | 16 | 110 | — | n/a | n/a | n/a | Illustrative shape |
| generic-8c-64g | Generic Kubernetes | 8 | 64 | 110 | — | n/a | n/a | n/a | Illustrative shape |
| Cloud | CPU reserved | Memory reserved | Eviction (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 m | 255 MiB + 11 MiB × max pods | 100 | 2026-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 m | 25% 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 GiB | 100 | 2026-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 m | the lesser of 50 MiB + 20 MiB × max pods and 25% of node memory | 100 | 2026-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 m | a percentage you supply × node memory | 100 | Modelled |
| Topic | What catches people out |
|---|---|
| Allocatable is less than capacity | The 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 node | Logging, 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 CPU | Small 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 limits | Requests 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 cap | EKS 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 differently | AKS 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 packing | Cluster autoscalers and node provisioners choose instance mixes and consolidate nodes, so real packing differs from one fixed instance type. |
Last updated 2026-11-05 (dataset 2026-11, refreshed monthly). Entries marked unverified or modelled could not be checked against an official page.
- https://raw.githubusercontent.com/awslabs/amazon-eks-ami/main/nodeadm/internal/kubelet/config.go
- https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/misc/eni-max-pods.txt
- https://docs.aws.amazon.com/eks/latest/userguide/choosing-instance-type.html
- https://docs.aws.amazon.com/eks/latest/userguide/cni-increase-ip-addresses.html
- https://docs.aws.amazon.com/ec2/latest/instancetypes/gp.html
- https://docs.aws.amazon.com/ec2/latest/instancetypes/co.html
- https://docs.aws.amazon.com/ec2/latest/instancetypes/mo.html
- https://b0.p.awsstatic.com/pricing/2.0/meteredUnitMaps/ec2/USD/current/ec2-ondemand-without-sec-sel/US%20East%20(N.%20Virginia)/Linux/index.json
- https://instances.vantage.sh/
- https://docs.cloud.google.com/kubernetes-engine/docs/concepts/plan-node-sizes
- https://docs.cloud.google.com/kubernetes-engine/docs/how-to/flexible-pod-cidr
- https://cloud.google.com/products/compute/pricing/general-purpose
- https://cloud.google.com/spot-vms/pricing
- https://learn.microsoft.com/en-us/azure/aks/node-resource-reservations
- https://learn.microsoft.com/en-us/azure/aks/concepts-network-ip-address-planning
- https://prices.azure.com/api/retail/prices
Three ways to reduce this number
- Match the family to the binding constraint: compute-optimized instances when CPU binds, memory-optimized when memory binds.
- Right-size requests from observed usage. Requests set from guesses are the usual source of idle CPU and memory.
- 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.