Skip to main content
gcpdown
majorGoogle Kubernetes EngineRegional

GKE Control-Plane Outages: When the API Server Fails but Your Pods Keep Running

GCPDown Research · Incident analysisPublished May 10, 2021Updated June 20, 20268 min read
A container ship stacked with shipping containers

Timeline

  1. Impact begins

    The managed GKE control plane in a region becomes unhealthy - commonly from a config change to a control-plane component, capacity pressure on the API server, or a dependency like the backing datastore degrading. kubectl commands start timing out or returning errors for affected clusters.

  2. Investigating

    Google acknowledges elevated error rates or unavailability for the GKE API in the affected region. Customers report that they cannot run kubectl, apply manifests, or view cluster state, even though their running services are still responding.

  3. Identified

    Engineers isolate the failing control-plane component or dependency. Because the control plane is multi-tenant and regional, the fault affects many clusters in the region at once rather than a single customer.

  4. Mitigating

    The offending change is rolled back or the degraded dependency is restored, and control-plane capacity is rebuilt. API error rates fall and kubectl access returns cluster by cluster.

  5. Resolved

    The GKE control plane is healthy across the region. Queued reconciliations, autoscaling decisions, and pending deployments catch up as the controllers resume.

Root cause

GKE is a managed Kubernetes service, and that word - managed - is the key to understanding this whole class of outage. Google runs the control plane for you: the API server that kubectl and your CI talk to, the scheduler that places pods, and the controller manager that keeps the cluster reconciled toward your desired state. You run the data plane: the nodes, the container runtime on each node, kube-proxy, and the pods themselves. These two planes are deliberately decoupled, and that decoupling is exactly what determines what breaks and what survives when the control plane fails.

A GKE control-plane incident typically starts with one of a few triggers: a configuration change to a control-plane component that goes wrong, capacity pressure on the multi-tenant API server in a region, or degradation of a backing dependency such as the datastore that holds cluster state. Because the control plane is regional and multi-tenant, a fault does not hit one customer's cluster - it hits many clusters in the region at once. When it happens, the symptom is sharp and specific: kubectl times out, kubectl apply fails, and the console cannot read cluster state.

The reason this is a survivable outage rather than a total one is the decoupling. A node that is already running does not phone home to the control plane to keep serving its existing pods. The container runtime keeps the containers up, and kube-proxy keeps routing Service traffic using the last state it received. So the control plane can be completely down while your production traffic flows normally - the classic split brain where management is broken but serving is fine.

Business impact

What you lose in a control-plane outage is not availability but agency. You cannot deploy (no new rollouts land), you cannot scale (the Horizontal Pod Autoscaler and cluster autoscaler are blind), and you lose self-healing (if a node dies during the window, its pods will not be rescheduled until the control plane returns). For a stable, steady-state service this is a non-event that customers never notice. For a service in the middle of a deploy, a traffic spike, or a node failure, it is genuinely dangerous - the automation you rely on to absorb those situations is exactly what is offline.

That is why the SLA answer is nuanced. If your workloads kept serving, you may have suffered a real operational outage with no SLA breach at all, because the availability SLO measures the Kubernetes API endpoint, not your management convenience. To sort out whether a given incident actually crosses the threshold, the GCP SLA credit calculator lets you model the API unavailability against the monthly SLO.

The severity of a control-plane outage is therefore almost entirely a function of timing and architecture, not of the outage itself. Two companies can experience the exact same GKE incident and walk away with completely different stories. The first was running a steady service with ample capacity headroom, no in-flight deploy, and no node failures during the window - it never noticed. The second was mid-rollout when the API server went dark, could not roll forward or back, and then lost a node it could not reschedule, cascading a partial deploy into a real user-facing outage. Same root cause, opposite outcomes. That variance is precisely why the prevention advice below is about your design choices: you cannot stop Google's control plane from occasionally failing, but you have almost total control over how much it costs you when it does.

Prevention and lessons

  1. Never put the Kubernetes API on your request hot path. Applications that call the API server to serve user requests turn a control-plane outage into a customer-facing one. Read cluster state at startup and cache it; keep steady-state serving independent of the control plane. The GKE high availability guide covers this pattern in depth.
  2. Pre-provision capacity; do not depend on autoscaling during an incident. If autoscaling is what saves you under load, a control-plane outage removes your safety margin at the worst moment. Run enough headroom that a scaling freeze is survivable.
  3. Go multi-region for anything critical. The control plane is regional, so a second region is the clean escape hatch. A tested traffic-shift to a healthy region turns a regional control-plane outage into a blip - the same lesson as the June 2019 network congestion event and the multi-region GCP architecture guide.
  4. Know your global versus regional dependencies. GKE control planes are regional; other GCP layers like Service Control and Cloud Load Balancing are global. When you do have a claimable outage, the GCP credit playbook covers Google's tight 30-day filing window, and Next Signal can watch provider status and assemble the evidence for you.

SLA credit eligibility

Depends - control-plane-only impact may not breach the SLA if your pods kept serving. The GKE SLA covers control-plane and, on regional clusters, availability of the Kubernetes API endpoint. If the API was unavailable long enough to breach the monthly SLO you can claim at the applicable tier with evidence, but if only management operations were affected while workloads served normally, the availability SLA may not be breached. Google requires notice within 30 days and caps credits at 50 percent.

Work out what your bill was owed with the independent Google Cloud SLA credit calculator, or automate breach detection with Next Signal (sponsor). For the full claim process, see the Google Cloud credit-recovery playbook.

Questions about this outage

What is a GKE control-plane outage?

It is an incident where the Google-managed Kubernetes control plane - the API server, scheduler, and controller manager - becomes unreachable or unhealthy in a region. You lose the ability to run kubectl, deploy, scale, or auto-heal clusters. Critically, the nodes and pods you already have running keep serving traffic, because in GKE the data plane runs independently of the control plane.

Do my applications go down during a GKE control-plane outage?

Usually not, if they were already running. Existing pods keep serving and existing Services keep routing, because kube-proxy and the container runtime on each node do not need the control plane for steady-state traffic. What you lose is change: no new deployments, no Horizontal Pod Autoscaler scaling, and no rescheduling if a node dies during the window.

How do I make GKE resilient to control-plane outages?

Run across multiple regions with a regional or multi-cluster setup, pre-provision enough capacity so you are not depending on autoscaling during an incident, avoid designs that call the Kubernetes API on the request hot path, and keep a tested failover path so you can shift traffic to a healthy region when one region's control plane is down.

Next time, hear it from us first

Instant alerts when Google Cloud incidents are detected - services and regions included.

Get outage alerts

More post-mortems

Cloud IAM

The June 2025 Google Cloud Global Outage: How Service Control Crash-Looped

A policy update containing unintended blank fields reached a code path in Service Control - the global layer that checks quota and policy on nearly every Google Cloud API call - that had a null-pointer defect and no feature-flag protection. Service Control crash-looped globally, returning 503s across dozens of products for roughly three hours; us-central1 took longest to recover due to a retry herd.

Cloud Load Balancing

The November 2021 Google Cloud Load Balancer Outage: A Config Race Condition

A race condition in the pipeline that propagates Google Cloud Load Balancer configuration caused a corrupt configuration to be pushed globally. Requests to sites fronted by GCLB began returning 404 errors even though the backends were healthy - taking down high-profile sites for roughly two hours until the configuration was rolled back.

Cloud IAM

The December 2020 Google Authentication Outage: When Identity Ran Out of Quota

A migration to a new quota system left Google's central User ID Service with a near-zero storage quota. The identity service could not read the account data it needed, so requests that required authentication failed globally. Anything that had to log a user in - Gmail, YouTube, Docs, and the Google Cloud Console and APIs that authenticate through the same identity layer - returned errors for roughly 47 minutes of core impact.