Cases2 cases
1 to 2 of 2
IL-0192A Crossplane composition merge-policy change for a TLS policy update switched Kubernetes Services from LoadBalancer to ClusterIP and deleted the load balancers behind about 25% of Grafana Cloud servicesGrafana Labs2025- Symptoms
At 08:41 UTC on 18 February 2025, several Grafana Labs application teams noticed that some of their endpoints were no longer available. The investigation quickly found that the load balancers for those endpoints were gone.
- Trigger
A change to the merge policy of a Crossplane composition, made so that the default TLS policy of the load balancers could be overridden, was applied to development, staging and production at the same time.
- Root cause
- Component
- Contributing factor
- Detection
Application teams noticed at 08:41 UTC that some of their endpoints were no longer available.
- Remediation
- rolled back the Crossplane composition change
- recreated the affected Kubernetes Services so that Kubernetes recreated their load balancers
- Action items
- Add a CI check that blocks a deployment to more than one wave, so any exception to the dev, staging, canary, production order is caught
- Give higher priority to a more sophisticated wave design that was already under discussion
- Enable deletion protection on the load balancers, one layer below Crossplane
- Enable deletion protection on other critical cloud provider resources
- Develop the Crossplane Managed Resources exporter for change validation and visibility, now in beta testing within Platform engineering; simulated against the change that caused this outage, it shows a clear diff
- Complete and test support for reconfiguring the TLS policy so application teams can deploy it
- Lessons
A change that looked small and low-risk had a side effect that only a full end-to-end test through Crossplane and the cloud provider's load balancer controller would have shown; seeing the intended override work was not that test. Staged rollout and blast-radius limits that exist only as process can be skipped, so Grafana Labs moved to enforce waves in CI and to add deletion protection on the load balancers themselves, beneath the Crossplane layer.
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 2 cases involve CI system and Cloud load balancer. 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 change2 cases
- Contributing factor
- Organisation
IL-0192A Crossplane composition merge-policy change for a TLS policy update switched Kubernetes Services from LoadBalancer to ClusterIP and deleted the load balancers behind about 25% of Grafana Cloud servicesGrafana Labs2025IL-0061A Terraform pull request merged out of order deleted a production GKE cluster, and recreating it deleted a second oneSpotify2019