Cases5 cases
1 to 5 of 5
IL-0058Argo CD deleted namespaces shared by several applications, leaving about 97 applications stuck Missing and OutOfSyncArgo CD users2026- Symptoms
After a rolling restart of the Argo CD application-controller, namespaces that several applications shared went into the Terminating state. About 97 applications were then stuck in a Missing/OutOfSync deadlock.
- Trigger
A manual bulk sync with force: true from the Argo CD UI, run during the window after an application-controller restart, on an application whose manifests declared a namespace whose app.kubernetes.io/instance label pointed to a different application.
- Root cause
- Component
- Contributing factor
- Action items
- Refile the problem as #29739: a manual force sync hard-replaces shared cluster-scoped resources through a tracking-ID conflict, ignoring Prune=false
- Lessons
The sync option Prune=false only protects the prune path; it does not stop a force sync from deleting and recreating a resource. When two Argo CD applications declare the same namespace or other cluster-scoped resource, force-syncing the application that does not own the tracking label can delete it at any time.
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-0473Jenkins infrastructure went fully down after a pod IP range fix deleted every AKS node pool and could not recreate themJenkins project2023- Symptoms
On 7 July 2023 from 11:05 to 15:25 UTC many public Jenkins infrastructure services were completely down, including get.jenkins.io, plugins.jenkins.io, accounts.jenkins.io, javadoc.jenkins.io and incrementals.jenkins.io, while ci.jenkins.io, issues.jenkins.io, repo.jenkins-ci.org and www.jenkins.io were partly or completely disrupted.
- Trigger
After the upgrade to Kubernetes 1.25 changed the range of the pods' originating IP and LDAP access was blocked, a fix (Azure PR 431) deployed at 10:55 UTC to set a proper set of pod IP ranges removed all node pools of the cluster.
- Root cause
- Component
- Contributing factor
- Detection
After the upgrade, at 10:30 UTC, the team noticed that services inside the cluster, such as accounts.jenkins.io, could not reach the LDAP service.
- Remediation
- Created the cluster again from scratch with a fixed network setup
- Set a custom pod CIDR in a range separate from the virtual network
- Moved the services and their DNS records to new public IPs
- Pushed a pull request that recorded the manual rebuild, including the IP setup, in code
- Action items
- Protect the public IPs from deletion with a Management Lock
- Keep the public IPs in a separate resource group and point the Kubernetes-managed load balancers to it with the service.beta.kubernetes.io/azure-load-balancer-resource-group annotation
- Improve network diagrams and documentation so possible overlaps are visible when preparing operations
- Avoid changing the configuration of all AKS node pools at once
- Lessons
The team said that changing one node pool at a time would have shown the problem after the first pool and avoided a full outage, and that the public IPs should change as little as possible because users behind corporate firewalls with allow-lists depend on them. The team also noted that it could rebuild, in under 4 hours, the cluster that hosts almost all public services.
IL-0522An ingress-nginx chart upgrade deleted the jenkins.io Ingress and Fastly served HTTP/503 errors for hoursJenkins project2021- Symptoms
At 11:32 UTC on 18 November 2021, a user reported in the jenkinsci/jenkins Gitter channel that https://www.jenkins.io/doc/pipeline/steps/ was answering HTTP/503 errors with the message "Guru meditation" from Fastly's varnish.
- Trigger
The ingress-nginx Helm chart was upgraded from 4.0.6 to 4.0.8 at 10:42 UTC, and the new chart added an admission webhook rule that forbids Nginx configuration blocks in Ingress annotations.
- Root cause
- Component
- Contributing factor
- Detection
A user reported in the jenkinsci/jenkins Gitter channel at 11:32 UTC that a jenkins.io page answered HTTP/503 errors, and status.jenkins.io reported the incident at 11:49 UTC.
- Remediation
- Disabled the automated systems, rolled the ingress-nginx chart back to 4.0.6 and deleted the admission webhook by hand
- Removed the forbidden annotations from the jenkins.io configuration
- Upgraded the jenkins.io Helm chart to the last version known to work with ingress-nginx 4.0.8
- Redeployed the jenkins.io Helm chart through the automated system and told Fastly to drop all cached pages
- Action items
- Always read the changelog in depth when updating the ingress controllers, with two people pairing in real time
- Add custom Datadog monitoring for www.origin.jenkins.io so that such an outage is detected
- Make the monitor send the Host header www.jenkins.io so it is not redirected to Fastly
- Check a set of pages, such as the pipeline steps page, not only the front page
- Consider an ephemeral k3s end-to-end test before deploying to production
- Lessons
Trusting a patch version of a Helm chart for the Ingress controller without reading its changelog in depth let a new admission rule remove the jenkins.io Ingress in production. Without monitoring on origin.jenkins.io, a user found the outage. A complete staging cluster with the same DNS setup would have caught the problem before production.
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 5 cases involve Cloud load balancer and Admission webhook. 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 cause3
Software defect1 case
- Component
- Contributing factor
- Organisation
Configuration change3 cases
- Component
- 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-0473Jenkins infrastructure went fully down after a pod IP range fix deleted every AKS node pool and could not recreate themJenkins project2023IL-0061A Terraform pull request merged out of order deleted a production GKE cluster, and recreating it deleted a second oneSpotify2019
Breaking change in an upgrade1 case
- Contributing factor
- Organisation