Skip to main content
Cloud DevOps Solutions
Get a quote Talk to an engineer

Containers and Kubernetes

Karpenter node autoscaling on EKS, without the surprises

Karpenter is an open-source Kubernetes node autoscaler that launches right-sized instances directly for pending pods and consolidates underused nodes. It is most mature on AWS and EKS. We configure NodePools, Spot strategy, disruption budgets and interruption handling so it saves money without hurting availability.

Key takeaways

  • Karpenter provisions nodes from pending pod requirements instead of scaling fixed node groups, so capacity matches the workload.
  • Its AWS provider is the most mature. Support elsewhere exists but is less established, so check before planning a multi-cloud rollout.
  • Savings depend on accurate pod resource requests. Karpenter cannot right-size nodes around requests that are wrong.
  • Consolidation and Spot are powerful and risky: disruption budgets, PodDisruptionBudgets and graceful shutdown are what make them safe.
  • Cluster Autoscaler is still a reasonable choice for stable, node-group-based clusters and for teams that value its long track record.

What teams use Karpenter for

Mixed and bursty workloads

Pods with very different CPU, memory or GPU needs get nodes that fit, rather than one instance size per node group.

Spot for stateless services

Batch, CI runners and tolerant web tiers run on Spot with fallback to on-demand when capacity is short.

Faster scale-out

Nodes are requested directly through the EC2 API when pods are pending, which often shortens the wait for capacity.

Cost clean-up

Consolidation replaces or removes underused nodes, reducing the idle capacity a static node group tends to accumulate.

Node refresh and patching

Expiry and drift detection roll nodes onto new AMIs on a schedule you control.

CI and ephemeral environments

Short-lived build and preview pods trigger nodes that disappear once the work is done.

What Karpenter is and why teams adopt it

Karpenter is a node lifecycle controller for Kubernetes. When the scheduler cannot place a pod, Karpenter looks at the pending pods’ CPU, memory, architecture, zone and other constraints, then asks the cloud for an instance that fits. When nodes sit idle or can be packed more tightly, it removes or replaces them.

The alternative many teams start with is a set of managed node groups sized by guesswork. That works until workloads diversify: one team needs memory-heavy pods, another needs GPUs, a third runs bursty CI. Karpenter replaces the question “which node group?” with “what does this pod need?”. If you are looking for Karpenter consulting, the usual drivers are an Amazon EKS bill that feels too high, slow scale-out, or the operational burden of many node groups.

Be clear about scope. Karpenter’s most mature implementation is on AWS. Other providers exist, but we recommend Karpenter primarily for EKS, and say so when a client’s platform makes another option better.

Karpenter versus Cluster Autoscaler

AspectKarpenterCluster Autoscaler
Unit of scalingIndividual instances chosen per pending podNode groups of a fixed shape
Instance selectionFlexible across families and sizesDefined per group
ConsolidationBuilt in, replaces or removes underused nodesScale-down of underused nodes
Cloud supportStrongest on AWSBroad, long-established
Operational modelNodePool and node class resourcesNode groups managed in the cloud
Risk profileMore power, more to tuneSimpler, more predictable

Neither wins everywhere. Cluster Autoscaler remains a sound choice for steady workloads, and our Kubernetes consulting is tool-neutral on this point.

How we configure it in production

NodePools and node classes

A NodePool describes what Karpenter may launch: allowed instance categories, architectures, capacity types and zones, plus limits. A node class holds AWS-specific settings such as the AMI family, subnets, security groups and the node role. Field names and API versions have changed between releases, so pin the version and follow its documentation when applying anything below.

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: general
spec:
  template:
    spec:
      nodeClassRef:
        group: karpenter.k8s.aws
        kind: EC2NodeClass
        name: default
      requirements:
        - key: karpenter.sh/capacity-type
          operator: In
          values: ["spot", "on-demand"]
        - key: kubernetes.io/arch
          operator: In
          values: ["amd64", "arm64"]
  limits:
    cpu: "400"
  disruption:
    consolidationPolicy: WhenEmptyOrUnderutilized
    budgets:
      - nodes: "10%"

The limits block is a safety net: a runaway deployment cannot provision unbounded capacity. The disruption budget caps how many nodes Karpenter may voluntarily disrupt at once.

Keep the controller off its own capacity

Run Karpenter on a small managed node group or Fargate. If it depends on nodes it launches, a misconfiguration can strand it.

Security and access

Karpenter needs permission to create and terminate instances, so scope its IAM role tightly, use IAM roles for service accounts or EKS Pod Identity, and restrict which subnets, security groups and AMIs the node class can reference. Node roles should carry only what nodes need. Pin AMIs deliberately or use an aliased family so patching is controlled; drift detection can then roll nodes when the AMI changes.

Cost and capacity

Savings come from three levers: better packing, Spot capacity and removing idle nodes. All depend on honest pod requests. We compare requests with real usage using Prometheus and Grafana before tuning anything, because inflated requests make Karpenter provision generously. Our EKS cost optimisation guide covers the surrounding levers, such as commitments and Graviton. Spot is for interruption-tolerant pods only, and diversifying instance types improves the odds of getting capacity.

Making workloads Karpenter-friendly

Karpenter schedules what you ask for, so the pod specification matters more than the autoscaler. Set CPU and memory requests from observed usage, keep memory limits close to requests to avoid surprises, and use topology spread constraints so replicas land across zones. Workloads that cannot be interrupted can use the karpenter.sh/do-not-disrupt annotation, though overusing it defeats consolidation. Where you scale pods on queue depth or events, pair KEDA or the Horizontal Pod Autoscaler with Karpenter so replica count and node count follow demand together.

Day-2 operations

  • Upgrades: upgrade the controller and its CRDs deliberately, reading release notes for API changes, in a non-production cluster first.
  • Monitoring: alert on pending pods, failed launches, and NodeClaims that never become ready.
  • Disruption control: use budgets and maintenance windows so consolidation does not coincide with a release or peak traffic.
  • Interruption handling: confirm Spot interruption notices reach the controller and that pods shut down within the grace period.

Common failure modes

  • Missing PodDisruptionBudgets, so consolidation evicts too many replicas at once.
  • No limits on a NodePool, allowing a bug to scale costs.
  • Pods without requests, leading to poor packing and noisy neighbours.
  • A single instance family, which fails when that Spot pool dries up.
  • DaemonSet overhead ignored, so small instances waste a large share on system pods.

When not to use Karpenter

Skip it if you are not on AWS and your provider is immature, if your cluster is small and static, or if you would rather AWS manage compute through EKS Auto Mode. If you want a measured view of your own node costs first, run the EKS cost calculator or ask us to review your cluster through our AWS EKS consulting service.

Official documentation: karpenter.sh

How we work with Karpenter

  1. 01

    Baseline the cluster

    We review pod requests against real usage, node group layout, existing autoscaling and current spend in your own account.

  2. 02

    Design NodePools

    We define requirements for instance families, architectures, zones and capacity types, plus limits so a mistake cannot scale without bound.

  3. 03

    Prepare workloads

    Pod disruption budgets, topology spread, graceful termination and correct requests are fixed before Karpenter can move pods.

  4. 04

    Run it alongside existing groups

    Karpenter starts with one workload class while a small managed node group keeps system pods stable.

  5. 05

    Tune disruption

    We set consolidation policy, budgets and maintenance windows, then watch interruption and eviction behaviour.

  6. 06

    Monitor and hand over

    Dashboards and alerts cover pending pods, provisioning failures and cost per NodePool, with a runbook for your team.

Karpenter compared with the alternatives

We recommend the tool that fits your team, not the one we know best. Here is when each option makes sense.

OptionChoose it when
KarpenterKarpenter is an open-source Kubernetes node autoscaler that launches right-sized instances directly for pending pods and consolidates underused nodes.
Cluster AutoscalerChoose it when you run on a cloud or distribution where Karpenter support is weak, when you prefer predictable fixed node groups, or when your team already operates it well. It works on node groups rather than individual instances.
EKS Auto ModeChoose it when you want AWS to manage nodes, including compute scaling, and accept less control over node configuration. Compare feature scope and pricing for your case.
FargateChoose it for a small number of pods where you do not want to manage nodes at all, accepting its per-pod model and limits.
Fixed node groups with scheduled scalingChoose them when load is predictable and flat. The simplest option is often enough.

Tools we use alongside Karpenter

Amazon EKSAmazon EC2 SpotCluster AutoscalerKEDAHorizontal Pod AutoscalerPrometheusGrafanaTerraformHelmArgoCDAWS Node Termination HandlerAmazon SQS

Frequently asked questions

What is the difference between Karpenter and Cluster Autoscaler?
Cluster Autoscaler adjusts the size of predefined node groups, so each group has a fixed instance shape. Karpenter reads pending pods and launches instances that fit them, then consolidates idle capacity. Karpenter is more flexible on mixed workloads, while Cluster Autoscaler is older, widely supported and simpler to reason about.
Does Karpenter only work on AWS?
Karpenter was created by AWS and its AWS provider is the most mature. The core project has been made vendor-neutral, and providers for other clouds exist, but their maturity varies. For AKS or GKE, evaluate the provider's current status or use the platform's own autoscaling before committing.
Is Karpenter safe to use with Spot instances?
It can be, for workloads that tolerate interruption. Karpenter handles Spot interruption notices by draining and replacing nodes, and can fall back to on-demand. Stateful or singleton workloads should stay on on-demand. Pod disruption budgets and graceful shutdown must be in place first.
Will Karpenter reduce our EKS bill?
Often, but not automatically. It helps most when node groups are oversized or poorly packed. If pod requests are inflated, Karpenter faithfully provisions for the inflated numbers. Right-sizing requests and using consolidation sensibly is where real savings come from. Try our [EKS cost calculator](/tools/eks-cost-calculator/) to size the opportunity.
Can Karpenter run its own controller on nodes it manages?
It should not. Run the controller on a small managed node group or on Fargate so it never depends on capacity it provisions. Otherwise a bad configuration could leave you unable to start the component that fixes it.
Does Karpenter replace the Horizontal Pod Autoscaler?
No. The HPA changes the number of pod replicas, and Karpenter provides the nodes those pods need. They work together: HPA or KEDA creates pending pods, then Karpenter finds capacity for them.

Talk to an engineer about Karpenter

Book a free 30-minute call. We review your current setup and tell you honestly whether and how we can help.

Written by Saddique Khan, DevOps / SRE / Cloud Consultant Engineer. Last updated 2026-10-09.