Cases4 cases
1 to 4 of 4
IL-0152An incorrect configuration applied during maintenance made an internal infrastructure cluster automatically delete the control planes of 200 DOKS clusters in FRA1DigitalOcean2024- Symptoms
At 13:02 UTC on 2024-01-23 DigitalOcean posted that, as of 12:18 UTC, its engineers were investigating an issue with Kubernetes clusters in the FRA1 region and that users might see errors when communicating with their clusters. The control planes of the affected DOKS (DigitalOcean Kubernetes) clusters had become inaccessible.
- Trigger
An incorrect configuration was applied to an internal infrastructure cluster in FRA1 at 12:21 UTC during a maintenance operation.
- Root cause
- Component
- Contributing factor
- Detection
Engineers were investigating errors with Kubernetes clusters in FRA1 as of 12:18 UTC and identified the incorrect configuration as the cause at 12:36.
- Remediation
- restored each affected cluster's etcd from its latest twice-daily backup
- restored the stateless control plane components after etcd
- patched the recovery mechanism after unexpected problems during recovery
- found and fixed an additional small bug during recovery
- contacted affected customers directly with further instructions, since some might need to reconfigure Kubernetes resources
- Action items
- Prevent automatic deletion of infrastructure cluster resources under any circumstances in the production environment
- Lessons
When managed control planes run as resources in another cluster, one configuration mistake in that cluster can delete hundreds of control planes at once through ordinary automation. The etcd backups limited the damage, but their twice-daily schedule set the worst case at 12 hours of lost control plane state, and the recovery tooling itself needed patching during the incident.
- Symptoms
At 09:33 UTC on 14 February 2023 end users told the platform team that Kubernetes logs were not arriving in CloudWatch as expected. The investigation went through fluentd and found that the nodes were running containerd as their container runtime instead of docker-shim. A scheduled node rollover the day before, at 07:30 UTC on 13 February, had set containerd as the default runtime by accident.
- Trigger
A scheduled node rollover had accidentally made containerd the default container runtime, which stopped log shipping to CloudWatch; the unscheduled rollover to revert it timed out, and the pipeline run that followed reduced the Auto Scaling group from 30 to 15 instances.
- Root cause
- Component
- Contributing factor
- Detection
End users reported the missing CloudWatch logs that started the work. The postmortem lists 2 minutes as the time to detection of the node failure.
- Remediation
- ran the node rollover script to add new nodes, which failed on a timeout from Docker Hub
- ran the node rollover script a second time, which added new nodes that the load balancer marked healthy at 11:01 UTC
- Action items
- Document the rollover process, especially what can be done when it goes wrong
- Investigate options for improving the rollover process
- Add fluentd log collection to the QA test suite so logs are covered end to end
- Add alarms for fluentd when too little or no log data is sent
- Implement a staging environment
- Implement guards against selecting an invalid container runtime
- Lessons
When a change goes wrong, rolling back to a known working configuration is safer than rushing a fix, which can make the damage worse. Launching new worker nodes depends on the cloud-init script not failing in any way. The QA configuration differed from production, there was no staging environment, the QA tests did not cover fluentd log collection, and the rollover process had no documentation for when it fails.
IL-0009A duplicated generated name made Argo CD replace the InfluxDB Cloud production Application and delete the whole production environmentInfluxData2022- Symptoms
Right after a pull request to the infrastructure-as-code repository was merged, every API endpoint of one InfluxDB Cloud production cluster began returning 404 errors. Writes and reads failed alike: no one could collect data, scheduled tasks failed to run and external queries did not work.
- Trigger
A merged pull request whose rendered YAML added a new Argo CD Application and AppProject that an automation error had named app01-cluster01, the name of the existing production Application, instead of app02-cluster01; reviewers did not notice the app01 and app02 difference.
- Root cause
- Component
- Contributing factor
- Detection
Monitoring and alerting did not detect the issue right away, so the team's first response was to try to roll the change back rather than plan a recovery. The write-up does not say how the team found out.
- Remediation
- stopped the revert of the merged pull request
- restored the etcd metadata cluster
- recreated the missing Kubernetes objects so the retained PersistentVolumes became available, then recreated the StatefulSets
- restored the Zookeeper volumes from an hourly Velero backup
- rebuilt the Kafka StatefulSet one pod at a time with health and readiness checks disabled
- accepted writes into the Kafka write-ahead log and scaled up the write path with more replicas and higher memory requests and limits
- recreated the storage pods, which downloaded data from object storage, reindexed it and replayed the write-ahead log
- re-enabled Argo CD, queries, dashboards and scheduled tasks, restored replica counts and ran final QA checks
- Action items
- Write runbooks for restoring state when Kubernetes objects such as PersistentVolumeClaims are deleted but the data on the underlying volumes is preserved
- Set every volume in every environment to retain data when its PersistentVolumeClaim is deleted
- Improve the process for handling public-facing incidents
- Store generated YAML as one object per file, so an overwrite of an existing object shows up as such in review
- Detect duplicate objects when generating YAML and warn before review, treating objects with the same group, namespace and name as the same even when the apiVersion string differs
- Add the Argo CD Prune=false annotation to all stateful resources and to Namespace objects managed by Argo CD
- Set FailOnSharedResource=true on Argo CD Applications so Argo CD fails before changing an object another Application manages or managed
- Lessons
The biggest gap was that monitoring did not notice the deletion quickly, which pushed the team toward a reflex rollback; in a stateful system a revert can create a new, empty instance instead of bringing the old one back. Retained volumes and clients that retry writes are what kept data loss at zero. Rendering many objects into one file let an overwrite of an existing object look like an addition, so generated configuration needs one object per file and duplicate detection that compares objects the way Kubernetes does. Stateful resources need protection from pruning, and that protection must cover their Namespace too, or deleting the namespace removes everything inside it.
IL-0010A templating change that dropped its {{ }} delimiters made Argo CD delete all 478 Skyscanner services in every regionSkyscanner2021- Symptoms
On 25 August 2021, skyscanner.net was unavailable and the Skyscanner mobile apps could not work, for travellers and business partners everywhere at the same time. The full global outage lasted four and a half hours.
- Trigger
A peer-reviewed change to a rarely changed root-level file of the cells templating configuration, intended as a no-op, that left out the {{ }} delimiters; it was submitted around 15:30 GMT, merged to master and rolled out automatically to every region at once.
- Root cause
- Component
- Contributing factor
- Remediation
- restored the correct configuration for each cluster and let Argo CD reconcile the cluster back to it
- restored services through the backup and restoration process
- brought one region back first with the critical services and served all traffic from it from around 20:30 GMT
- restored and verified the remaining regions and non-critical services over Thursday and Friday
- Action items
- Avoid global configuration deploys, including rare change paths like this one
- Treat templated configuration as code and add testing and linting
- Plan and wargame more drastic failure scenarios in runbooks
- Verify backup and restore processes, including access to the backups and the loss of a region
- Refactor runbooks so they are clear and, where appropriate, idempotent for a stressed engineer in the early morning
- Reconsider how much configuration is templated across regions, weighing configuration drift against automated global rollout
- Lessons
Global configuration changes had been prevented in many cases, but not in this rarely used path. Configuration that gains templating and logic has become code and needs tests and at least linting. The failure scenarios and runbooks were not pessimistic enough, a backup only counts once it has been restored, and runbooks need care so they work for a stressed engineer at night. Automation that templates configuration across regions trades drift for the risk of rolling one mistake out everywhere. An experienced incident commander who kept the response calm and blameless made a large difference.
These 4 cases involve Argo CD and Configuration templating. kubegap audits a Kubernetes cluster for gaps like these, read-only, from Claude Code or Codex; its checks cite public reports like the ones in this library.
By root cause1
Configuration change4 cases
- Component
- Contributing factor
- Organisation
IL-0152An incorrect configuration applied during maintenance made an internal infrastructure cluster automatically delete the control planes of 200 DOKS clusters in FRA1DigitalOcean2024IL-0109A retried node rollover on a DFDS EKS cluster set the Auto Scaling group back to 15 instances, and the default termination policy removed every healthy worker node, leaving the cluster with no nodesDFDS2023IL-0009A duplicated generated name made Argo CD replace the InfluxDB Cloud production Application and delete the whole production environmentInfluxData2022IL-0010A templating change that dropped its {{ }} delimiters made Argo CD delete all 478 Skyscanner services in every regionSkyscanner2021