Amazon EKS — Karpenter
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.