Back to portfolio
Case study · Platform migration

Zero-downtime migration to new Kubernetes clusters

Moving a whole platform onto new clusters is the kind of change that goes wrong at 2 a.m. Here is how I did it with no downtime: a blue-green cutover at the cluster level, an internal DNS switch, and scale-to-zero as a one-command rollback.

By Vitor Schiavo Updated October 2026 ~6 min read
Solution at a glanceMove workloads with a route back.
Source clusterInventory apps and data
Target clusterRestore and validate
Traffic cutoverSwitch DNS with rollback

Prepare application and data migration before DNS cutover, then validate the destination.

Contribution at a glance

My responsibility
Staged workload/data movement, destination validation and DNS cutover with rollback.
Scope
Cluster-level migration with legacy workloads retained during the transition.
Collaboration & boundaries
I coordinated the infrastructure move around workload and data dependencies; each service requires its own cutover acceptance.
Outcome
A repeatable phased migration strategy with a rollback route. No universal recovery-time or availability guarantee is inferred.

Rebuilding clusters is only half the job. Once the new clusters exist, every workload still has to move onto them, and "move production to a different cluster" is exactly the sentence that makes people schedule a midnight maintenance window. I wanted no window and no downtime, so I treated the whole thing as a blue-green deployment, just at the level of the cluster instead of a single service.

The strategy: blue-green at the cluster level

The new clusters ran in parallel with the legacy ones. Nothing was deleted until the new side was proven. The sequence:

What actually had to move

A platform is more than its stateless pods. The migration covered the whole surface:

0downtime
DNSlayer cutover
scale-to-0warm rollback
full stackapps · functions · data

Scale to zero, do not delete

The single most valuable move in a cluster migration is keeping the old workloads at zero replicas instead of deleting them. It costs almost nothing to park an idle deployment, and it turns rollback from a rebuild into a one-line scale command plus a DNS flip. Delete only after the new side has earned your trust.

The parts people forget

The migration is not done when traffic flows. Two cleanups mattered:

What I would tell someone starting this

Decisions and next steps

A retrospective view of the approach and its limits. The next improvement is a proposal, not a delivered result.

Alternative and rationale

An in-place move reduces parallel capacity; parallel clusters enable destination validation before shifting traffic.

Trade-off

Parallel operation adds temporary cost, DNS/cache behavior and state-synchronization risks.

What I would improve next

Next improvement: record per-service acceptance, rollback time and the conditions for safely removing legacy capacity.