Representative Engagement · E-commerce · India

47 services to EKS. Eight waves.
Zero customer-facing downtime.

Engagement at a glance

  • Client profile: large Indian e-commerce marketplace; monolithic PHP on EC2; two prior migration attempts by another vendor had failed.
  • Shape: 16-week fixed-scope project with milestone billing, deadline pinned to the year's biggest sale.
  • Result: 47 services migrated in 8 waves, zero customer-facing downtime, deploy frequency up 14x, and a 5.2x traffic peak absorbed without intervention.
  • Why it worked where two attempts failed: session state moved out of the app before any traffic moved onto Kubernetes.

The situation: third attempt, hard deadline

The marketplace ran a monolithic PHP stack on EC2 behind a classic load balancer, deploying twice a week through a process everyone was afraid of. The board wanted microservices on Kubernetes before the flagship sale; engineering wanted to stop shipping at walking pace. Two previous attempts with another vendor had both died the same death: user sessions lived in local application state, so every cutover attempt logged customers out mid-cart, and every rollback was a fire drill.

That failure pattern is the first of the three Kubernetes migration mistakes we keep meeting: migrating the platform before de-coupling the state. The third attempt was scoped to fix the root cause first and move traffic second.

What we did, wave by wave

Sixteen weeks, eight waves: state first, platform second, traffic last.
Weeks Workstream What shipped
1–4 Kill the blocker Session state externalized to Redis (ElastiCache) while everything still ran on EC2 — the change that made every later cutover boring; EKS platform built with Terraform, node groups sized from real traffic data
3–6 Delivery rails Argo CD GitOps delivery so every service's desired state lived in Git; Istio installed for weighted traffic shifting; container build pipeline with image scanning
5–14 Eight waves 47 services moved in dependency order, least critical first; before every wave, a load test at 3x observed peak; traffic shifted 1→10→50→100% per service with automatic rollback triggers on error-rate and latency SLOs
10–16 Safety net & handover Old EC2 fleet kept warm for instant DNS-level rollback until two weeks after the sale; autoscaling policies tuned against load-test data; runbooks, dashboards and the Argo CD workflow handed to the client's platform team

The wave discipline is the method. A big-bang cutover stakes the whole business on one night going well; eight small waves mean the worst possible outcome at any point is one service's traffic sliding back to a fleet that's still warm. It costs more in duplicated infrastructure for a few weeks — we said so up front — and it's why the downtime line reads zero. The trade-offs are the same ones we walk through in managed vs self-hosted Kubernetes.

What the pre-wave load tests caught

Testing every wave at 3x observed peak is expensive discipline, and it pays for itself the first time it catches what would have been a sale-day outage. Two catches were typical of the class. First, connection-pool exhaustion: services that had shared a monolith's database pool now each brought their own, and the arithmetic that worked for one process at fifty connections stopped working for forty-seven services under load — found at simulated peak, fixed with PgBouncer-style pooling in front of the database, invisible to customers. Second, a hot cache keyspace: the cart service's most active keys concentrated on one Redis shard under load in a way steady-state traffic never revealed. Both fixes shipped before the wave that would have exposed them. That's the entire argument for load-testing waves instead of hoping: production traffic eventually runs the same test, but it doesn't file a ticket first.

Equally deliberate was what didn't move. The relational database stayed on RDS — a Kubernetes migration is not improved by dragging a stateful database onto the cluster mid-flight, whatever the conference talks say. Two batch workloads with no scaling problem stayed on EC2 until after the sale. Scope discipline is unfashionable and it is why the timeline held: the goal was a marketplace that survives its biggest day, not a purity certificate.

The deploy-frequency jump — 2 a week to 4 a day — wasn't a target, it was a symptom. Once Argo CD made every deploy a Git merge with automatic rollback, deploying stopped being a scheduled event with a war room and became something engineers did on a Tuesday afternoon. That cultural unlock, more than the sale-day headline, is what the client kept.

The results, sale day included

  • 47 services migrated across 8 waves — on the third attempt, after two vendor failures
  • Zero customer-facing downtime across the entire migration window
  • Deploy frequency up 14x — from 2 per week to 4 per day, because deploys stopped being events
  • 5.2x peak traffic on sale day absorbed by autoscaling with no human intervention — the pattern our e-commerce DevOps page exists for

Engagement type: Project Delivery · 16 weeks · fixed-scope SoW with milestone billing. What a cluster like this costs to run — and where the money goes — is what the Kubernetes cost calculator estimates in two minutes.

A note on this write-up: this is a representative engagement — the wave structure, tooling choices, rollback discipline and outcome metrics are exactly how InfraZen runs a migration of this shape, published this way while client-cleared named case studies are prepared. Bring your own failed-migration story to a call and we'll tell you which wave it died in.

Related: Kubernetes consulting · 3 Kubernetes migration mistakes · What is Kubernetes? · Next case: 47% off an AWS bill

Planning a migration you can't afford to fumble?

Free 30-minute review with an engineer who has run this play. We'll map your dependency order and tell you where attempt one usually dies.

last updated: 2026-08-16

Estimate cluster cost Book the Review