Amazon EKS — Karpenter

1 minute read

Karpenter

Karpenter is AWS’s next-generation node provisioner for Kubernetes. Unlike Cluster Autoscaler (which works with ASGs), Karpenter directly launches right-sized EC2 instances.


Karpenter vs Cluster Autoscaler

Feature Cluster Autoscaler Karpenter
Node selection From ASG templates Right-sized per workload
Speed 1-3 minutes 30-60 seconds
Instance types Fixed per node group Flexible (many types)
Consolidation Limited Automatic
Configuration Per node group Per NodePool
AWS native Uses ASGs Directly launches EC2

Install Karpenter

# Install with Helm
$ helm repo add karpenter https://charts.karpenter.sh
$ helm install karpenter karpenter/karpenter \
    --namespace karpenter --create-namespace \
    --set clusterName=demo \
    --set clusterEndpoint=$(aws eks describe-cluster --name demo --query 'cluster.endpoint' --output text)

NodePool Configuration

apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
  name: default
spec:
  template:
    spec:
      requirements:
        - key: kubernetes.io/arch
          operator: In
          values: ["amd64", "arm64"]
        - key: karpenter.sh/capacity-type
          operator: In
          values: ["on-demand", "spot"]
        - key: karpenter.k8s.aws/instance-category
          operator: In
          values: ["c", "m", "r"]
        - key: karpenter.k8s.aws/instance-generation
          operator: Gt
          values: ["4"]
      nodeClassRef:
        name: default
  limits:
    cpu: 1000       # Max 1000 vCPU total
    memory: 2000Gi  # Max 2000 Gi total
  disruption:
    consolidationPolicy: WhenUnderutilized
    expireAfter: 720h   # Replace nodes after 30 days

How Karpenter Picks Instances

Pod needs: 2 CPU, 4Gi memory
┌────────────────────────────────────────────┐
│  Karpenter evaluates:                      │
│  • m5.large  (2 CPU, 8Gi)  → ✅ fits      │
│  • c5.large  (2 CPU, 4Gi)  → ✅ fits      │
│  • t3.medium (2 CPU, 4Gi)  → ✅ fits      │
│                                            │
│  Picks cheapest that fits: t3.medium       │
│  (or c5.large Spot if cheaper)             │
└────────────────────────────────────────────┘

Consolidation

Karpenter automatically consolidates workloads:

Before:  3 nodes at 30% utilization each
After:   1 node at 90% utilization
Savings: 66% fewer nodes

Common Mistakes

Mistake Impact
Running both Karpenter and Cluster Autoscaler They conflict
No CPU/memory limits on NodePool Unbounded scaling (cost risk)
Not allowing Spot instances Missing 60-90% savings
Too restrictive instance requirements Fewer options, higher cost

What’s Next?

Event-driven scaling: KEDA.