Kubernetes Cost Optimization: What Your GKE or EKS Bill Is Hiding
Published: 2026-05-20
Author: Saascutters
Read time: 7 minutes
Keywords: Kubernetes cost optimization, GKE cost reduction, EKS cost, K8s FinOps, container cost management
Kubernetes is powerful, portable, and — if left unmanaged — surprisingly expensive. The abstraction layers hide cost in ways that traditional VM monitoring does not capture. A single misconfigured autoscaling policy or an oversized default node pool can double your compute bill without anyone noticing.
Here is what we look for in every Kubernetes audit.
1. Rightsize your node pools
Node pools are the foundation of your K8s cost. Check the resource utilization of every node pool over the last 30 days:
- CPU average under 20%: over-provisioned
- Memory average under 30%: over-provisioned
- Nodes with zero running pods: idle and wasteful
The fix is not always to downgrade instances. Sometimes the right answer is to split workloads into two node pools: one for bursty production workloads and one for steady-state background jobs. The background pool can run on smaller, cheaper instances.
2. Fix resource requests and limits
Without resource requests, the Kubernetes scheduler places pods randomly. Without limits, a single pod can consume an entire node's resources. Both scenarios lead to over-provisioning.
Audit every namespace:
kubectl top pods --all-namespaces
Compare actual usage to requests and limits in your deployments. If requests are 4x higher than actual usage, lower them. If limits are missing, add them. This one exercise often reveals 30–40% recoverable compute.
3. Audit autoscaling configuration
Horizontal Pod Autoscaler (HPA) and Cluster Autoscaler are powerful when tuned correctly. Common misconfigurations:
- HPA target too low: Constant scaling up and down creates churn and instability
- HPA target too high: No headroom for spikes, leading to outages
- Cluster Autoscaler scale-down delay too long: Nodes stay alive for 10+ minutes after pods terminate
Set HPA target CPU to 60–70%. Set Cluster Autoscaler scale-down-delay-after-add to 2 minutes for dev environments and 5 minutes for production.
4. Use spot/preemptible instances for non-critical workloads
AWS Spot, GCP Preemptible, and Azure Spot instances cost 60–90% less than on-demand. They are perfect for:
- CI/CD runners
- Batch processing jobs
- Dev and staging environments
- Stateless microservices that can tolerate interruption
One client moved 70% of their staging workload to Spot instances. Monthly savings: $8,400.
5. Review persistent volumes
Persistent volumes are easy to create and hard to delete. Run:
kubectl get pv
Check the RECLAIM POLICY. If it is Retain, deleted PVCs leave orphaned PVs behind. These continue billing until manually removed. One audit found 47 orphaned PVs across three clusters, costing $3,200 per month.
6. Evaluate your ingress controller
NGINX Ingress, Traefik, and Istio all handle traffic differently. Some create a load balancer per service. Others share one load balancer across many services. If your cloud bill shows 20+ load balancers for a single cluster, your ingress controller is likely creating one per service. Switch to a shared ingress model.
7. Monitor unused namespaces
Namespaces created for experiments, POCs, or departed teams often persist with running pods. Run:
kubectl get namespaces
For each namespace, check if any pods are running and whether the namespace has been active in the last 30 days. Delete unused namespaces. Archive the manifests first if you think you might need them later.
When to bring in help
Kubernetes cost optimization requires platform engineering expertise and access to production clusters. If your K8s compute bill is over $25,000 per month, an internal audit will take two to three weeks. Saascutters runs K8s cost audits across GKE, EKS, and AKS. We find the waste, tune the configurations, and verify savings against your prior invoices. Thirty percent of verified first-year savings. No retainer. Request a K8s audit →