After auditing Kubernetes costs at 12 companies last year, I found the same 5 problems everywhere. The average cluster was spending 3x what it should.
Problem 1: Missing Resource Requests (saves 30-40%)
Most pods run without resource requests. Kubernetes can't bin-pack efficiently:
# BAD: No limits = every pod gets a whole node's worth of resources reserved
containers:
- name: api
image: myapp:latest
# GOOD: Right-sized limits
containers:
- name: api
image: myapp:latest
resources:
requests:
cpu: 250m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
How to find right-size values:
kubectl top pods --all-namespaces --sort-by=memory | head -20
Problem 2: Wrong Instance Types (saves 20-30%)
Everyone defaults to m5.xlarge. But most workloads are memory-bound, not CPU-bound:
- API servers: r6i (memory optimized) — 15% cheaper for same workload
- Batch jobs: Spot instances — 60-70% cheaper
- Dev/staging: t3 burstable — 40% cheaper
Problem 3: No Pod Disruption Budgets (causes overspend)
Without PDBs, autoscaler can't safely remove nodes:
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: api-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: api
Problem 4: Orphaned PVCs (hidden cost)
# Find PVCs not bound to any pod
kubectl get pvc --all-namespaces -o json | jq '.items[] | select(.status.phase=="Bound") | select(.metadata.deletionTimestamp==null) | .metadata.name'
At $0.10/GB/month for gp3, a forgotten 100GB PVC costs $10/month doing nothing.
Problem 5: No Cost Allocation Tags
Without tags, you can't track which team/service is spending what:
# Tag all namespaces with cost center
kubectl label namespace production cost-center=engineering
kubectl label namespace staging cost-center=engineering-dev
Full K8s Cost Optimization Guide
I maintain production-ready DevOps resources including K8s cost optimization playbooks at Citadel Cloud Management.
17 free cloud courses including Kubernetes: Free Courses
What's your biggest K8s cost challenge?
Top comments (0)