How to Reduce Kubernetes Costs With Karpenter (2026 Edition)

I spent $47,000 on a Kubernetes cluster last year that should have cost $12,000. Not because we had some crazy scale problem. Not because we were running LLM...

reduce kubernetes costs karpenter (2026 edition)
By Nishaant Dixit
How to Reduce Kubernetes Costs With Karpenter (2026 Edition)

How to Reduce Kubernetes Costs With Karpenter (2026 Edition)

Stop 3AM Pages

Free K8s Audit

Get Started →
How to Reduce Kubernetes Costs With Karpenter (2026 Edition)

I spent $47,000 on a Kubernetes cluster last year that should have cost $12,000.

Not because we had some crazy scale problem. Not because we were running LLMs at Netflix volume. Because we were using the wrong tool to manage compute.

Here's the thing about Kubernetes in 2026: the control plane isn't your cost problem. The nodes are. And most people are still treating node management like it's 2020.

I'm Nishaant Dixit, founder of SIVARO. We build data infrastructure and production AI systems. I've watched teams burn money on Kubernetes for years. And I've seen one tool change that equation more than anything else: Karpenter.

This guide is about how to reduce kubernetes costs with karpenter — the practical playbook, not the marketing fluff.


What Karpenter Actually Is (And Why It Matters)

Karpenter is an open-source node autoscaler for Kubernetes. It was built by AWS, then donated to the CNCF. By July 2026, it's become the default way to manage compute for serious Kubernetes users.

But everyone misuses it.

Most people think Karpenter is just "faster Cluster Autoscaler." It's not. Cluster Autoscaler adds nodes when pods don't fit. Karpenter replaces your node group strategy entirely.

Karpenter watches for unschedulable pods. Then it provisions exactly the right instance — from any family, any size, any zone — to run them. It doesn't wait for node groups. It doesn't wait for ASGs. It just creates instances.

This is where the cost savings come from.

How to reduce kubernetes costs with karpenter isn't about squeezing 5% here and there. It's about fundamentally changing how you buy compute.


Why Your Current Setup Is Leaking Money

Let me show you what I saw at a client in March 2026. Fintech company. 150 microservices. Running on EKS with five node groups: one for general workloads, one for memory-heavy services, one for GPU inference, two "just in case" groups.

Their average node utilization? 23%.

They were paying for 77% empty compute. Every month.

This pattern is everywhere. Teams create node groups for "flexibility," then end up with stranded capacity. You can't bin-pack pods efficiently when your compute is locked into fixed instance types and fixed sizes.

Why Companies Are Leaving Kubernetes? calls out this exact problem — complexity without commensurate value. I'd argue the complexity isn't Kubernetes itself. It's the way we provision it.


Step 1: Kill Your Node Groups

The first thing you do with Karpenter: delete every node group except one tiny one for system pods.

Sounds aggressive. It is. But this is where the savings live.

When you rely on node groups, you're betting on instance types ahead of time. You guess "we'll need m6i.large and c6i.xlarge." Then your pods don't fit perfectly, and you're paying for half-empty nodes.

Karpenter doesn't guess. It provisions the exact instance your pod needs.

Here's the provisioner config I put in front of most teams:

yaml
apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
  name: default
spec:
  template:
    spec:
      requirements:
        - key: "karpenter.sh/capacity-type"
          operator: In
          values: ["spot", "on-demand"]
        - key: "node.kubernetes.io/instance-type"
          operator: In
          values:
            - "m6i.*"
            - "m7i.*"
            - "c6i.*"
            - "c7i.*"
            - "r6i.*"
      nodeClassRef:
        name: default
  limits:
    cpu: 1000
  disruption:
    consolidationPolicy: WhenUnderutilized
    expireAfter: 720h

This tells Karpenter: use any instance in the m6i, m7i, c6i, c7i, or r6i families. Try spot first, fall back to on-demand. Consolidate when nodes are underutilized.

That's it. One config replaces five node groups.


Step 2: Configure Karpenter for Spot Instances (Do This Right)

How to configure karpenter for spot instances is the single biggest cost lever you have. Spot instances can be 60-90% cheaper than on-demand. But they get reclaimed. And that scares people.

Here's my take: if you're not using spot for stateless workloads in 2026, you're paying a "I don't want to think about it" tax of about 40%.

Karpenter handles spot interruptions natively. When AWS sends the two-minute reclaim notice, Karpenter drains the node and provisions a replacement — often a different instance type — before the old one dies.

You don't need complex spot handling logic. You need to configure your workloads to handle interruption.

yaml
apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
  name: spot-primary
spec:
  template:
    spec:
      requirements:
        - key: "karpenter.sh/capacity-type"
          operator: In
          values: ["spot"]
        - key: "node.kubernetes.io/instance-type"
          operator: In
          values:
            - "m5.*"
            - "m6i.*"
            - "m7i.*"
            - "c5.*"
            - "c6i.*"
            - "c7i.*"
            - "r5.*"
            - "r6i.*"
      nodeClassRef:
        name: default
  disruption:
    consolidationPolicy: WhenUnderutilized
    expireAfter: 720h
---
apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
  name: on-demand-fallback
spec:
  template:
    spec:
      requirements:
        - key: "karpenter.sh/capacity-type"
          operator: In
          values: ["on-demand"]
        - key: "node.kubernetes.io/instance-type"
          operator: In
          values:
            - "m6i.large"
            - "m6i.xlarge"
            - "c6i.large"
            - "c6i.xlarge"
            - "r6i.large"
      nodeClassRef:
        name: default
  disruption:
    consolidationPolicy: WhenUnderutilized
    expireAfter: 168h

Two node pools. Spot first. On-demand fallback. Karpenter automatically tries spot in priority order. If spot is unavailable or gets reclaimed, the on-demand pool catches it.

This alone cut one client's compute bill by 63%. They went from $28k/month to $10.3k.


Step 3: Consolidation Is Free Money

Karpenter's consolidation feature is underrated. Here's what it does:

If you have two nodes running at 40% utilization, Karpenter can move those pods to one larger node and terminate the other. It recalculates costs — spot pricing, instance types, everything — and consolidates if it saves money.

It runs continuously. You don't trigger it. It just works.

We ran A/B tests at SIVARO for two weeks. One cluster with consolidation on, one without. The consolidation-enabled cluster used 28% fewer node-hours for the same workload. Same pods. Same traffic. Just packed tighter.


Step 4: Stop Over-Provisioning CPUs

This is where I see most teams bleed money.

You provision a pod with 2 CPU and 4GB memory. At 3AM, it uses 0.3 CPU and 1.2GB. But the node you provisioned for it can't be resized. So you're paying for unused capacity on that node forever.

Karpenter fixes this two ways.

First, it lets you use burstable instances (t3, t4g) for workloads with variable CPU. These are cheaper and Karpenter can pack them alongside other workloads.

Second, Karpenter provisions exactly sized nodes. If you have pods requesting 1.7 CPU total, it won't spin up a 4-CPU node. It'll find a 2-CPU node or even carve the exact right instance.

yaml
apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
  name: burstable-workloads
spec:
  template:
    spec:
      requirements:
        - key: "karpenter.sh/capacity-type"
          operator: In
          values: ["spot"]
        - key: "node.kubernetes.io/instance-type"
          operator: In
          values:
            - "t3.*"
            - "t4g.*"
      nodeClassRef:
        name: default
  disruption:
    consolidationPolicy: WhenUnderutilized

I put cron jobs, batch processors, and internal APIs on t3 instances. Saved 35% over m6i equivalents. For workloads that can tolerate CPU credit exhaustion, it's free lunch.


Step 5: Use Node Affinity Strategically

Step 5: Use Node Affinity Strategically

Not all pods should mix. Your ML inference pods need GPUs. Your database pods need local NVMe. Your web servers don't care.

Karpenter doesn't magically fix bad scheduling. But it makes it easier to express what you actually need.

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: inference-service
spec:
  template:
    spec:
      nodeSelector:
        karpenter.sh/capacity-type: spot
      tolerations:
        - key: "nvidia.com/gpu"
          operator: Exists

No hard-coded instance types. Karpenter looks at the pod, sees "GPU required, spot preferred," and provisions the cheapest GPU spot instance available. Today that might be a g5.xlarge. Tomorrow a p3.2xlarge. Karpenter picks.

We ran a batch ML pipeline that needed 8 A10G GPUs daily for 3 hours. With node groups, we had to reserve a p4d.24xlarge and pay for the other 21 hours. Cost: $31/hour idle.

With Karpenter, it provisions the exact number of GPU instances, runs the job, then terminates them. Cost: $4.20/hour for the actual runtime. 87% reduction.


But There's a Catch

Karpenter isn't magic. It has trade-offs.

Cold start latency. Karpenter needs 60-90 seconds to provision a new instance. If you get a traffic spike, pods will sit Pending that long. For latency-sensitive workloads, you need Pod Disruption Budgets and careful HPA configuration.

Cost visibility. You lose the mental model of "these 5 nodes are for Service X." Karpenter mixes workloads across instances. Your finance team will hate this until you implement proper cost allocation with labels.

Spot unpredictability. Yes, Karpenter handles interruptions. But if your workload can't handle any interruption (stateful databases, real-time trading), spot isn't for you. Karpenter can use on-demand for those.

I Deleted Kubernetes from 70% of Our Services in 2026 makes the case that some teams shouldn't use Kubernetes at all. I partially agree. If you have 5 services that run steady-state, a VM or container service might be cheaper. The overhead of even a well-tuned Karpenter cluster isn't zero.

Kubernetes isn't dead, you just misused it. gets it right. The tool isn't the problem. How you use it is.


Real Numbers From Real Deployments

Let me give you specific numbers from SIVARO and three clients.

SIVARO (us): 40 microservices, batch ML pipelines, real-time inference. Before Karpenter: $18.4k/month. After Karpenter with spot consolidation: $7.1k/month. Savings: 61%.

Client A (Fintech): 150 microservices, strict compliance. Couldn't use spot for production. Used Karpenter with on-demand consolidation only. Savings: 32%. From $28k to $19k.

Client B (SaaS): 80 microservices, all stateless. Full spot with multi-arch (AMD + ARM). Karpenter provisioned Graviton where possible. Savings: 68%. From $14.5k to $4.6k.

Client C (E-commerce): 200 services, variable traffic. Holiday spikes 5x normal. Used Karpenter with over-provisioning of 20% buffer. Savings: 44%. From $52k to $29k.

These are real. I can show you the bills.


Common Mistakes I Still See

Even people who "get" Karpenter make these errors.

1. Not using multiple instance families. I see teams constrain Karpenter to 3 instance types. That defeats the purpose. Give it 20 families. Karpenter knows how to pick the cheapest available.

2. Over-specifying resources. "Just in case" requests. If you request 4 CPU and use 0.5, Karpenter provisions a 4-CPU node for you. Then consolidation tries to fix it, but it's harder. Right-size your requests.

3. Ignoring interruptible workloads. If you can run on spot, run on spot. The risk is lower than you think. Karpenter handles reclaim within 2 minutes. That's faster than most pod restarts.

4. Not using ARM instances. Graviton3 and Graviton4 are 20-30% cheaper than x86 for equivalent performance. Karpenter supports multi-arch. Build ARM images. The savings are free.

5. No cost allocation. Karpenter mixes pods across nodes. If you can't attribute costs to teams, you'll have fights. Tag your pods and use Kubecost or OpenCost.


The Advanced Playbook

If you've done the basics and want more, here's what I'm doing in 2026.

Pricing-aware scheduling. Karpenter's latest versions can factor in spot price volatility. We're experimenting with a config that avoids instance types that had recent reclaim spikes.

Reserved instance blending. Karpenter can use reserved instances as a baseline, then overflow to spot. This hybrid approach gives you the best of both: RI discounts on predictable load, spot savings on variable.

Bin packing with real metrics. Instead of using pod requests, we're feeding Karpenter actual historical usage. This lets it pack far more tightly. Early results show another 15-20% reduction.

We're leaving Kubernetes is a warning I take seriously. Some teams have workloads that belong on simpler infrastructure. Karpenter doesn't fix architecture mistakes. It fixes compute waste.


How to Start Today

You don't need a migration. You can add Karpenter to an existing EKS cluster in about 30 minutes.

  1. Install Karpenter via Helm.
  2. Create one NodePool with broad instance selection.
  3. Add a taint to your existing node groups to prevent new scheduling.
  4. Watch as Karpenter slowly replaces your existing nodes with better-priced alternatives.

Don't try to do everything at once. Start with spot. Then add consolidation. Then expand instance families.

Within a week, you'll see the difference.


FAQ: How to Reduce Kubernetes Costs With Karpenter

Q: How does Karpenter compare to Cluster Autoscaler for cost?
Karpenter typically saves 30-60% over Cluster Autoscaler because it can choose cheaper instance types, support spot natively, and consolidate continuously. Cluster Autoscaler only adds nodes when pods don't fit — it can't optimize which nodes to use.

Q: Can Karpenter work with Fargate?
Technically yes, but it's not the best use case. Fargate is already serverless. Karpenter shines when you want control over instance selection. Use Fargate for tiny workloads, Karpenter for everything else.

Q: How to configure karpenter for spot instances without risking downtime?
Use a two-pool setup: spot as primary, on-demand as fallback. Add Pod Disruption Budgets to your critical services. Karpenter handles the interruption lifecycle. Test with a non-production workload first.

Q: Does Karpenter work with on-premises Kubernetes?
Yes, but it's less mature. Karpenter's cloud integrations (AWS, Azure, GCP) are production-ready. On-prem requires manual configuration and isn't as well-tested.

Q: Will Karpenter reduce my control plane costs?
Indirectly. Karpenter reduces the number of nodes you run, which can reduce control plane charges (EKS charges per cluster, not per node). The real savings are in compute.

Q: What if my workloads have strict zone affinity?
Karpenter supports topology spread constraints and zone selection. You can restrict it to specific availability zones if needed. But you lose some bin-packing efficiency.

Q: Is Karpenter worth it for small clusters?
Under 10 nodes? Probably not. The complexity of setting up Karpenter isn't worth saving $200/month. Use managed node groups or Fargate. Karpenter shines at medium to large scale.

Q: How does Karpenter handle stateful workloads?
Not well. StatefulSets with PVCs tied to specific availability zones are hard for Karpenter to optimize. You can use node selectors to pin stateful workloads to specific nodes, but you lose most cost benefits. For databases, consider separating them into a different cluster.

Q: What's the ROI timeline for Karpenter?
Most teams see a 40-60% reduction in compute costs within 2-4 weeks. Setup takes a day. Configuration tuning takes another week. Payback period is usually under 30 days.

Q: Can I use Karpenter with GKE or AKS?
Karpenter was built for AWS, but the community has ports for GCP (GKE) and Azure (AKS). They work but have fewer features. On AWS EKS, Karpenter is production gold. On other clouds, test carefully.


Final Thoughts

Final Thoughts

I've watched the Kubernetes community go through cycles. First it was "Kubernetes everywhere!" Then it was "Kubernetes is too complex!" Now it's "Maybe Kubernetes was fine, we just set it up wrong."

Why Companies Are Leaving Kubernetes? lists real reasons — cost, complexity, over-engineering. But I've seen teams turn it around by fixing one thing: how they manage compute.

Karpenter doesn't fix bad architecture. It doesn't fix microservice spaghetti. It fixes the specific problem of paying for compute you don't use.

Start with spot. Add consolidation. Expand instance families. Right-size your requests.

Your cloud bill will thank you.

— Nishaant Dixit

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