cost

8 Kubernetes Cost Leaks Small Teams Miss

Half of teams report their costs went up after adopting Kubernetes (CNCF FinOps microsurvey), with over-provisioning cited as the top cause. That matches every complaint thread: "our observability costs are destroying our cloud budget," "$80K/month just for APM/logging/metrics." The pattern is consistent: the cluster itself isn't the leak — the defaults around it are.

Here are the eight leaks I'd check first, roughly in order of typical savings.

1. Resource requests copied from tutorials

Requests reserve capacity whether you use it or not, and the cluster autoscaler buys nodes to satisfy requests, not usage. Most small-team clusters request 3–5× what they consume, because every deployment inherited 500m / 512Mi from a blog post in 2022.

Fix: measure a week of real usage per workload, reset requests to P95 + headroom. Tools: OpenCost, kubectl top, Goldilocks/VPA in recommendation mode. This alone is often 30–50% of compute.

2. Log ingestion with no retention policy

Observability pricing is per-GB-ingested and per-GB-retained. Default behavior — every pod's stdout, debug level, shipped to a SaaS, kept forever — is how a 10-person company gets a five-figure logging bill.

Fix: drop debug logs at the collector (Fluent Bit/OTel Collector filter), sample high-volume noise, set 7–30 day retention with cold archive to object storage for compliance. Bills routinely drop 60–80%.

3. Non-prod running nights and weekends

Staging and dev clusters at full size, 168 hours a week, used maybe 50. That's paying for 3× the environment you use.

Fix: scale non-prod to zero (or minimum) outside working hours. A CronJob or your cloud's scheduler is enough; kube-downscaler exists precisely for this.

4. One load balancer per service

Every Service type: LoadBalancer is a billed cloud load balancer. Ten services = ten LBs = real money for zero benefit.

Fix: one ingress controller behind one LB, route by host/path. This is a one-day change.

5. Cross-AZ traffic you never asked for

Kubernetes spreads pods across zones, then services route across zones by default, and clouds bill every cross-AZ gigabyte. Chatty microservices + 3 AZs = a silent network line item that grows with traffic.

Fix: topology-aware routing / internalTrafficPolicy, colocate chatty services, and check whether every environment truly needs 3-AZ HA (staging doesn't).

6. Orphaned volumes, IPs, and snapshots

Deleting workloads doesn't always delete their PersistentVolumes (depends on reclaim policy), and never deletes old snapshots or static IPs. These accumulate for years.

Fix: quarterly sweep: unattached volumes, unassociated IPs, snapshots older than policy. Usually a few hundred/month found in ten minutes.

7. Zero spot/preemptible usage

Stateless, replicated workloads — the exact thing Kubernetes is good at rescheduling — are ideal for spot instances at 60–90% discount. Small teams avoid them out of fear; the fear is mostly outdated for fault-tolerant workloads.

Fix: a spot node pool for stateless/batch/CI workloads with on-demand fallback (Karpenter or managed node groups make this nearly trivial). Keep databases on on-demand.

8. Nobody owns the number

The meta-leak. CNCF's survey found 45% blame "lack of awareness/ownership" for overspend. If cost is nobody's metric, every leak above regenerates within a quarter of being fixed.

Fix: install OpenCost (free, CNCF), put cost-per-namespace on a dashboard the team actually sees, review it monthly in an existing meeting. Visibility changes behavior more than any optimization does.

The order I'd run this as an audit

  1. OpenCost + one week of data (leak 8 enables seeing 1–7).
  2. Requests vs. usage report → resize (biggest single win).
  3. Logging ingestion/retention review (second biggest, fastest to fix).
  4. LB/ingress consolidation and orphan sweep (quick wins).
  5. Non-prod schedule + spot pools (structural wins).

A realistic outcome for a small cluster that's never been through this: 30–60% off the total bill, most of it in the first two steps, with no architecture changes and no new paid tools.

The uncomfortable truth: none of this is advanced. It's unglamorous hygiene that nobody owns because everyone is shipping features. Which is exactly why it's worth an afternoon.

The cost section is one of seven categories in the free readiness scorecard at kestrion.dev.

Score your cluster (free, in-browser) →

One field-tested pattern per week, by email — subscribe here. More notes in the writing index.