We just finished a 9-month migration of 40 services from a VM-based platform onto managed Kubernetes. The client is a B2B SaaS serving 12 countries with strict compliance requirements. This article is the unvarnished story — the wins, the losses, and what we'd never do again.
Why we moved
The VM platform was scaling — but painfully. Deploys took 18 minutes. Autoscaling required provisioning new VMs (5–10 minutes). Each new service meant a Terraform module, a Jenkins job, a Sensu check, and a wiki page. Three of the client's top 10 incidents in the prior year were 'autoscaling didn't kick in fast enough.' Something had to change.
The wins
After 9 months on managed K8s (EKS):
- Deploy time: 18 minutes → 90 seconds
- Autoscale latency: 5–10 minutes → 30 seconds
- Cost: 22% lower (right-sized pods, spot instances on non-prod)
- Incidents: P1 count down 47% (autoscaling actually works now)
- Time-to-prod for a new service: 2 weeks → 2 hours (Helm chart + Argo CD)
The losses
Not everything improved:
- Operational complexity went up — K8s has a steep learning curve and the client's SREs needed 3 months of dedicated training
- Debugging got harder — distributed tracing is mandatory, you can't SSH into a pod and tail logs anymore
- Some legacy services didn't fit — stateful workloads (Kafka, Postgres) stayed on VMs, which means running two platforms in parallel
“If you're going to do this migration, accept that you'll run two platforms for at least 6 months. Anyone who tells you 'rip and replace' has never done it.”
What we'd never do again
Three things, in hindsight:
First, we'd start with observability, not infrastructure. We spent the first 6 weeks setting up EKS, Argo CD, and the ingress controller. We should have spent those 6 weeks installing Prometheus, Grafana, Jaeger, and Loki first — and only then started moving services. Without observability, the first migration was flying blind.
Second, we'd never migrate a stateful service to K8s unless we absolutely had to. Kafka and Postgres stayed on VMs and that was the right call. The temptation to put everything on K8s for consistency is real — resist it.
Third, we'd budget 3 months of dedicated training for the client's SRE team, not 3 weeks. K8s is not Jenkins. The mental model is different and the team needs time to internalise it.
Author
Daniel Carter
VP, Delivery & Client Success, Globantis Labs
Daniel writes about engineering at Globantis Labs. Reach out if you'd like to discuss this article or your own project.



