IL-0530 Google Cloud · 2023-10-05gcpnetworkingkubernetes
Virtual router controllers in us-central1 ran out of memory in a loop, cutting networking for new and migrated VMs
Google Cloud had been slowly rolling out a management plane change that decoupled the processing of API updates to Instance Groups and Network Endpoint Groups used as load balancer backends. The change ran in several regions without problems, but in us-central1 the large workload sizes made the memory use of the control plane for the virtual network routers grow unexpectedly. The controllers ran out of memory, were restarted automatically and ran out of memory again, over and over. Virtual routers and their controllers sit in separate zonal failure domains, but the change acted through a regional API, so every virtual router controller in the region came under memory pressure at the same time. Without working controllers, the routers were not updated with new VMs, new locations of migrated VMs, dynamic routes or load balancer backend health. Intra-region and cross-region traffic use separate sets of virtual routers with their own control plane, and the cross-region routers were affected first and longer.
Engineers were alerted to intermittent control plane slowness at 21:45 US/Pacific on 4 October and to out-of-memory failures of the controllers at 02:11 on 5 October, and started giving the controllers more memory. Cross-region packet loss began at 03:08. The larger memory allocation started to reach production at 05:27, and intra-region packet loss that started at 07:00 subsided at 08:15 as it rolled out. At 08:22 engineers linked the memory growth to the management plane change, started a rollback at 08:52 and completed it in us-central1 at 09:35, after which no more out-of-memory events happened. A small number of routers still did not accept updates and were restarted by hand without further packet loss. All packet loss had stopped by 10:55, 7 hours and 47 minutes after it started. The Filestore update backlog finished about a day later, on 6 October.
- Severity
- –
- Scope
- Networking for newly created and live migrated VMs, cross-region traffic to and from us-central1, intra-region traffic from 07:00 to 08:15, and load balancer health propagation; products that create VMs, including GKE, Cloud SQL, Filestore, Dataproc, Dataflow, Data Fusion, Datastream and Batch
- Users affected
- –
- Region
- us-central1
- Time to detect
- –
- Time to resolve
- 7h 47m
Symptoms
On 5 October 2023 in us-central1, newly created VMs waited a long time before their networking worked, and VMs that had been live migrated lost connectivity for a long time after the migration. Networking telemetry showed cross-region packet loss to and from us-central1 from 03:08 US/Pacific. Health check state of VMs reached load balancers late.
The first signals came hours earlier. On 4 October at 21:45 US/Pacific engineers were alerted to slowness in the virtual network control plane in us-central1, which looked intermittent. At 02:11 on 5 October alerts reported failures in the controllers of the virtual network routers because the controllers ran out of memory. The controllers were restarted automatically but ran out of memory again, and as the out-of-memory events came more often, updates to router state, such as new VMs, new locations of migrated VMs, dynamic routes and health of load balancer backends, fell further behind until practically nothing progressed.
From 03:08 to 10:55 the impact was largely limited to cross-region traffic, and the cross-region routers were hit first and for longer than the intra-region routers. From 07:00 to 08:15 intra-region traffic also lost packets, mainly to and from us-central1-c. Existing VMs that did not migrate or change health were not hit directly, but their traffic could pass through an affected VPN Gateway, internal load balancer or other VM.
Products that create VMs failed with it. 24 percent of GKE cluster creation attempts failed or were delayed, most of them succeeding after up to 120 minutes, and up to 0.4 percent of GKE clusters had downtime or delays during recreate and upgrade operations; in the Google Cloud Console Clusters page some Nodes showed as not registered and the cluster as unhealthy. New Cloud SQL VM creations failed, and Cloud SQL databases became unavailable when a change created a new VM for an existing instance. Filestore upgrades failed and were rolled back, Dataproc cluster creations failed for up to 5 percent, Dataflow jobs could not scale and container downloads from Artifact Registry failed, and Datastream streams showed spikes in the "Data freshness" and "Total latency" metrics.
Symptom Packet lossNetwork unreachableOOMKilledStale endpoint routingCluster or node provisioning stall
Root cause
Root cause Faulty deployment
- Trigger
- A management plane behaviour change, meant to decouple the processing of API updates to Instance Groups and Network Endpoint Groups used as load balancer backends, was deployed in us-central1 after rolling out to several other regions without incident.
Detection
Engineers were alerted to slowness in the virtual network control plane in us-central1 at 21:45 US/Pacific on 4 October, before the packet loss started, and to controller failures from memory exhaustion at 02:11 on 5 October. Networking telemetry showed cross-region packet loss from 03:08.
Remediation
- Increased the memory allocated to the virtual network router controllers
- Rolled back the management plane change in us-central1
- Restarted by hand the routers that were still not accepting updates
Action items
- Alert proactively on memory risks and unexpected memory increases
- Refactor the deployment configuration so engineers can reallocate memory much faster
- Re-evaluate existing practices and add safety mechanisms for API reconciliation
- Make management plane changes more visible across teams so the changes can be correlated faster
- Adjust the deployment footprint so a regional API change is less likely to exhaust memory across the region at once
- Optimise memory use in the traffic routers and their controllers
Lessons
–
Sources
- https://status.cloud.google.com/incidents/U39RSGjaANJXtjHpRkdq · official-status · archived copy
Related cases
IL-0356Every domain hosted on Railway returned HTTP 404 to new connections for five minutes because route lookups failedRailway · 2026same root cause · shared Network control plane (SDN)
IL-0354Fly.io private networking (6PN) broke for some machines after edges received gateway /80 routesFly.io · 2026same root cause · shared Network control plane (SDN)
IL-0188Rolling updates on EKS returned 502 errors for about 30 seconds because Kubernetes deleted old pods as soon as new pods passed readiness, before the ALB had marked the new pod targets healthyYonghyun Kim · 2025same root cause · shared Cloud load balancer
IL-0563Linode servers lost connectivity in all data centers as route servers built incomplete BGP route tablesLinode · 2025same root cause · shared Network control plane (SDN)
IL-0532Azure Software Load Balancer sent packets of one flow to different backends, dropping Firewall and Private Link trafficMicrosoft Azure · 2022same root cause · shared Cloud load balancer
Check your cluster for this
For AI tools and scripts
- This case as JSON: https://incidentlib-api.benchlet.com/cases/IL-0530
- The cases most like it: https://incidentlib-api.benchlet.com/cases/IL-0530/similar
- MCP server (Streamable HTTP, no key):
https://incidentlib-mcp.benchlet.com/mcp
The API needs no key. The MCP server offers search_incidents, get_incident, list_incidents, get_topic and vocab; both are explained on API and MCP.