← Back to Blog

May 05, 2026

· 5 min read

How We Cut a Kubernetes Bill 93% and Saved a Customer Thousands

Sean O'Dea

Sean O'Dea

@sean.odea

Quick Answer

A client was paying enterprise-platform prices for Kubernetes their workload didn't justify. We moved them to two Hetzner boxes and Coolify, cut the bill 93%, kept everything they actually used.

A client paid enterprise prices for managed Kubernetes they barely used. Ten apps, real product, real users — and most of it was idling. We moved them to two Hetzner boxes running Coolify. Bill dropped 93%. Saved them thousands a year. Nothing they actually used got cut.

The bill kept climbing

The setup looked sensible on paper. Managed Kubernetes, managed Postgres, managed Redis, the whole platform. Ten web apps. A real-time product with WebSockets. Queue workers, search, video transcoding. None of it fake. The product was live and people used it.

Then I looked at the bill. Climbing every month.

So I looked at what was actually running. Most pods sat at one replica. The autoscaler almost never fired. Load balancers were sitting in front of services with a single backend. The whole "enterprise" stack was idling 90% of the day, and the client was paying for the idle.

This is the part nobody likes to admit. The infrastructure was right for a company three sizes bigger. They were buying for traffic that hadn't shown up yet, and might never show up in that shape.

You aren't gonna need it — applies to hosting too

Developers know the rule: you aren't gonna need it (YAGNI). Don't need it yet, don't build it yet. We're disciplined about it in code. We're soft about it with infrastructure.

Kubernetes is a great tool. I'm not anti-k8s. But you don't reach for a 12-node orchestrator when you've got ten apps that mostly sleep. That's a comfort blanket with a price tag.

What we moved them to

Two Hetzner CX22 boxes. Cheap, EU region, 2 vCPU and 4GB RAM each. 20TB of egress included — managed platforms charge per gigabyte, and that bill adds up fast. Private network between the boxes, free.

On top of those boxes: Coolify. Open source, self-hosted, gives you a Heroku-style developer experience without Kubernetes underneath. Git push deploys. Let's Encrypt SSL handled. Env management, rollbacks, scheduled backups. Runs on Docker.

That last part matters more than people expect. Most teams that got stuck on managed Kubernetes got stuck because of the workflow, not the orchestration. Coolify gives the workflow back.

Box 1 — apps

  • Coolify managing deploys, SSL, env, backups

  • Traefik out front, automatic Let's Encrypt

  • 10 apps: Laravel APIs, Vue frontends, admin panels

  • Three queue workers and a scheduler for the main app

  • Demo environments

Box 2 — data

  • Postgres, eight databases on it

  • Redis for cache, queues, WebSocket state

  • Typesense for search

  • Soketi for WebSockets

  • Backup target

Both boxes talk over Hetzner's private network. Database and cache traffic never touches the public internet. Good for security. Also good for egress costs.

Where the cuts came from

  • Kubernetes control plane — was bundled and expensive; now gone

  • App workloads (10 apps + workers) — was per-pod billing; now included in the CX22 box

  • Managed Postgres — was a platform DB charge; now self-hosted, $0

  • Managed Redis — was a platform cache charge; now self-hosted, $0

  • Load balancer — was platform LB charges; now Traefik, $0

  • Backups — was a platform add-on; now Coolify → S3, cheap

  • Hetzner servers (2× CX22) — small flat monthly fee

  • Domains, S3 storage — small

Bottom line: bill dropped 93%. Thousands a year back, on infrastructure they weren't using.

What we kept

This is where most "we moved off Kubernetes" stories get sketchy. People drop features and pretend they didn't matter. So — what survived the migration:

  • Zero-downtime deploys (Coolify does blue/green via Docker)

  • Automatic SSL

  • Real-time WebSockets

  • Full-text search

  • Redis-backed background jobs

  • Connection pooling (PgBouncer in a container)

  • Daily backups

  • Git-push deploys

What they gave up: some managed-platform convenience. If a Postgres node falls over, somebody on our side gets paged. That's the trade. They wanted the savings.

Why the savings work

Not magic. Just removing layers nobody used.

App compute went from per-pod managed billing to a flat VPS cost. Workers got consolidated onto the same machine, with Coolify resource limits keeping them honest. The database, cache, search, and WebSocket services moved off managed offerings and onto a second box. They share resources fine because the workload is moderate. Backups moved straight to S3 and got cheaper. Egress dropped to almost nothing — Hetzner includes 20TB.

None of that takes brilliance. It takes being honest about how much traffic you actually serve.

Migration took four days

Four working days, no user-facing downtime. The stateless apps were easy. The careful work was Postgres, Redis, queues, WebSockets, the backup story, and the rollback plan. Sequence was tight: stand up the new boxes, replicate data, cut DNS, watch, kill the old platform.

It wasn't relaxing. It wasn't heroic either. It was deliberate.

Who should think about this

Worth a hard look if:

  • You're paying for managed Kubernetes and most workloads sit at one replica

  • Your traffic is steady, not spiky

  • You need queues, search, WebSockets, reliability — not a platform team

  • You'd rather own some operational responsibility than send a fat check to a platform every month

  • Your bill keeps growing and you can't point at scaling pressure that explains it

If that's you, the answer isn't a bigger platform. The answer is somebody looking at the bill honestly.

When Kubernetes is the right call

Not trying to talk anyone out of Kubernetes. It's the right answer when:

  • You actually scale across multiple nodes or regions

  • Traffic is bursty enough that autoscaling pays for itself

  • Compliance or uptime requirements justify the premium

  • You have the team to own the complexity

  • Infrastructure flexibility is part of your product

If none of that applies yet, two well-run Hetzner boxes will do the job. They did for this client.

The lesson

Match the infrastructure to the business you have, not the architecture you hope to deserve in 18 months.

This client didn't need a bigger platform. They needed a smaller one. Same capabilities. Fewer parts. Thousands a year back in their pocket.

Sometimes the best infrastructure call is admitting you don't need the fancy version yet.


Closed Circuit Consultants helps companies right-size their infrastructure without breaking what works. If your Kubernetes bill doesn't match your actual workload, talk to us.

Related Articles