IL-0517 Gitpod · 2022-01-25kubernetesgcpnetworking
Gitpod workspaces failed to start worldwide and lost data when CoreDNS lookups to 8.8.8.8 timed out in its clusters
On 25 January 2022 Gitpod had a global outage of a little over an hour. The workspace clusters used Google's primary DNS server 8.8.8.8 to resolve public addresses, and the clusters could no longer reach it: UDP traffic on port 53 timed out. Image pulls from GCR failed, so workspaces could not start, and the workspace backup service could not resolve the address of the private GCS bucket that holds workspace content backups, so backups failed and workspaces that were already running lost data. User data in /workspace was kept on the individual nodes of the workspace clusters, so a node or cluster failure before a backup finished meant data loss.
As a precaution, and because cluster creation had recently been automated, the team started creating new workspace clusters in the EU and the US in the background through a werft job, which takes about 20 minutes. The new clusters were not affected, so traffic was redirected to them and workspaces started again. The old cluster recovered shortly after traffic left it, which the team took as a sign of some kind of load issue, but later tests on the old cluster could not reproduce the network failure.
- Severity
- –
- Scope
- Workspaces could not be started, and running workspaces lost data
- Users affected
- –
- Region
- global
- Time to detect
- –
- Time to resolve
- 1h
Symptoms
At around 5.44pm UTC on 25 January 2022, Gitpod saw a high error rate when pulling images from Google Container Registry (gcr.io), with the error "cannot get manifest". About 10 minutes later users reported that they could not start workspaces.
The logs also showed "dial tcp: i/o timeout failed to do request" on image pulls, and the CoreDNS pods logged many DNS errors such as "[ERROR] plugin/errors: 2 storage.googleapis.com. A: read udp 192.168.60.206:55169->8.8.8.8:53: i/o timeout". Traffic on UDP port 53 to Google's public DNS server 8.8.8.8 seemed not to get through. Running workspaces lost data, because the backup service could not resolve the Google Cloud Storage address and their backups failed.
Google's status page showed only a Service Usage API issue that did not look related, and checks of DNS and the status page showed no errors, so the team assumed the problem was on Gitpod's side; no recent changes had been made to the clusters. The ARP table was within normal limits and conntrack utilization was at about 10%.
Symptom Image pull failuresDNS resolution failuresService outageData loss
Root cause
Root cause DNS or network fault
- Trigger
- –
Detection
The team noticed a high error rate on image pulls from GCR at around 5.44pm UTC; about 10 minutes later users reported that workspaces would not start, and the on-call team started incident response.
Remediation
- Created new workspace clusters in the EU and the US with a werft job
- Redirected traffic to the new clusters
Action items
- Keep workspace data on cloud provider persistent volumes that survive node and cluster failures
- Let users download their files from a workspace that cannot be started
- Improve the workspace backup process
- Use three DNS servers instead of one: a GCP-internal one, 8.8.8.8 and Cloudflare's 1.1.1.1
- Do more DNS resiliency work, tracked in an epic
- Improve support for multi-region clusters and later go multi-cloud
Lessons
–
Sources
Related cases
IL-0083Intermittent 5xx errors in a multi-tenant Kubernetes cluster came from internal DNS: the node-local dnsmasq hit its 150 concurrent query limit, did not cache cluster.local answers, and ndots search lookups flooded CoreDNSAdevinta · 2023same root cause · shared CoreDNS
IL-0199A non-essential container exceeding its memory limit made GitHub's production pods unavailable, and their restarts failed because a DNS maintenance change had left the clusters unable to reach the image registryGitHub · 2020same root cause · shared Container registry and its credentials
IL-0049Partial DNS outage after CoreDNS scaled down and kube-proxy failed to delete stale conntrack entriesPreply · 2020same root cause · shared CoreDNS
Check your cluster for this
For AI tools and scripts
- This case as JSON: https://incidentlib-api.benchlet.com/cases/IL-0517
- The cases most like it: https://incidentlib-api.benchlet.com/cases/IL-0517/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.