SIVARO
Kubernetes

Kubernetes Node Provisioning Cost: Karpenter vs EKS

You're staring at a cloud bill that grew 40%% quarter-over-quarter. Your finance team is asking questions. Your CEO wants to know why Kubernetes costs more th...

kubernetesnodeprovisioningcostkarpenter
By Nishaant Dixit
Kubernetes Node Provisioning Cost: Karpenter vs EKS

Kubernetes Node Provisioning Cost: Karpenter vs EKS

Stop 3AM Pages

Free K8s Audit

Get Started →
Kubernetes Node Provisioning Cost: Karpenter vs EKS

You're staring at a cloud bill that grew 40% quarter-over-quarter. Your finance team is asking questions. Your CEO wants to know why Kubernetes costs more than the engineering team's salaries.

I've been there. In 2024, we hit $187K/month on AWS for a single production cluster. The workloads hadn't changed. The node provisioning strategy had.

Let me save you the pain I went through. Karpenter isn't just a tool — it's a fundamental shift in how you think about capacity. But it's not magic. And EKS Managed Node Groups aren't obsolete. The answer depends on what you're running, how predictable it is, and how much operational pain you're willing to absorb.

Here's what we're covering: the actual cost mechanics of both approaches, when each makes sense, and the kubernetes workload right sizing with karpenter that nobody talks about. Plus the kubernetes node provisioning cost efficiency best practices we've validated across 40+ production clusters since 2023.

The Bill Comes From Somewhere

Before comparing tools, understand where node costs actually come from. Three places:

  1. Instance selection — you're paying for capacity you don't use
  2. Bin packing — pods spread across nodes with gaps you can't fill
  3. Node lifecycle — nodes sitting idle waiting for work that never comes

Managed Node Groups (MNG) solves problem one okay. Karpenter attacks all three simultaneously. That's the fundamental difference.

AWS launched Karpenter as open source in 2021. By 2024, it hit 1.0 and became the default recommendation for new EKS clusters. AWS's own documentation now positions Karpenter as the primary autoscaling solution. But "default recommendation" doesn't mean "right for everyone."

We tested both across our customer base. Here's what we found.

What Managed Node Groups Actually Cost You

Managed Node Groups is AWS's native solution. You define instance types, minimum/maximum sizes, and AWS handles the rest. It's reliable. It's predictable. It's also wasteful in ways that compound.

The core issue: MNG scales based on unschedulable pods, not resource utilization. That means:

  • A node at 30% CPU but with one pod stuck in Pending triggers a scale-out
  • You add a full node for one pod that needs 500m CPU
  • Downscaling waits for nodes to drain, which can take 15+ minutes

I watched a customer in the fintech space run 63 nodes at an average utilization of 23%. Their cluster autoscaler kept adding nodes because deployments were bursting. Each burst added 2-3 nodes that stayed for hours.

The math is brutal. At retail pricing for m5.large ($0.096/hour in us-east-1), 63 nodes with 40% waste costs roughly $21K/month in pure garbage. That's money leaving your account for compute doing nothing.

MNG also forces you into launch templates. You define a fixed set of instance families. When Spot prices spike or instance types get deprecated, you're stuck manually updating templates. We saw a customer run r5 instances for six months after m5 became 30% cheaper because updating the launch template was "too risky."

Karpenter Changes the Equation

Karpenter observes pod resource requests and schedules nodes at the exact granularity needed. It doesn't wait for unschedulable pods. It predicts.

Here's the theory:

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: general-purpose
spec:
  template:
    spec:
      requirements:
        - key: karpenter.sh/capacity-type
          operator: In
          values: ["on-demand", "spot"]
        - key: node.kubernetes.io/instance-type
          operator: In
          values:
            - "m5.large"
            - "m5.xlarge"
            - "m7i.large"
            - "c6i.large"
      nodeClassRef:
        name: default
  disruption:
    consolidationPolicy: WhenUnderutilized
    expireAfter: 720h

Notice what's missing: fixed sizes. Karpenter picks the cheapest instance that fits your pods. It can mix Spot and On-Demand in the same pool. It consolidates automatically — when utilization drops, it moves pods and terminates nodes.

In practice, this means:

  • A pod requesting 2 CPU and 4Gi memory can land on a c6i.large at $0.068/hour instead of forcing an m5.xlarge at $0.192/hour
  • Spot instances get used aggressively for stateless workloads
  • Nodes terminate within 60 seconds of becoming underutilized

We ran a head-to-head test on a staging cluster in March 2025. Same workloads, same traffic pattern. One week with MNG, one week with Karpenter. The results:

Metric MNG Karpenter
Nodes running (avg) 47 31
CPU utilization 31% 64%
Memory utilization 42% 71%
Weekly compute cost $4,839 $2,917

That's a 40% reduction in compute spend. Just by changing the provisioning layer.

The Right Sizing Piece Most Teams Miss

Here's where kubernetes workload right sizing with karpenter gets interesting. Karpenter exposes nuances that force you to confront your pod requests.

Most teams set requests at 2-4x actual usage. It's a safety margin habit from the pre-autoscaling days. But with Karpenter, oversized requests mean:

  1. Karpenter provisions larger instances than needed
  2. Consolidation can't pack efficiently
  3. You're paying for reserved capacity that never gets used

We built a recommendation engine at SIVARO that analyzes pod usage metrics across 90-day windows. The patterns are consistent. Teams set CPU requests based on a single bad day six months ago. Memory requests based on a Java heap default.

The fix isn't complicated — it's uncomfortable. Start with Vertical Pod Autoscaler in recommendation mode:

bash
kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/master/vertical-pod-autoscaler/deploy/manifests/recommender.yaml

Then apply recommendations on a schedule. We've automated this with a CronJob that compares VPA recommendations to actual requests weekly. The output lands in Slack for team review.

When we ran this across a customer in the healthcare space, we found their API service had requests at 4.5x actual usage. Fixing that alone cut their node count by 22%. This is the kubernetes node provisioning cost efficiency best practices sequence: first right-size requests, then let Karpenter do its thing.

When Karpenter Falls Short

I'm not here to sell you a silver bullet. Karpenter has real limitations.

Workloads with strict node affinity constraints. If you have stateful workloads requiring specific instance types (GPUs, local NVMe, specific CPU architectures), Karpenter's optimization can conflict with your constraints. You end up with multiple NodePools and complexity that defeats the purpose. The H100 cluster we ran for a generative AI client in late 2025 stayed on MNG. Karpenter couldn't handle the GPU instance scarcity logic well enough.

Teams without Kubernetes depth. Karpenter's configuration surface is small, but its failure modes require deep understanding. When Karpenter misconfigured a NodePool in one of our clusters, it started terminating nodes with active long-running jobs. The disruption policy didn't account for PodDisruptionBudgets correctly. That was a painful Tuesday.

Cost visibility gets harder. With MNG, you have node groups — predictable billing dimensions. With Karpenter, you get a mix of instances that change constantly. Your finance team will hate you unless you implement proper cost allocation tags from day one.

yaml
spec:
  template:
    metadata:
      labels:
        billing-team: platform
        billing-environment: production

You need these tags everywhere. Trust me. Setting up AWS Cost Explorer with EKS cost allocation tags is non-negotiable.

The Hybrid Approach We Actually Run

After 18 months of testing, here's what we run in production across SIVARO's clusters:

  • Karpenter for all stateless workloads (API servers, workers, batch jobs)
  • MNG for system components (CoreDNS, kube-proxy, monitoring) with a single, fixed node group
  • MNG for GPU workloads
  • Karpenter with separate NodePools for Spot vs On-Demand

The system components on MNG cost us maybe $400/month extra compared to Karpenter optimization. But it buys us stability. When Karpenter has a bad day or we make a configuration error, the critical path still runs. That insurance is worth more than the savings.

The Spot vs On-Demand split is where the real savings live. We run 70% of stateless workloads on Spot with Karpenter. The interruption handling is better than any other tool I've used.

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: spot-general
spec:
  disruption:
    consolidationPolicy: WhenEmpty
    consolidateAfter: 30s
  template:
    spec:
      requirements:
        - key: karpenter.sh/capacity-type
          operator: In
          values: ["spot"]

This policy terminates nodes the moment they're empty. With MNG, you'd wait for the node group's scale-in policy. With Karpenter, we reclaim capacity in seconds, not minutes. Over a month, this saves us roughly 8% of compute spend just from faster downscaling.

Kubernetes Node Provisioning Cost Efficiency Best Practices That Matter

The tool matters less than your operational habits. After auditing dozens of clusters from 2022-2026, here are the practices that consistently reduce node costs:

Set memory limits. Not just requests. Pods without memory limits can trigger OOM killer on nodes, forcing Karpenter to provision replacement capacity. Set limits at 1.5-2x requests for most workloads.

Use pod anti-affinity carefully. Every topology spread constraint means Karpenter can't pack as tightly. We saw a customer use spread across zones for all workloads — tripling node count because each deployment needed at least 3 nodes. That spread should be reserved for stateful or critical services.

Enable cluster proportional autoscaling for system components. CoreDNS and metrics-server don't need to scale linearly with node count. Fixed replicas of 2-3 are enough for clusters under 50 nodes. The resource savings add up.

Track real-time costs. We built internal dashboards using Kubecost and OpenCost, which provide accurate per-pod cost breakdowns. Not having this visibility is how you end up with a surprise $30K bill.

Review right-sizing recommendations monthly. We schedule a recurring task in our ops rotation. Every first Monday, we review VPA recommendations and merge them into deployment manifests.

The Comparison Framework for Your Decision

The Comparison Framework for Your Decision

Let me give you a practical decision framework based on what we've observed across customers:

Choose Karpenter if you have:

  • Heterogeneous workloads with varying resource profiles
  • Development environments that run 8-5, Monday-Friday
  • Teams comfortable with Kubernetes internals
  • Stateless applications (most web services, workers, batch jobs)
  • Spot instance tolerance for non-critical workloads

Choose MNG if you have:

  • Strict compliance requirements around instance types
  • Heavy GPU workloads
  • Limited Kubernetes operational experience
  • Stateful workloads with persistent volumes and node affinity
  • An organization that values predictability over efficiency

Most teams should end up somewhere in the middle. After the Kubernetes node provisioning cost karpenter vs eks analysis I've done for clients, the typical answer is "Karpenter for most, MNG for specific cases."

Sizing Your Savings Realistically

Let's do the math for a typical mid-size production cluster:

  • 30 concurrent pods
  • Average pod request: 1 CPU, 2Gi memory
  • MNG configuration: m5.large instances (2 CPU, 8Gi) — you run 15 nodes at best case
  • Actual utilization: 40-50% CPU

The MNG approach at 15 nodes running m5.large: 15 × $0.096/hour × 730 hours/month = $1,051/month per environment. That's $12,614/year per environment. With dev, staging, and production, you're looking at $37,842/year.

Karpenter, on the same workload, would pack those 30 pods into 6-7 nodes. It can use m5.large for the batches that fit and c6i.large for CPU-heavy pods. Cost: roughly $550/month per environment. That's $19,800/year across three environments — a 47% reduction.

Add right-sizing: when you fix the 4x request inflation we see in most pods, those 30 pods might become 15 smaller pods. Now Karpenter runs 3-4 nodes. We're talking $300/month per environment.

The total journey: $37,842 → $19,800 → $10,800 per year. That's a 71% reduction from start to finish. I've seen these numbers repeated across industries, from a logistics customer in Chicago to a gaming startup in Berlin.

A Cautionary Tale About Speed

One customer — a payments company handling $500M in annual transactions — decided to enable Karpenter on their production cluster with aggressive consolidation. They didn't configure PodDisruptionBudgets correctly. Karpenter started moving pods during peak traffic at 2 PM.

The result: 14 minutes of 526 errors, including a failed PCI compliance check. Their customer support was flooded. The engineering team spent the next week explaining to their board what went wrong.

The fix wasn't to abandon Karpenter. It was to configure proper PDBs and set consolidation policies that respect business hours:

yaml
spec:
  disruption:
    budgets:
      - nodes: "15%"
        schedule: "0 0 * * *"
        duration: 24h

This limits disruption to 15% of nodes during the day, expanding to full consolidation at night. Set this up before you deploy Karpenter to production. Don't learn this lesson the expensive way.

What the Community Is Saying

The Kubernetes community has moved firmly in Karpenter's direction. The CNCF's 2024 annual survey showed 68% of organizations running Kubernetes on AWS were using or evaluating Karpenter. AWS's own re:Invent 2024 sessions positioned Karpenter as the recommended approach for new deployments.

But the community also developed workarounds that hint at Karpenter's limitations. The Cluster Autoscaler for AWS project still has 4,000+ open issues — but active development has slowed as AWS shifts focus. If you want the community-supported path forward, Karpenter is it.

I did a talk at KubeCon North America in November 2025, and I asked 200 attendees their default provisioning strategy. 62% said Karpenter. Yet when I asked who had actual cost savings data, only 18% raised their hands. The rest assumed they were saving money. That's a dangerous assumption.

The Real Cost of Not Measuring

Kubernetes node provisioning cost karpenter vs eks isn't the only decision. You need to measure what you're actually spending. Most teams know their gross cloud spend but can't attribute it to specific workloads.

That's why we built a cost analysis tool at SIVARO that sits on top of Kubernetes metrics and cloud billing data. It maps every pod's resource usage to actual dollar spend per hour. No more guessing.

Without this, you're flying blind. You might think you're saving money with Karpenter when your actual spend is flat because your workloads grew 40% while you were optimizing.

A Practical Migration Path

If you're convinced Karpenter is right for your environment, here's the migration approach I'd recommend:

  • Month 1: Right-size your pods. Use VPA in recommendation mode. Fix the top 10 workloads by resource waste.
  • Month 2: Deploy Karpenter in a non-production cluster alongside MNG. Shadow traffic to validate behavior.
  • Month 3: Move stateless workloads to Karpenter in staging. Run for two weeks. Measure everything.
  • Month 4: Enable Karpenter in production for stateless workloads, keeping MNG for system components and stateful services.
  • Month 5 onward: Monitor, adjust consolidation policies, and fine-tune the Spot mix based on interruption rates.

Karpenter is not a one-afternoon install. It took us about four weeks of iteration before we felt confident running it in production across all environments. Budget that time.

The Bottom Line

Managed Node Groups and Karpenter solve different problems. MNG provides predictability and simplicity. Karpenter provides efficiency and cost reduction. In most production environments, you need both.

The 40-50% savings from Karpenter are real — I've measured them across dozens of clusters since 2023. But they only materialize when you've done the hard work of right-sizing your workloads first. And they require operational maturity to maintain.

Start with kubernetes workload right sizing with karpenter — understand your pod requirements, fix your resource requests, and then let Karpenter optimize the infrastructure layer. The kubernetes node provisioning cost efficiency best practices aren't secrets. They're habits.

Try Karpenter on one cluster. Measure for 30 days. See the difference for yourself.

The math will convince you faster than anything I say here.

FAQ

FAQ

Is Karpenter free to use?
Yes. Karpenter is open source and runs inside your cluster. You're only paying for the AWS compute resources it provisions. There's no AWS licensing fee for Karpenter itself.

Does Karpenter work with Fargate?
No. Karpenter manages EC2 instances. For serverless container compute, you'd use AWS Fargate along with EKS, but Karpenter doesn't manage Fargate capacity.

What's the minimum cluster size for Karpenter to be worthwhile?
We've seen value at clusters with 5+ nodes and mixed workloads. Below that, the operational overhead outweighs the savings. For a single large node handling everything, MNG is fine.

How does Karpenter handle Spot instance interruptions?
Karpenter watches for rebalance recommendations and interruption notices, then proactively moves workloads before AWS terminates the instance. It uses Kubernetes taints and finalizers to drain nodes gracefully. This is more efficient than the default interruption handling in MNG.

Can I use Karpenter with existing MNG node groups?
Yes. You can run both simultaneously, but avoid having both manage nodes with identical labels — they'll fight over workloads. Keep separate node groups with separate labels for each.

How often should I review my Kubernetes node costs?
Weekly at minimum. We've automated daily cost reports that flag spend anomalies. The teams that review monthly are the ones that find out about cost increases 30 days late.

Does Karpenter work with EKS Auto Mode?
EKS Auto Mode launched in 2024 partially automates node provisioning and scaling. It can work alongside Karpenter, but AWS recommends choosing one primary strategy. Auto Mode handles a narrower set of use cases — Karpenter gives more control.


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

Part of our Kubernetes series — see every guide in this cluster. Fighting this in production? Explore MVP to Production.

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