Kubernetes Cost Optimization: Karpenter Best Practices You Can’t Ignore in 2026

I deleted Kubernetes from 70%% of our services last year. Saved $416K. Engineers finally stopped complaining. But here's the thing: Kubernetes isn't dead — ...

kubernetes cost optimization karpenter best practices can’t ignore
By Nishaant Dixit
Kubernetes Cost Optimization: Karpenter Best Practices You Can’t Ignore in 2026

Kubernetes Cost Optimization: Karpenter Best Practices You Can’t Ignore in 2026

Stop 3AM Pages

Free K8s Audit

Get Started →
Kubernetes Cost Optimization: Karpenter Best Practices You Can’t Ignore in 2026

I deleted Kubernetes from 70% of our services last year. Saved $416K. Engineers finally stopped complaining.

But here's the thing: Kubernetes isn't dead — most of us just misused it.

I'm Nishaant Dixit, founder of SIVARO. We build data infrastructure and production AI systems. And yes, we still run Kubernetes. But we run it differently now. The difference? Karpenter.

Let me show you what actually works.


Why Everyone's Talking About Leaving Kubernetes

Walk into any engineering org in 2026 and you'll hear the same complaint: "Kubernetes is too expensive."

Why Companies Are Leaving Kubernetes? isn't clickbait — it's real. Companies are paying AWS $200K/month just for EC2 overhead they don't need. The horror stories are everywhere.

Ona.com wrote about leaving Kubernetes because their cluster costs were eating 40% of their infrastructure budget. Sound familiar?

But here's the contrarian take: most of these companies never tuned their cluster right. They threw nodes at problems. They used Cluster Autoscaler. They didn't understand bin-packing.

And they definitely didn't know Karpenter.


What Actually Happened When I Deleted Kubernetes

I deleted Kubernetes from 70% of our services in 2026.

We were running 47 services. 33 of them didn't need orchestration. They were batch jobs, cron workers, simple APIs. We moved them to ECS Fargate and Lambda.

Result: $416K annual savings. Engineers stopped hating me.

But the remaining 30% — our data pipelines, AI inference servers, and streaming systems — those stayed on Kubernetes. And for those, Karpenter became our secret weapon.

Kubernetes isn't dead, you just misused it. That's the truth. Use it for what it's good at: complex, stateful, or bursty workloads. Not for your CRUD API that gets 50 requests per minute.


Karpenter vs Cluster Autoscaler Cost Comparison: The Numbers That Matter

Let's settle this debate once and for all.

Cluster Autoscaler works by checking pending pods every 10 seconds. If pods can't schedule, it adds a node. But only from a predefined node group. And it waits for instances to spin up. And it can't mix instance types.

Karpenter watches the Kubernetes scheduler's API directly. It provisions instances in sub-seconds. It picks the cheapest instance type that fits your pod constraints. And it bins pods across optimal instance types.

Here's real numbers from our production cluster:

Feature Cluster Autoscaler Karpenter
Average node launch time 3-5 minutes 45 seconds
Cost per node-hour (savings plan adjusted) $0.45 $0.31
Over-provisioning waste 27% 8%
Instance type diversity Limited to node group Any EC2 type

The karpenter vs cluster autoscaler cost comparison isn't close. We saved 31% on compute costs just by switching.

But the real savings come from Karpenter's consolidation. When utilization drops, Karpenter drains nodes and terminates them. Cluster Autoscaler? It waits. And you pay for idle.


Kubernetes Cost Optimization Karpenter Best Practices: What We Learned

After 18 months running Karpenter in production across 12 clusters, here's what works.

1. Stop Using Node Groups for Everything

Most people create node groups for GPU, CPU, memory-optimized. Then they try to bin-pack across them. It's a mess.

Karpenter doesn't need node groups. It provisions instances on the fly. You define provisioner specs — that's it.

yaml
apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
  name: general
spec:
  template:
    spec:
      requirements:
        - key: "karpenter.k8s.aws/instance-category"
          operator: In
          values: ["c", "m", "r"]
        - key: "karpenter.k8s.aws/instance-generation"
          operator: Gt
          values: ["4"]
        - key: "kubernetes.io/arch"
          operator: In
          values: ["amd64", "arm64"]
      nodeClassRef:
        name: default
  limits:
    cpu: 1000
  disruption:
    consolidationPolicy: WhenEmptyOrUnderutilized
    consolidateAfter: 30s

This one provisioner covers 90% of our workloads. It picks C5, M6i, R7g — whatever fits cheapest.

2. Use Spot Instances Like a Pro

Karpenter excels at spot instance management. But you need to be smart about it.

yaml
spec:
  requirements:
    - key: "karpenter.sh/capacity-type"
      operator: In
      values: ["spot", "on-demand"]
  disruption:
    budgets:
      - nodes: 20%

We run 70% spot. Karpenter automatically falls back to on-demand when spot isn't available. But here's the trick: never use spot alone. If you specify only spot, Karpenter will block on-demand fallback. Pods get stuck.

We added consolidateAfter: 30s so Karpenter aggressively swaps cheaper spot instances into the cluster. It checks every 30 seconds if a cheaper spot instance could replace an on-demand node. If yes, it drains and replaces.

Real result: $18K/month → $5.2K/month for AI inference workloads.

3. Bin-Packing Without the Headaches

The biggest waste in Kubernetes is pod scheduling fragmentation. You've got 20 pods scattered across 15 nodes, each running at 15% utilization.

Karpenter's bin-packing is automatic, but only if you configure it right.

yaml
spec:
  limits:
    cpu: 500
    memory: 1000Gi
  disruption:
    consolidationPolicy: WhenEmptyOrUnderutilized
    consolidateAfter: 30s

The consolidation policy does the heavy lifting. When utilization drops below thresholds, Karpenter drains nodes and reschedules pods onto fewer instances.

My advice: Set consolidateAfter between 30s and 2m. Any longer and you're paying for idle. Any shorter and you get thrashing during rolling updates.

4. Don't Forget About Scheduling Constraints

Karpenter can't fix bad scheduling. If you use nodeSelector with specific instance types, you're sabotaging yourself.

Instead, use topology spread constraints:

yaml
topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: "topology.kubernetes.io/zone"
    whenUnsatisfiable: ScheduleAnyway
    labelSelector:
      matchLabels:
        app: myapp

This spreads pods across availability zones but doesn't force specific instance types. Karpenter picks the cheapest instance in each zone.

5. Right-Size Your Pod Requests

This is the boring answer, but it's the most important one.

We audited our cluster and found 60% of pods had CPU requests 4x higher than actual usage. Developers set requests: 500m for a service that uses 120m. Classic behavior.

Karpenter provisions nodes based on pod requests, not actual usage. So if you over-request, you over-provision.

We implemented VPA (Vertical Pod Autoscaler) across all namespaces:

yaml
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: my-app-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: my-app
  updatePolicy:
    updateMode: "Auto"
  resourcePolicy:
    containerPolicies:
      - containerName: '*'
        minAllowed:
          cpu: 100m
          memory: 100Mi
        maxAllowed:
          cpu: 2
          memory: 4Gi

VPA adjusted requests downward over 3 weeks. Our node count dropped from 47 to 31. Cost savings: $4,100/month.

6. Use Node Templates for Cost Control

Different workloads have different cost profiles. You shouldn't run your CI runners on the same nodes as your production database.

yaml
apiVersion: karpenter.k8s.aws/v1beta1
kind: EC2NodeClass
metadata:
  name: ci-runners
spec:
  amiFamily: Bottlerocket
  subnetSelectorTerms:
    - tags:
        karpenter.sh/discovery: "production"
  securityGroupSelectorTerms:
    - tags:
        karpenter.sh/discovery: "production"
  instanceProfile: "KarpenterNodeInstanceProfile-prod"
  blockDeviceMappings:
    - deviceName: /dev/xvda
      ebs:
        volumeSize: 100Gi
        volumeType: gp3
  userData: |
    [settings.kubernetes]
    kube-api-qps = 10
    kube-api-burst = 20

For CI runners, we use smaller instance types (c7g.medium), gp3 volumes, and aggressive consolidation. CI jobs run 8 minutes average. No reason to keep nodes alive afterward.


How to Reduce Kubernetes Costs with Karpenter: Step-by-Step

How to Reduce Kubernetes Costs with Karpenter: Step-by-Step

If you're migrating today, here's the exact plan.

Phase 1: Audit (Week 1)

Pull your node utilization metrics. Use kubectl top nodes and kubectl describe node. Look for nodes with <50% CPU or memory utilization.

If you have more than 20% idle capacity, you're a candidate.

Phase 2: Install Karpenter (Week 2)

bash
# Add Helm repo
helm repo add karpenter https://charts.karpenter.sh
helm repo update

# Install
helm upgrade --install karpenter oci://public.ecr.aws/karpenter/karpenter   --namespace karpenter   --create-namespace   --set "settings.aws.defaultInstanceProfile=KarpenterNodeInstanceProfile"   --set "settings.aws.clusterName=my-cluster"   --set "settings.aws.interruptionQueueName=my-cluster"   --set "controller.resources.requests.cpu=0.1"   --set "controller.resources.requests.memory=256Mi"   --wait

Keep your existing node groups for now. Let Karpenter provision alongside them.

Phase 3: Shift Workloads (Week 3-4)

Add pod annotations to move workloads to Karpenter-managed nodes:

yaml
spec:
  template:
    metadata:
      annotations:
        karpenter.sh/do-not-disrupt: "true"

Taint old node groups. Gradually drain them.

Phase 4: Optimize (Month 2-3)

Enable consolidation. Set budgets. Implement VPA. Watch your bill drop.


The Budget Trick Nobody Talks About

Karpenter has a budgets feature that prevents disruption during deployment windows.

yaml
disruption:
  budgets:
    - nodes: "20%"
      duration: 6h
      schedule: "0 6 * * *"

We use this to block consolidation during business hours. No one wants a pod evicted during peak traffic.

But here's the insight: set different budgets for different times. During peak (10am-4pm), allow only 10% disruption. Overnight, allow 50%.

This is how you how to reduce kubernetes costs with karpenter without sacrificing stability.


When Karpenter Isn't Enough

Let me be honest. Karpenter fixes node provisioning, but it doesn't fix bad architecture.

If you're running 50 microservices that each need 2GB of memory and 1 CPU because of bloated dependencies, Karpenter can't save you. You need to refactor.

Also, Karpenter doesn't handle:

  • GPU workload pricing — NVIDIA GPUs are expensive regardless of how well you bin-pack
  • Data egress costs — cross-zone traffic can kill your bill
  • Storage costs — EBS and EFS aren't affected by Karpenter

For GPU workloads, we moved to a dedicated Karpenter provisioner that only uses spot G5 instances. Saved 60% compared to on-demand.


FAQ

Is Karpenter free?

Yes. Karpenter is open-source. You pay only for the EC2 instances it provisions. The controller runs on your cluster for pennies.

Can I use Karpenter with EKS Anywhere?

No. Karpenter is designed for AWS EC2. For on-prem, look at Cluster Autoscaler or Hive.

Does Karpenter work with Fargate?

No. Fargate manages nodes for you. Karpenter is for EC2. Use Fargate for simple workloads, Karpenter for complex ones.

How long does migration take?

We migrated 3 clusters in 2 weeks. One cluster per week. The delay is mostly testing and monitoring.

What's the biggest mistake people make?

Forgetting to set consolidationPolicy. Without it, Karpenter provisions aggressively but never downsizes. You'll see costs spike.

Can I run Karpenter alongside Cluster Autoscaler?

Not recommended. They'll fight over nodes. Cluster Autoscaler will terminate nodes Karpenter just provisioned. Pick one.

Does Karpenter support ARM?

Yes. And it's worth it. Graviton instances cost 20% less than x86. We moved 40% of our nodes to ARM.

What about multi-region?

Karpenter works per-cluster. For multi-region, run separate Karpenter instances. Our clients run 3-4 clusters across regions.


The Real Bottom Line

The Real Bottom Line

I spent 2024-2025 watching companies panic about Kubernetes costs. They'd blame the tool, write blog posts about leaving, and move to something worse.

Kubernetes isn't dead, you just misused it. The mis-use was never using Karpenter.

kubernetes cost optimization karpenter best practices aren't theoretical. They're real. We saved $9,800/month on one cluster alone. Our AI inference costs dropped 40%.

The companies that are leaving Kubernetes? They never optimized in the first place. They installed Cluster Autoscaler, set up some node groups, and called it done.

Don't be that company.

kubernetes cost optimization karpenter best practices start with admitting you've been over-provisioning. Then installing Karpenter. Then refusing to settle for 40% cluster utilization.

Three years from now, Karpenter will be the default. Cluster Autoscaler will be a footnote. Get ahead of it.


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