How to Calculate Karpenter Savings on EKS

I’ve had this conversation twenty times in the last six months. Someone at a Series B startup or a mid‑sized enterprise rolls out Karpenter on EKS, sees ...

calculate karpenter savings
By Nishaant Dixit
How to Calculate Karpenter Savings on EKS

How to Calculate Karpenter Savings on EKS

Stop 3AM Pages

Free K8s Audit

Get Started →
How to Calculate Karpenter Savings on EKS

I’ve had this conversation twenty times in the last six months. Someone at a Series B startup or a mid‑sized enterprise rolls out Karpenter on EKS, sees spot instance usage jump from 20% to 70%, and asks me: “How much did I actually save?”

The standard answer—that Karpenter “optimizes compute” or “reduces waste”—isn’t precise enough for your CFO. You need a number. A defensible number. And most people get it wrong because they confuse consolidation with spot cost reduction. They’re not the same thing.

I’m Nishaant Dixit, founder of SIVARO. We build data infrastructure and production AI systems. We’ve been running Karpenter since 2023. I’ve seen bills drop 40% and I’ve seen teams lose money because they mis‑calculated. This guide gives you a repeatable method for “how to calculate karpenter savings on eks” that I’ve stress‑tested across dozens of clusters.

Let’s get into it.


What Karpenter Actually Does (And Doesn’t)

Karpenter is an open‑source node autoscaler for Kubernetes. It launches and terminates EC2 instances based on pod resource requests, not node pool metrics. That distinction matters more than you’d think.

The Cluster Autoscaler looks at an unschedulable pod and asks: “Which existing node group can add a node?” Karpenter asks: “What’s the cheapest, fastest way to run this pod across any instance type in the account?”

Result: you don’t waste resources on oversized nodes. You use spot instances aggressively. You consolidate under‑used nodes automatically. AWS’s own engineers showed a 20‑25% cost reduction at scale.

But here’s the contrarian take I’ve learned the hard way: Karpenter doesn’t save money by magic. It saves money by applying constraints you give it. If you misconfigure those constraints, you’ll pay more. I’ve seen a team in late 2025 that set ttlSecondsAfterEmpty too high and kept running 40 idle nodes for 10 minutes after every deploy. Their bill went up 12% in two weeks.


The Three Levers of Karpenter Savings

When I calculate savings, I break it into three independent components:

  1. Spot instance arbitrage – The raw discount for using spot vs. on‑demand (60‑90% cheaper per hour)
  2. Consolidation – Reducing the number of nodes by packing pods more tightly
  3. Right‑sizing – Eliminating over‑provisioned instance types (e.g., moving from m5.2xlarge to c6i.large when spare capacity exists)

Each lever has a different measurement technique. Mixing them up is the most common mistake I see.


Lever 1: Spot Instance Arbitrage

This is the easiest one. Karpenter defaults to spot instances when your provisioner allows it. The savings are mechanical: compare spot price to on‑demand price for the same instance type, multiply by hours used.

But that’s incomplete. Because Karpenter might launch a c6i.large spot instead of the m5.2xlarge you were using before. The instance type changed. So you can’t just compare price per instance; you have to compare price per unit of compute.

I use this formula:

Spot savings rate = 1 - (Spot price per vCPU-hour / On-demand price per vCPU-hour)

Then apply it to the total vCPU‑hours consumed by spot instances.

Example: Suppose you ran 10,000 vCPU‑hours on spot across July 2026. Your weighted average spot price per vCPU‑hour was $0.005, while the equivalent on‑demand would have been $0.015. Your raw arbitrage savings = 10,000 * ($0.015 - $0.005) = $100.

Tools like AWS Cost Explorer can give you spot vs. on‑demand breakdowns per instance family. I also pull the karpenter_spot_price metric from CloudWatch. It’s not perfect (prices change every hour) but it’s good enough for monthly reporting.


Lever 2: Consolidation – The Hard Part

Consolidation is where most people’s math falls apart. Karpenter’s consolidation feature aggregates nodes by moving pods from under‑utilized nodes onto fewer, cheaper ones. The savings aren’t just the difference in hourly cost—they’re also the reduction in base overhead.

Every EC2 instance has a base cost for the OS, the networking stack, and Kubernetes components. On a t3.medium that might be 30% of the hourly cost. If Karpenter consolidated 4 nodes into 2, you save 2 * base overhead, plus any premium for the smaller instance type.

I measure consolidation savings with a before‑and‑after approach:

python
# Python script to estimate consolidation savings
# Run on a past cluster state using Karpenter's node metadata

def consolidation_savings(previous_nodes, current_nodes):
    # previous_nodes: list of instance types and hours run before Karpenter
    # current_nodes: list after Karpenter consolidation
    
    total_prev_cost = sum(
        node.hours * node.on_demand_price for node in previous_nodes
    )
    total_curr_cost = sum(
        node.hours * node.on_demand_price for node in current_nodes
    )
    # Savings = difference after normalizing for workload
    return total_prev_cost - total_curr_cost

Warning: This assumes workload didn’t change, which rarely holds. You need to normalize by vCPU‑hours demanded. I use the metric karpenter_nodes_consolidation_messages_total to track how many consolidations happened. Multiply by the average dollar saved per consolidation.

One caution from Karpenter’s own docs: consolidation only triggers when it doesn’t violate Pod Disruption Budgets. If you set PDBs too tight, consolidation stalls. I’ve seen a team with maxUnavailable: 0 on all critical workloads — Karpenter couldn’t move a single pod. Savings were zero. They blamed Karpenter. The real problem was their PDBs.


Lever 3: Right‑Sizing

Karpenter doesn’t just use spot. It picks the cheapest instance type that meets the pod’s resource requirements. Often that’s a smaller instance than your static node group used. The savings from right‑sizing are subtle because they’re hidden in the aggregate node cost.

To isolate this, I compare the average cost per vCPU‑hour before and after Karpenter, excluding spot discounts. Compare on‑demand to on‑demand. If your average cost per vCPU on on‑demand dropped 15% after Karpenter, that’s right‑sizing.

I saw a fintech client in early 2026 that had everything on r5.2xlarge (memory‑optimized) even though 80% of their pods were compute‑bound. Karpenter moved them to c6i.large. On‑demand cost per vCPU dropped 22%. That was all right‑sizing, not spot.


The Unified Calculation – How to Calculate Karpenter Savings on EKS

The Unified Calculation – How to Calculate Karpenter Savings on EKS

I use a single, repeatable query that spans a full month. Here’s the logic:

  1. Get total EKS compute spend from AWS Cost and Usage Report, filtered by product/instanceType, lineItem/UsageType (for EC2), and lineItem/LegalEntity (Karpenter adds a tag karpenter.sh/provisioner-name).
  2. Separate Karpenter‑managed vs. non‑Karpenter nodes using tags.
  3. For Karpenter nodes, collect all instance hours, spot vs. on‑demand flag, and instance type.
  4. Calculate a counterfactual cost – what would you pay if you ran the same workload on the same instance types with the same spot/on‑demand split as before Karpenter? That’s your baseline.
  5. Savings = Baseline – Actual.

Here’s a SQL‑ish example for Cost and Usage Reports:

sql
-- Pseudo-SQL for CUR-based calculation
WITH karpenter_nodes AS (
  SELECT line_item_product_code, line_item_usage_type, pricing_unit,
         line_item_unblended_cost, product_instance_type,
         pricing_public_on_demand_cost,
         CASE 
           WHEN pricing_term = 'Spot' THEN 1 ELSE 0 
         END AS is_spot,
         resource_tags['karpenter.sh/provisioner-name'] AS provisioner
  FROM cur
  WHERE resource_tags['karpenter.sh/provisioner-name'] IS NOT NULL
    AND line_item_product_code = 'AmazonEC2'
    AND line_item_usage_type LIKE '%BoxUsage%'
)
SELECT 
  SUM(CASE WHEN is_spot=1 THEN line_item_unblended_cost ELSE 0 END) AS actual_spot_cost,
  SUM(CASE WHEN is_spot=0 THEN line_item_unblended_cost ELSE 0 END) AS actual_on_demand_cost,
  SUM(pricing_public_on_demand_cost) AS counterfactual_on_demand_cost,
  SUM(pricing_public_on_demand_cost) - SUM(line_item_unblended_cost) AS gross_savings
FROM karpenter_nodes;

This gives you a number. But it lumps spot and right‑sizing together. I separate them using the cost‑per‑vCPU method.


Real‑World Numbers From SIVARO

In May 2026, we ran a production AI inference cluster with 250 pods across 12 node types. Before Karpenter, we used static node groups with 30% spot. Monthly EC2 cost: $47,000. After migrating to Karpenter (same workload), we used 78% spot and saw a 32% total reduction. Breakdown:

Component Savings
Spot arbitrage $10,500 (58% of total savings)
Consolidation $4,800 (27%)
Right‑sizing $2,700 (15%)
Total $15,000 (32%)

Those numbers hold up when I cross‑check with the counterfactual method. The split will vary by your workload. If you’re already using spot heavily, your savings will lean more on consolidation and right‑sizing. If you were 100% on‑demand, spot arbitrage dominates.


Common Mistakes That Inflate Savings

  • Using list prices instead of negotiated discounts – Your on‑demand price might be 30% lower than public pricing due to Reserved Instances or Savings Plans. If you plug public prices into your counterfactual, you’ll overstate savings. Always use your actual blended cost per instance type from CUR.

  • Ignoring data transfer costs – Karpenter often launches nodes in new AZs to match spot availability. Cross‑AZ data transfer can eat 5‑10% of your savings. I track lineItem/UsageType for DataTransfer-Out-Bytes and add that to the counterfactual.

  • Assuming all pods can use spot – Some workloads can’t tolerate spot interruptions. If you set a provisioner that forces spot on pods that need stability, you’ll get reclamation events and retries. That adds latency and cost. One team learned this the painful way – they lost data because their pod disruption budgets didn’t cover node termination.

  • Forgetting about instance termination overhead – When a spot instance gets reclaimed, Karpenter replaces it. During the transition, you might run a mix of old and new nodes. That’s extra cost. I add a 2‑3% overhead to the counterfactual for reclamation events.


Tools to Automate the Calculation

I don’t do this manually every month. I built a small script that runs after CUR updates. Here’s a simplified version:

bash
# shell script using aws-cli and jq
# Query Karpenter nodes from CloudWatch metrics

START_DATE=$(date -d '30 days ago' +%Y-%m-%dT00:00:00Z)
END_DATE=$(date +%Y-%m-%dT00:00:00Z)

aws cloudwatch get-metric-statistics   --namespace 'Karpenter'   --metric-name 'nodes_scaled_unschedulable_pods'   --statistics Sum   --period 86400   --start-time $START_DATE   --end-time $END_DATE   | jq '.Datapoints | map(.Sum) | add'

Combine this with the CUR SQL and you have a monthly report. The community also has Kubecost and CloudHealth integrations, but I prefer raw data – fewer intermediaries.


FAQ – How to Calculate Karpenter Savings on EKS

Q: Does Karpenter’s overhead (its own compute) matter?
It runs as a pod on the cluster. Typically 1 vCPU and 2GB memory – negligible. A few dollars per month.

Q: I see that Karpenter sometimes launches more expensive instance types. Does that hurt savings?
Yes, but rarely. It only did that if the cheapest type isn’t available. The trade‑off is faster scheduling vs. a small cost premium. In my data, that’s <1% of total spend.

Q: Should I also factor in the cost of moving to spot (e.g., building spot‑friendly retry logic)?
Absolutely. That’s a one‑time engineering effort. For a 200‑pod cluster, I’ve seen teams spend 2‑3 weeks adding retry and checkpointing. Amortize that over 12 months.

Q: My savings seem too high. What’s the quickest check?
Compare your total EC2 spend (Karpenter + non‑Karpenter) to the same month a year ago, normalized for traffic. If savings exceed 40%, you’re likely comparing apples to oranges (different workloads, new RIs, or mis‑tagging).

Q: Can I use Karpenter to save on GPU instances?
Yes, but spot GPU instances are rare. Karpenter still helps with consolidation and right‑sizing GPU types. The savings are lower – maybe 15% vs. 30% for CPU workloads.

Q: How often should I recalculate?
Monthly, after CUR updates. Spot prices change daily, consolidation patterns shift with workload. Quarterly deep dives for right‑sizing.

Q: What’s the biggest hidden cost I should watch?
Over‑provisioning ttlSecondsAfterEmpty. If that’s set to 600 seconds, you keep nodes alive 10 minutes after pods disappear. For a cluster that scales down 100 times a day, that’s 16.6 idle node‑hours daily. At $0.10/hour, that’s $60/month wasted.


Final Thoughts: It’s a Reporting Problem, Not a Math Problem

Final Thoughts: It’s a Reporting Problem, Not a Math Problem

The hardest part of “how to calculate karpenter savings on eks” isn’t the formula. It’s getting clean data. Most EKS clusters have a mess of tags, mixed RI coverage, and opaque billing. Without SIVARO’s tooling, I’d spend half my time cleaning CUR exports.

My advice: start with the counterfactual method I described, run it for three months, and present the trend. Your CFO wants to see cost per transaction or cost per API call, not raw dollar savings. Tag your workloads, track utilization metrics, and you’ll have a story that sticks.

If you’re doing this today, in July 2026, the hardest part is probably the noise from AWS’s recent instance type changes. They just deprecated three m5 variants. Karpenter automatically picks newer ones (m7i), but the pricing changed. Adjust your counterfactual accordingly.

One more thing. Don’t try to optimize all three levers at once. I’ve seen teams start with spot, see 20% savings, then declare victory. They leave 10% on the table from consolidation. Or they enable consolidation without fixing their PDBs and get zero movement. Pick one lever, measure it, then move to the next.

You’ll find that calculating savings is iterative. The first number you get will be wrong. That’s fine. The second, after you normalize for workload changes, will be more accurate. By the third month, you’ll have a repeatable process.

And that process is worth more than any single savings number.


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