IL-0437 Gunosy · 2023-06-20 (published)kubernetes
Old pods from an unfinished Argo Rollouts canary could not start with a Helm-updated ConfigMap and died in a cascade
The service runs on Kubernetes, keeps its settings in a ConfigMap, manages its YAML with Helm and releases through Argo Rollouts canaries: one pod is released first, and if it is fine all pods are rolled out. Earlier on the day of the incident, before the failure began, a release removed the settings of an old database, which was being retired, from both the ConfigMap and the code. The rollout after the first canary pod was forgotten, so only one pod ran the new version. With a Helm release the old and new pod versions both exist, but by default only the latest ConfigMap is kept. This normally causes no trouble because the server reads the ConfigMap only at startup.
When a breaking news alert raised traffic, pods scaled out automatically, and because the rollout had not happened, the scaled pods were the old version reading the new ConfigMap. The old code needed the old database's settings, which no longer existed, so the new pods could not start. The existing pods were overloaded and restarted, reread the ConfigMap on restart, could not start either, and the pods died one after another.
Gunosy names two root causes: forgetting the manual rollout, and startup failures because only the latest ConfigMap was kept. Automatic rollout had not been configured when Argo Rollouts was introduced, out of concern that releases would go out without a person holding the lever, but over several years forgotten rollouts had become the more common problem.
- Severity
- –
- Scope
- Pods of the service failed to start and died in a cascade during a traffic surge from a breaking news alert
- Users affected
- –
- Region
- –
- Time to detect
- –
- Time to resolve
- –
Symptoms
During a traffic surge from a breaking news alert, pods of a Gunosy service on Kubernetes could not start because the containers could not read their settings from the ConfigMap. The pods that kept running took the extra load and were restarted, failed to start again, and pod after pod died.
The pods added by the automatic scaling were the old version of the application, still running because an earlier canary release had not been rolled out. The old code read an old database and needed the old settings, but only the new ConfigMap existed, so every new or restarted old pod failed at startup.
Symptom Container crash loop
Root cause
Root cause Faulty deployment
- Trigger
- A breaking news alert increased traffic and pods were scaled out automatically while a release that removed an old database's settings from the ConfigMap had been rolled out to only one canary pod.
Detection
–
Remediation
–
Action items
- Configure Argo Rollouts to roll out automatically, with setWeight 1, a one-hour pause and then setWeight 100
- Add the "helm.sh/resource-policy": keep annotation so Helm keeps past versions of the ConfigMap
- Build and use a Helm plugin, helm-clear, that keeps only the last few ConfigMap versions by the revision number in their names, set to keep 5 in CD
Lessons
Gunosy holds that a review that only resolves to be careful next time would soon be followed by the same failure, because human attention cannot be relied on, so each incident gets a permanent fix built into the system. Keeping past ConfigMap versions also made it possible to roll back quickly without going through CI/CD, which a ConfigMap change had previously prevented.
Sources
References
Related cases
IL-0324Three MediaWiki deployments lost Memcached after a PHP 8.1 rollout and overloaded the External Storage database clusterWikimedia Foundation · 2025same root cause · shared ConfigMaps and Secrets, Helm
Check your cluster for this
For AI tools and scripts
- This case as JSON: https://incidentlib-api.benchlet.com/cases/IL-0437
- The cases most like it: https://incidentlib-api.benchlet.com/cases/IL-0437/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.