conndeck blog

EKS vs AKS vs GKE at Scale: The Differences That Show Up in Production

Last May our AWS invoice grew a line item I'd never seen: EKS extended support, $438 per cluster, on eight of our twenty-three clusters. Nobody had bought anything — those clusters were sitting on 1.28, which had quietly aged out of EKS's 14-month standard support window, and AWS had helpfully rolled them into extended support at six times the control-plane price. The fix took five minutes per cluster once we understood it. Understanding it cost $3,500.

That bill is the real answer to "which managed Kubernetes should we run": all three are competent, and they diverge exactly where a fleet hurts — pricing shape, upgrade enforcement, quota friction, multi-cluster tooling.

Quick answer: EKS and GKE both charge $0.10/hr per cluster, AKS's control plane is free unless you want the uptime SLA, and only EKS will silently 6x that fee when a version ages out. GKE has the only complete multi-cluster story — Fleet, Fleet Manager, Config Sync; AKS Fleet Manager is catching up, and EKS assumes you bring Argo CD. Pick the failure mode you can live with: bill surprises, quota tickets, or an upgrade cadence you don't fully control.

The control plane bill at fleet size

One cluster's fee is a rounding error; twenty-three at $0.10/hr is about $1,680 a month before a node boots. This is where AKS has a structural edge: the Free tier control plane costs nothing, and most fleets only pay Standard tier ($0.10/hr, adds the 99.95% API server SLA) on clusters that serve production.

Control planeUptime SLAAging-version tax
EKS$0.10/hr99.95% includedExtended support at $0.60/hr, automatic
AKS$0 (Free tier)$0.10/hr Standard tier, 99.95%LTS requires pricier Premium tier
GKE$0.10/hr99.95% regional, includedExtended channel, added fee

GKE waives the fee for one zonal cluster per billing account, nice, irrelevant past your first dev cluster.

The EKS tax is the one that bites, because it's automatic and quiet. Opt out per cluster:

aws eks update-cluster-config \
  --name prod-eu-1 \
  --upgrade-policy supportType=STANDARD

With supportType=STANDARD, EKS skips the billing and auto-upgrades the control plane when standard support ends, usually the right trade: pay with an upgrade window, not money. Budget for support plans too: AWS Business is a percentage-of-spend tax (min $100/mo, Enterprise from $15k/mo), Azure starts near $100/mo, Google near $500/mo. Support spend tracks your bill, not your headcount.

Egress: the line you didn't model

All three charge roughly $0.01/GB each way for cross-zone traffic and $0.08–0.12/GB for the first internet egress tiers. Nobody models this; then the observability stack does it for you. A chatty Prometheus pair shoving 30 TB across zones is about $600/month, and that's before NAT gateway processing fees.

The mitigation is the same everywhere: keep traffic in-zone. Kubernetes' trafficDistribution: PreferClose on Services (beta in 1.31, GA in 1.33) finally gives you a knob that isn't the old topologyKeys mess:

apiVersion: v1
kind: Service
metadata:
  name: metrics-gateway
spec:
  trafficDistribution: PreferClose
  selector:
    app: metrics-gateway

On EKS, the VPC CNI's IP behavior (ENABLE_PREFIX_DELEGATION, WARM_IP_TARGET) matters more to your bill and scheduling than anything on the pricing page.

Upgrades: cadence and the forced part

EKS gives you 14 months of standard support per minor version, then 12 months of extended support at the 6x fee, then a forced upgrade. AKS supports roughly N-2 minor versions, force-upgrades clusters that fall off the ladder, and sells two-year LTS on designated versions (1.27, 1.30) through Premium tier. GKE moves fastest: release channels auto-upgrade nodes; maintenance windows and exclusions buy you weeks to months, never quarters, and a retired static version moves your control plane regardless of change freezes.

I've been burned by the API-removal kind, not the version kind: a team riding the auto-upgrade train through 1.22 lost extensions/v1beta1 Ingresses overnight, the manifests applied for years, and then the API simply didn't exist. Version upgrades are boring. The APIs a version deletes are not. Run a deprecation scan before every minor bump.

Ranking: GKE's cadence is healthiest if your workload hygiene is good; staying current is painless there. EKS is kindest to slow orgs until it invoices you. AKS is the most predictable to plan around.

Quotas: the wall you hit at 2 AM

AWS gives you the Service Quotas console, many raises are self-serve, approved in minutes to days, but the defaults are hostile: five Elastic IPs per region, when a public NLB wants one per AZ and NAT gateways want more. Regional vCPU quotas are the other classic wall.

Azure's per-region vCPU family quotas historically meant a support ticket, and the queue does not care about your migration date: we waited four business days for a D-family bump in West Europe while a cutover sat idle, the clusters were fine, the paperwork wasn't. GKE is the least painful; most console increases are auto-approved within hours. Ranking, no contest: GKE, AWS, Azure.

Multi-cluster: where the real gap is

GKE Fleet is the only first-party offering that treats thirty clusters as one object: register everything, attach non-GCP clusters too, and you get the Fleet Manager console, Config Sync, Multi-Cluster Services, and team-scoped fleet namespaces. It's genuinely ahead, and it isn't close.

Azure splits the answer in two: AKS Fleet Manager (KubernetesFleet, now GA) runs orchestrated upgrades across member clusters, while Arc gives inventory, policy, and GitOps across a heterogeneous estate, EKS and GKE included. For mixed estates, Arc is arguably the best layer of the three.

EKS has no fleet story; the EKS Connector registers external clusters for console visibility and that's it. Every EKS shop I know runs Argo CD ApplicationSets. I keep all three clouds' kubeconfigs in conndeck and hop forty clusters from one pane, the tool matters less than the discipline: one context per cluster, per engineer, no shared admin kubeconfigs.

Where each one is genuinely ahead

GKE wins day-2 operations: fleet tooling, Autopilot compute classes, binpacking, the smoothest upgrade machinery. EKS wins cloud integration, Pod Identity and IRSA, the VPC CNI knobs that decide whether you run out of IPs before CPU, and ecosystem gravity. AKS wins price structure, Windows nodes done properly, and Arc for estates that will never be single-cloud.

So pick the failure mode, not the feature matrix: surprise invoice, EKS; procurement-speed quota tickets, Azure; an upgrade cadence you don't control, Google. You'll be competent on whichever you choose, the job is deciding which pain you want to be good at.

Frequently asked questions

How much does the EKS control plane cost compared to AKS and GKE?

EKS and GKE both charge $0.10 per hour per cluster, roughly $73 per month, and GKE waives that fee for one zonal cluster per billing account. AKS charges nothing for the control plane on its Free tier and only bills $0.10 per hour if you want the Standard tier uptime SLA. The trap is EKS extended support: a version past its 14-month standard window is automatically billed at $0.60 per hour, six times normal, unless you set the upgrade policy back to STANDARD.

What happens when my Kubernetes version reaches end of support on EKS?

Nothing breaks immediately, which is the problem. EKS auto-enrolls the cluster in extended support at $0.60 per hour and keeps the version alive about 12 more months. Set supportType=STANDARD and EKS skips the billing and auto-upgrades the control plane instead, which is usually what you want.

Does AKS really have a free control plane?

Yes, the AKS control plane is genuinely free on the Free tier, and you only pay for nodes, storage, load balancers, and egress. The Standard tier costs $0.10 per hour per cluster and exists mainly to add a 99.95% uptime SLA on the API server. Long Term Support on designated minor versions requires the Premium tier, which costs more on top of that.

Which managed Kubernetes has the best multi-cluster tooling?

GKE Fleet is the most complete: it registers clusters from any environment and adds a Fleet Manager console, Config Sync, and Multi-Cluster Services. AKS Fleet Manager handles orchestrated upgrades across members, and Azure Arc is arguably the best inventory-and-policy layer for a heterogeneous estate. EKS has no first-party fleet story, so most teams pair it with Argo CD ApplicationSets.