Most Kubernetes bills are not expensive because of traffic, they are expensive because of slack. Over-provisioned requests, idle nodes, and forgotten volumes quietly compound. FinOps is engineering the slack out without trading away headroom you actually need.
Measure before you cut
You cannot optimize what you cannot attribute. OpenCost (or Kubecost) breaks spend down by namespace, workload, and label:
# cost by namespace over the last 7 days
kubectl cost namespace --window 7d --show-efficiency
# find the workloads requesting far more than they use
kubectl cost pod --window 7d --show-cpu --show-efficiency \
| sort -k4 -nThe levers that actually move the bill
Right-size requests from real usage (VPA recommendations, not vibes)
Run interruptible workloads on spot with a graceful-drain handler
Scale to zero off-hours for dev and preview environments
Reclaim orphaned PVs, old snapshots, and idle load balancers
Consolidate nodes with Karpenter so you pay for bin-packed capacity
Right-sizing is usually the biggest single win. Pull the numbers, then set requests near the real p95 with a little headroom:
quantile_over_time(0.95,
rate(container_cpu_usage_seconds_total{namespace="payments"}[5m])[7d:5m]
)Guardrails so savings do not become incidents
Keep a PodDisruptionBudget on everything you consolidate
Never right-size below a safe floor for latency-sensitive services
Alert on efficiency dropping AND on throttling rising
Make cost a dashboard the whole team sees, not a quarterly surprise
Cheap and unreliable is not a win. FinOps is removing waste, not removing safety margin.
Attribute, right-size, and automate the reclamation of idle resources. Done well, FinOps is not austerity, it is just good platform engineering with the price tag turned on.



