How a B2B SaaS Platform Upgraded 40 Kubernetes Clusters Across Three Versions Without an Outage

A 120-engineer SaaS company migrated 40 production Kubernetes clusters from 1.24 to 1.27 using a wave-based canary strategy, automated preflight checks, and zero customer-facing downtime.

Containers & K8s · advanced · 12 min read · 2516 words · By Sandip Das · Published

Composite scenario: built from common industry patterns; the figures are illustrative.

What this covers

  1. The Situation
  2. The Problem
  3. Constraints
  4. Options Considered
  5. The Solution
  6. Implementation
  7. Results
  8. What Went Wrong Along the Way
  9. Lessons Learned
  10. Apply It Yourself

Key numbers

MetricBeforeAfter
Clusters on end-of-life Kubernetes (1.24)12 clusters0 clusters
Version spread across fleet3 versions (1.24–1.26)1 version (1.27)
Customer-facing downtime during upgradeN/A (never attempted at scale)0 minutes
Engineer-hours for upgrade execution~200 hours (manual estimate)38 hours (actual)
Mean time to diagnose policy-drift incidents47 minutes8 minutes

Key components

  • Wave Orchestrator — Python script that groups clusters into upgrade waves and advances or blocks each wave based on Prometheus health signals.
  • Preflight Job — CI step that validates PodDisruptionBudgets, deprecated API usage, and Argo CD sync status before any cluster is touched.
  • Metric-gated Approval Gate — Decision point that queries live Prometheus metrics and blocks wave advancement if error rates or restart counts exceed thresholds.
  • Argo CD Fleet Controller — Reads the cluster registry and identifies clusters whose desired Kubernetes version does not match their current running version.
  • EKS Managed Node Groups — Provide rolling node replacement without requiring manual cordon-and-drain, enabling zero-downtime node upgrades.
  • Terraform EKS Module — Single source of truth for cluster version and add-on versions; the wave orchestrator triggers applies against this module.

The Situation

This is a composite scenario assembled from upgrade patterns observed across multiple organisations; all figures are illustrative and chosen for internal consistency, not to represent any single company's experience.

A 120-engineer B2B SaaS company ran its multi-tenant analytics platform on 40 Amazon EKS clusters spread across four AWS regions. Clusters were segmented by customer tier: eight "platinum" clusters for enterprise customers with strict SLA commitments, twenty "standard" clusters for mid-market accounts, and twelve "dev/staging" clusters used by internal teams. The platform team — six engineers — owned cluster lifecycle, while roughly thirty application teams deployed workloads through Argo CD. The fleet had drifted: twelve clusters ran Kubernetes 1.24, nineteen ran 1.25, and nine ran 1.26. Kubernetes 1.24 reached end-of-life in July 2023, which meant no more CVE patches from upstream and a growing gap with the AWS-managed control plane support window.

The rest of this case study — the trade-offs, the scaling numbers and the build prompt — is available to LearnXops members. Create an account or see membership.

Topics: kubernetes, containers, platform-engineering, upgrades, reliability, gitops

Related case studies

Browse all case studies