IL-0243 Google Cloud · 2021-11-16gcpnetworking
Google's global External Proxy Load Balancing returned 404 errors for most HTTP/S endpoints for 33 minutes
A configuration pipeline carries customer configuration rules to Google External Proxy Load Balancing (GCLB). A bug added to it six months earlier allowed a race condition that, in very rare cases, could corrupt a configuration file near the end of the pipeline, past its validation checks. A Google engineer found the bug on 12 November, and Google declared an internal high-priority incident. Google froze part of the configuration system to make the race even less likely and, since the race had existed for months and Black Friday and Cyber Monday were close, chose a controlled rollout of fixes over a same-day emergency patch. Patch A closed the race; patch B added input validation to the binary that receives the configuration. Both were verified by 13 November and began rolling out gradually on 15 November, and patch B finished that evening.
On 16 November at 09:35 PT, with patch A within 30 minutes of finishing, the race occurred in an unpatched cluster. The corruption took a form different from the input errors seen in testing, so patch B did not reject it, and GCLB endpoints served 404 errors globally. Automated alerting notified engineers at 09:50 PT, together with customer support requests, and a rollback to the last known good configuration completed at 10:08 PT and ended the 404 errors. To avoid a repeat, Google suspended customer configuration changes from 10:04 PT, validated the fix, added proctoring and monitoring, and resumed configuration pushes at 11:28 PT, for a total impact of 1 hour and 53 minutes.
- Severity
- –
- Scope
- HTTP/S endpoints behind Google External Proxy Load Balancing returned 404 errors, including Cloud Run, App Engine, App Engine Flex, Cloud Functions, Apigee and Firebase behind GCLB; load balancer configuration changes did not take effect until 11:28 PT
- Users affected
- –
- Region
- Global; the preliminary report lists us-central, europe-west1 and global
- Time to detect
- 15m
- Time to resolve
- 1h 53m
Symptoms
From 09:35 to 10:08 PT on 16 November 2021, most endpoints served by Google's global External Proxy Load Balancing (GCLB) returned Google 404 errors to HTTP/S requests. For about another 1 hour and 20 minutes customers could not change their load balancing configuration.
Services behind GCLB lost traffic as well. Customers using serverless network endpoint groups on GCLB in front of Cloud Run, App Engine, App Engine Flex or Cloud Functions, and customers of Apigee and Firebase, got 404 errors. The preliminary report lists a 25% drop in Cloud Run traffic in us-central1, an 80% drop in App Engine traffic in us-central and europe-west1, failed App Engine Flex deployments and 404 errors for Apigee runtime requests.
During the partial recovery traffic was served again, but changes to External Proxy Load Balancers did not take effect, because Google had suspended customer-initiated configuration changes from 10:04 PT until configuration pushes resumed at 11:28 PT.
Symptom Service outageHigh error rate
Root cause
Root cause Software defect
- Trigger
- On 16 November 2021 a race condition in the configuration pipeline occurred in a cluster that patch A had not yet reached, and pushed a corrupted configuration file to GCLB.
Detection
Automated alerting notified Google engineers at 09:50 PT, at the same time as customer support requests came in.
Remediation
- Rolled back to the last known good configuration, which ended the 404 errors
- Suspended customer-initiated configuration changes in GCLB
- Validated the fix and added proctoring and monitoring before resuming changes
- Resumed customer configuration pushes at 11:28 PT
Action items
- Add alerting that reports similar issues much faster
- Add stronger automated correctness checks on configurations before they are applied
- Speed up planned architectural changes that improve how such issues are isolated and resolved
Lessons
–
Sources
- https://status.cloud.google.com/incidents/6PM5mNd43NbMqjCZ5REh · official-status
Related cases
IL-0150A latent race condition in DynamoDB's DNS automation left an empty DNS record for dynamodb.us-east-1.amazonaws.com, and the DynamoDB and EC2 launch failures that followed caused EKS, ECS and Fargate container launch failures and cluster scaling delays in us-east-1Amazon Web Services · 2025same root cause · shared Cloud load balancer
IL-0352Heroku Router 2.0 spread HTTP requests unevenly across dynos for four days, causing latency and timeoutsHeroku · 2025same root cause · shared Cloud load balancer
IL-0535An internal Kinesis Data Streams cell in US-EAST-1 degraded, raising errors in CloudWatch Logs, S3 events and LambdaAmazon Web Services · 2024same root cause · shared Serverless function platform
IL-0131A new kind of GenerateContent request made Vertex AI prediction API servers segfault, and once enough of them restarted at the same time the serving fleet could not carry the loadGoogle Cloud · 2024same root cause · shared Cloud load balancer
IL-0529New Google Cloud VMs and other instances came up without network connectivity in all zones after VPC controllers stoppedGoogle Cloud · 2024same root cause · shared Cloud load balancer
IL-0151A latent defect in the AWS Lambda Frontend, set off when one us-east-1 cell scaled past a size never reached before, raised errors for Lambda and for services that depend on it, including new EKS cluster provisioningAmazon Web Services · 2023same root cause · shared Serverless function platform
IL-0253Firefox froze and could not load any web content for close to two hours, stuck in an HTTP/3 request to TelemetryMozilla · 2022same root cause · shared Cloud load balancer
IL-0106A malformed Traefik IngressRoute triggered a Traefik v2 bug once a node rollover restarted every Traefik pod, and all Kubernetes services returned 404DFDS · 2021same root cause · shared Cloud load balancer
IL-0493Netlify's Google Cloud TCP load balancer stopped serving about 5% of global traffic as all backends failed health checksNetlify · 2021same root cause · shared Cloud load balancer
IL-0345Many Render services in the Oregon region returned 503 errors for about four hoursRender · 2020same root cause · shared Cloud load balancer
IL-0030Most nodes of a cluster went NotReady together for 15 minutes while the API server sat behind an AWS ELBZalando · 2019same root cause · shared Cloud load balancer
IL-0338Google Cloud HTTP(S) and TCP/SSL Proxy load balancers returned 502s or reset connections on 33% to 87% of requestsGoogle Cloud · 2018same root cause · shared Cloud load balancer
IL-0395Google Cloud HTTP(S) Load Balancer gave 502s on 25% of requests for 22 minutes after reverting to a stale configurationGoogle Cloud · 2017same root cause · shared Cloud load balancer
IL-0396New or live-migrated GCE instances, VPN tunnels and network load balancers were unreachable on public IPs for over 2hGoogle Cloud · 2017same 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-0243
- The cases most like it: https://incidentlib-api.benchlet.com/cases/IL-0243/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.