The call came on a Tuesday afternoon. Finance had flagged another unexplained spike in our AWS bill — $40K higher than the previous month, no obvious cause. Our CTO wanted answers by end of day.
We started where everyone starts: kubectl get namespaces. The output was longer than expected. Much longer.
What We Found
We had 23 namespaces nobody could explain.
Not "nobody remembered creating" — we could trace most of them back to specific PRs, specific engineers, specific features. The problem was that the features had shipped, the PRs had merged, the sprints had ended. But the environments hadn't been deleted. They were just... running. Quietly consuming compute, memory, storage, and money.
A typical idle environment in our cluster looked like this:
- A Postgres 14 StatefulSet with a 50Gi PVC
- Two or three replicated API services
- A load balancer with a public IP
- Redis for session caching
Nothing exotic. Nothing obviously wasteful. Just a full staging stack that nobody was using.
Each one was costing us between $180 and $250 per month.
Twenty-three of them.
According to Flexera's 2025 State of the Cloud report, organizations waste up to 32% of their cloud budget on idle and overprovisioned resources. We were a data point in that statistic.
How They Got There
The honest answer: no process, no ownership, and optimistic assumptions.
When an engineer spun up a staging environment for a feature branch, the expectation was always that someone would clean it up when the branch merged. That someone was never specified. In practice, it was nobody.
Senior engineers assumed junior engineers would delete theirs. Junior engineers assumed the environments would expire automatically. Nobody had written down who owned cleanup. It wasn't in the PR template. It wasn't in the offboarding checklist. It wasn't anywhere.
This isn't a people problem. It's an infrastructure design problem. Manual cleanup relies on humans remembering to do a thing they have no immediate incentive to do, after the work they actually cared about is finished.
What Idle Actually Costs
Let's be specific, because "cloud waste" is easy to wave away as someone else's problem.
A Postgres StatefulSet on EKS with a 50Gi GP2 volume runs roughly $40/mo in storage alone. Add compute for the database pod, two API replicas, a Redis instance, and the load balancer's hourly charge — you're at $180/mo on the conservative end, $250/mo if the services have any memory headroom built in.
Multiply by 23.
That's between $4,140 and $5,750 per month. Gone. Not to any business purpose. Not to any engineer's productivity. Just gone.
What We Did
We built idle detection into our Kubernetes Operator.
The logic is straightforward: if a namespace has received zero inbound traffic and had zero new deployments for 48 consecutive hours, it's flagged as idle. The system surfaces it in our internal dashboard with an estimated monthly cost and a one-click archive option. Auto-shutdown is configurable for environments marked as non-production.
This is now part of Fortem — the IDP we built after running into this problem (and several others like it).
In the first month after we deployed idle detection, we identified all 23 abandoned environments. We archived 21 of them. Two turned out to be actively used by contractors who hadn't told anyone — good to know.
The Result
$4,200/month recovered. Not from switching cloud providers. Not from negotiating reserved instances. Just from finding and deleting environments nobody was using.
The bigger shift was cultural. Once engineers could see that idle environments cost real money — and that the system would flag it automatically — cleanup started happening proactively. The dashboard made the invisible visible.
We still spin up environments on demand. We still use short-lived namespaces for feature branches. The difference is that now we actually clean them up.
If you're running Kubernetes and don't have idle detection in place, run kubectl get namespaces and count how many you can't immediately explain. The number is probably higher than you think.
We built the tooling to fix this into Fortem — a self-hosted Kubernetes IDP. Free tier available.