Cases4 cases
1 to 4 of 4
- Symptoms
At 10:23 on 6 June 2023 a user of the Cloud Platform reported that all of their production pods had been deleted at the same moment. Several users received Pingdom alerts that their applications were down for a few minutes.
- Trigger
The team changed the instance type of the cluster's worker nodes through Terraform.
- Root cause
- Component
- Contributing factor
- Detection
Users reported that their production pods had been deleted at once and that Pingdom alerts showed their applications down; the incident was declared at 11:00.
- Action items
- Ask AWS, through a support ticket, for the steps to change the node instance type without an outage
- Plan how to make instance type changes through Terraform without downtime and add a runbook with the steps for changing the node instance type
- 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-0105Replacing the AWS VPC CNI during a Terraform refactoring detached the ALB target groups, and every service in the Kubernetes cluster returned 503DFDS2021- Symptoms
At 08:29 UTC on 22 June 2021 alerts fired because all services in the Kubernetes cluster were returning 503. No inbound traffic was reaching the cluster. A customer reported the problem at 08:32.
- Trigger
The pipeline replaced the AWS VPC CNI as part of a refactoring that moved EKS add-ons from kubectl to native Terraform management.
- Root cause
- Component
- Contributing factor
- Detection
Alerts fired at 08:29 UTC, eight minutes after the VPC CNI was replaced; a customer reported the issue at 08:32.
- Remediation
- committed a fix that reverted the infrastructure-modules reference
- re-triggered the pipeline after it failed on an AWS API timeout
- let the pipeline reattach the target groups to the ALB
- Action items
- Revert the ALB de-registration delay to the default of 300 seconds
- Update the roll-over script to set the ALB de-registration delay to zero temporarily before a roll-over
- Create an ingress test suite
- Lessons
The change to the de-registration delay had been weighed mainly for performance. Critical pipeline runs should be watched while they run. Everyone should receive the alerts and react to them, and alert messages that were unclear should be reworded.
IL-0061A Terraform pull request merged out of order deleted a production GKE cluster, and recreating it deleted a second oneSpotify2019- Symptoms
Terraform, applied from the shared cluster configuration repository after a merge, deleted Spotify's production GKE cluster in Asia. While the team tried to recreate it, Terraform deleted a second production cluster, so two of the three production clusters were gone.
- Trigger
A feature team's pull request that added three users to an existing RBAC role binding file was merged before the cluster operators' pull request that imported the Asia cluster into Terraform state. The review build of the import pull request had already written the cluster into the shared state file, and the merged configuration had no definition of the Asia cluster, so Terraform removed it.
- Root cause
- Component
- Contributing factor
- Detection
Internal service discovery could not reach the deleted cluster and the cluster operator team was paged.
- Remediation
- removed the deleted clusters from the service discovery configuration and restarted service discovery so clients fell back to the instances outside Kubernetes
- one team that ran half on Kubernetes and half on VMs created more VMs outside Kubernetes to handle the load
- recreated the clusters, using the hourly backups
- updated the places where the old clusters' master IPs were hardcoded
- Action items
- Post the Terraform dry-run output as a comment on each pull request
- Require a status check that the branch is up to date with master, so the dry run reflects what will actually happen
- Require an approving review on pull requests
- Fail reviews automatically when certain keywords such as destroy appear; cluster deletions are done manually outside this repository
- Add linters and validators for the cluster configuration
- Schedule and announce disaster recovery tests that cover a cluster going away and smaller failures
- Lessons
Plan for failure from the start and migrate large infrastructure gradually, so there is redundancy and a way back. A backup whose restore has never been tested is not a backup. Practising disaster recovery paid off: restoring the first deleted cluster took three and a quarter hours, and the team can now restore a larger cluster in one hour. What matters is not who made the mistake but what was learned from it.
These 4 cases involve Terraform and Node pool. 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-0091Changing the worker node instance type through Terraform recycled all nodes at once and deleted users' production pods togetherIL-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-0105Replacing the AWS VPC CNI during a Terraform refactoring detached the ALB target groups, and every service in the Kubernetes cluster returned 503DFDS2021IL-0061A Terraform pull request merged out of order deleted a production GKE cluster, and recreating it deleted a second oneSpotify2019