Karpenter vs EKS Nodegroup: Real Cost Comparison 2026

You think you’re saving money with EKS managed nodegroups. I thought so too, back in 2023. Then I ran the numbers. We were burning 30%% more than we needed ...

karpenter nodegroup real cost comparison 2026
By Nishaant Dixit
Karpenter vs EKS Nodegroup: Real Cost Comparison 2026

Karpenter vs EKS Nodegroup: Real Cost Comparison 2026

Stop 3AM Pages

Free K8s Audit

Get Started →
Karpenter vs EKS Nodegroup: Real Cost Comparison 2026

You think you’re saving money with EKS managed nodegroups. I thought so too, back in 2023. Then I ran the numbers. We were burning 30% more than we needed on a data pipeline handling 200K events/sec. The culprit wasn’t EC2 pricing. It was how we were scheduling compute.

This is a direct comparison: Karpenter vs EKS nodegroup cost. I’ll show you the math, the gotchas, and when you should (and shouldn’t) swap one for the other.

If you’re running Kubernetes on AWS and your monthly bill gives you heartburn, this guide is for you. You’ll learn where the waste hides, how Karpenter’s consolidation model slashes that waste, and exactly how to set it up without blowing up your production cluster.


How EKS Nodegroups Actually Cost You Money

Managed nodegroups are simple. Tell AWS your instance type, min/max/desired count, some tags. AWS spins up an Auto Scaling Group. Done.

But simple doesn’t mean cheap. Here’s the dirty secret: nodegroups encourage static thinking.

You pick a family – say, m5.large. You set min=3, max=10. Your pods land on those instances. Some pods need 2 CPU; the instance has 2 vCPUs. Result? 50% of your CPU sits idle because of the OS overhead, kubelet, and daemonsets. You’re paying for 8 vCPUs (if you have 4 nodes), but only using 5.

That’s not a Karpenter problem. That’s a bin-packing waste problem. And nodegroups are terrible at fixing it because they can’t mix instance families within a single ASG. If you want to use a different type, you create another nodegroup. Which you forget to delete. Now you have orphaned resources. Sound familiar?

I’ve seen companies (real ones, not hypothetical) run 14 nodegroups for a single cluster, each with its own scaling config. That’s 14 separate rightsizing decisions to make. Nobody does that manually.


What Karpenter Does Differently (and Why It Matters for Costs)

Karpenter is an open-source node autoscaler by AWS. It doesn’t use Auto Scaling Groups. Instead, it watches pod requests and directly provisions the cheapest EC2 instance that can fit them.

Here’s the game‑changer: it can mix instance families, sizes, and purchase options in real time.

A pod needs 1 vCPU and 2GB RAM. Karpenter might pick a t3a.small (cheap burstable) for that. Another pod needs 4 vCPUs and 16GB. Karpenter picks a c6i.large (compute-optimized). They land on the same node if it fits, or on different nodes if not.

The cost saving comes from two mechanisms:

1. Consolidation: the killer feature

Karpenter constantly checks if it can “consolidate” your workloads onto fewer or cheaper instances. According to the detailed overview, there are three consolidation strategies:

  • DeleteEmpty – removes nodes with only daemonset pods.
  • DeleteReplace – replaces a node with cheaper instances (e.g., c5.largec6i.large spot).
  • ReplicateReplace – redistributes pods across existing nodes to allow a node to be deleted.

This runs every few seconds. It’s like having a full-time cost engineer inside your cluster.

2. Spot instance agility

Karpenter handles spot interrruptions at the node level, not the ASG level. When AWS reclaims a spot instance, Karpenter creates a new node – often of a different type – before the pods get evicted (if you have PodDisruptionBudgets set right). The result? You can run 70‑80% spot without fear. Most people reading this run maybe 40% spot because nodegroups make spot management painful.

I learned this the hard way. At first I thought Karpenter was just another autoscaler. Turns out it’s a scheduler that happens to provision nodes.


karpenter vs eks nodegroup cost comparison: The Numbers

Let’s make this concrete. I’ll use a real cluster pattern from a SIVARO client (e-commerce platform, about 50 microservices, 8 months of telemetry).

Scenario: Steady state, mixed workloads

Metric EKS Nodegroup (m5.xlarge, on‑demand) Karpenter (mix of c6i, m6i, spot 70%)
Nodes running 12 m5.xlarge 8 nodes (various sizes)
Total vCPU provisioned 48 38
Average memory utilization 52% 74%
Monthly cost (compute only) $6,720 $4,150
Spot savings 0% 32% of total
Consolidation actions per day 0 (static) ~40

That’s a 38% reduction in compute cost. Tinybird published similar results: they cut AWS costs by 20% while scaling with EKS, Karpenter, and Spot Instances in 2025. I’ve seen 40% in bursty workloads.

But here’s the catch: that 38% assumes you configure Karpenter correctly. If you misconfigure cluster limits or nodepool selectors, you can actually increase cost. I’ll show you how to avoid that.


Configuration That Makes or Breaks Cost Savings

You don’t just install Karpenter and save money. You have to tune three things.

1. Nodepool disruption budgets

Karpenter will consolidate aggressively unless you tell it to chill. If a node runs a critical stateful set, you must set disruption.budgets to prevent it from being replaced during peak hours. Here’s a snippet from my production setup:

yaml
apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
  name: general
spec:
  template:
    spec:
      requirements:
        - key: karpenter.sh/capacity-type
          operator: In
          values: ["spot", "on-demand"]
        - key: node.kubernetes.io/instance-type
          operator: In
          values: ["c6i.large", "c6i.xlarge", "m6i.large", "m6i.xlarge"]
      limits:
        cpu: 200
        memory: 500Gi
  disruption:
    consolidationPolicy: WhenEmptyOrUnderutilized
    budgets:
      - nodes: "20%"
        duration: 5m
      - nodes: "100%"
        duration: 1h
        schedule: "0 0 * * *"  # overnight only

The WhenEmptyOrUnderutilized policy triggers consolidation only when nodes are mostly idle. That’s more conservative than the default WhenEmpty, which will replace nodes even with pods running – great for spot, risky for stateful apps.

2. Instance diversity

Karpenter’s strength is picking any instance type that fits. If you restrict it too severely, you lose the cost arbitrage. I recommend allowing at least 10 instance families across 3 generations. My go‑to list:

yaml
- key: node.kubernetes.io/instance-type
  operator: In
  values:
    - "c6i.*"
    - "c7i.*"    # 20% cheaper per vCPU than c6i
    - "m6i.*"
    - "m7i.*"
    - "r6i.*"
    - "t3a.*"    # burstable for idle workloads

Note the wildcard * in the values? That’s a Karpenter feature – it matches all sizes within a family. You don’t have to list every OS and region variation.

3. Undesired nodes and interruption handling

Karpenter can evict pods quickly, but if your PDBs are too tight, it can cause cascading failures. I learned this the hard way after an incident where Karpenter tried to consolidate a node running our Redis replica – the PDB allowed zero disruptions. Result? pod stuck in Terminating for 12 minutes. A Personal Take on Pod Disruption Budgets and Karpenter covers exactly this scenario. Tame your PDBs: set maxUnavailable: 1 even for critical workloads. The cost of one extra node for 5 minutes is lower than the cost of a 12‑minute outage.


When Nodegroups Are the Right Call (Yes, Really)

When Nodegroups Are the Right Call (Yes, Really)

Most people think Karpenter is always cheaper. It’s not. Here’s when I still use nodegroups.

You need GPU instances (e.g., p5, g6)

Karpenter can provision GPUs, but spot GPU instances get reclaimed constantly. Nodegroups with a dedicated ASG and a heavy on-demand base are more stable for training jobs. I’ve seen Karpenter consolidation try to swap a p4d.24xlarge for two g5.12xlarges – which made both nodes unsuitable for the job because GPUs are not fungible across sizes.

You run legacy workloads with static resource requests

If your developers haven’t set proper CPU/memory requests in 3 years (I see you), Karpenter can’t bin-pack efficiently. It will overallocate. In that case, fix the requests first. Nodegroups at least force you to pick one instance type, which is simpler to budget.

You have strict procurement processes

Some orgs require EC2 reserved instances or Savings Plans tied to specific families. Karpenter’s dynamic selection can make those plans underutilized. You can pin nodepools to only use families you have reserved, but then you lose the flexibility advantage. At that point, why not just use nodegroups?


How to reduce kubernetes node costs with Karpenter (Step by Step)

You want the playbook. Here’s what I do for every client:

  1. Install Karpenter via Helm – use the official chart, set settings.aws.defaultInstanceProfile to your node IAM profile.
  2. Create a default NodePool that allows both spot and on-demand, with a consolidation policy of WhenEmptyOrUnderutilized.
  3. Set limits.cpu and limits.memory to 80% of your total budget. Karpenter will not exceed that, preventing bill shock.
  4. Add a NodeClass to define the AMI, security groups, subnet selectors.
  5. Test with a canary workload – run a sample deployment and watch Karpenter provision a node. Check kubectl logs -n karpenter. You should see Provisioned node messages.
  6. Monitor spot interruption rates using CloudWatch metrics like NodeInterruptionCount. If you see >5 per day, reduce spot percentage.
  7. Enable consolidation after 24 hours – let the cluster stabilize, then flip consolidation to WhenEmptyOrUnderutilized.
  8. Iterate on nodepool requirements – remove any instance families that are too expensive in your region.

For a full reference, the Concepts page explains each field.


Karpenter spot instance cost savings 2026: What We’re Seeing Now

As of mid‑2026, AWS has made spot pricing more volatile in some regions (us‑east‑1 especially). But Karpenter’s ability to fall back to on‑demand cheaply – because it picks different families – means you can still run 70% spot safely.

A comparison we ran for a fintech client: they had 12 m5.xlarge on‑demand ($0.192/hr each). After switching to Karpenter with 70% spot, the average effective hourly cost dropped to $0.108 per vCPU. That’s a 44% spot savings over 6 months. The catch: they had to test their application tolerance for spot interruptions. Turned out most stateless microservices handled them fine – the one that didn’t got a PDB update.


FAQ

Why does Karpenter cost less than nodegroups?

Because it doesn’t waste capacity. Nodegroups lock you into a single instance type, leading to under‑utilization. Karpenter picks the smallest instance that fits each pod, and consolidates aggressively.

Can I use Karpenter with existing nodegroups?

Yes, but only for new pods. Existing nodegroups are managed by AWS – Karpenter won’t touch them. You can gradually move workloads by adding a nodeSelector that prefers Karpenter nodes.

Does Karpenter support GPU?

Yes, but with caveats. You must define a separate NodePool with the karpenter.sh/capacity-type: on-demand requirement and a GPU selector. Spot GPU instances are too unstable for most production workloads.

How long does consolidation take to start saving money?

Immediate. Once consolidation is enabled, Karpenter acts within seconds. You’ll see node count drop within 5–10 minutes.

What’s the risk of using Karpenter in production?

The biggest risk is misconfigured disruption budgets leading to unwanted node termination. Start with WhenEmptyOrUnderutilized and a budget that limits changes during business hours.

Should I use Karpenter if I have Savings Plans?

Yes, but align your NodePool requirements to use the instance families you’ve committed to. You lose some flexibility, but still gain consolidation.

Is Karpenter compatible with Fargate?

Not directly. Karpenter only provisions EC2 nodes. Fargate runs on its own infrastructure.


Conclusion

Conclusion

The karpenter vs eks nodegroup cost comparison comes down to a single question: do you want to pay for what you ask or what you provision?

Nodegroups make you pay for what you provision. Karpenter makes you pay for what you ask – and only as long as you ask for it.

I switched my production cluster in late 2024. My monthly compute bill dropped 31% in the first month. Then I spent another three weeks tuning PDBs and nodepool limits. The final number? 38% cheaper, with zero outages.

If you’re still on managed nodegroups, you’re probably leaving 20–35% on the table. Test Karpenter on a staging cluster this week. The configuration is eight lines of YAML. The savings will pay for the engineering time in less than a month.


Nishaant Dixit — Founder of SIVARO. Building data infrastructure and production AI systems since 2018. Built systems processing 200K events/sec.

Free · No Commitment · 48-Hour Delivery

Get a free infrastructure audit

2-hour remote session. We audit your data infrastructure, identify what's costing you time and money, and deliver a written roadmap with specific, measurable targets. No pitch.

Book Your Free Audit
N
Nishaant Dixit
Founder & Lead Engineer at SIVARO

Building data-intensive systems since 2018. 200K events/sec pipelines, production RAG systems, Kubernetes infrastructure. LinkedIn →

Start a Project
Need help with infrastructure?

Kubernetes, Karpenter, DevOps pipelines, and container orchestration for production workloads.

Explore MVP to Production