Cases2 cases
1 to 2 of 2
IL-0111Switching the main Kubernetes ingress controller from Traefik v1 to v2 stopped X-Forwarded headers being passed, which broke the Okta login flow for every service using Okta and stopped DFDS online bookings for over an hourDFDS2021- Symptoms
After the switch to Traefik v2, functional tests indicated that everything was fine, and this was reported on Slack at 08:44 UTC. The first sign of trouble came at 09:26 UTC, when a developer reported a high count of HTTP 307 redirects, especially on the Okta service. At 09:32 UTC the team learned that the online booking system was down.
- Trigger
At 08:22 UTC the AWS load balancers were updated to send requests to the new Traefik v2 reverse proxy as part of the migration away from Traefik v1.
- Root cause
- Component
- Contributing factor
- Detection
A developer reported a high count of HTTP 307 redirects, in particular on the Okta service, at 09:26 UTC, 64 minutes after the change; six minutes later the team was told the online booking system was down. The functional tests run after the switch had not caught it.
- Remediation
- Rolled back the switch to Traefik v2, putting rollback ahead of investigation because of how critical the booking system is
- Action items
- Consider how critical announcements can be made more visible
- Consider whether the ALBs used for testing should have been shared with the teams so they could test their own scenarios
- Lessons
Cloud Engineering cannot test every application scenario on its own, even after testing its own applications for weeks. A header that changes value behind a new ingress controller, here x-forwarded-proto going from https to http, can break an authentication flow while basic functional tests still pass. DFDS asks whether diffing request headers before and after the migration would have shown the problem in advance.
IL-0052A cryptocurrency miner ran on every node of the development and staging clusters through a public, unauthenticated Weave Scope dashboardJW Player2019- Symptoms
Datadog alerted the DevOps team to a high normalised load average, first on the staging cluster (Day 0, 21:06 EST) and the next day on the development cluster (Day 1, 16:53 EST). The load was first put down to a legitimate service that kept scaling up and down in both environments, and because of the volume of identical alerts they were muted until things settled.
- Trigger
An automated crawler found the Weave Scope dashboard on a public load balancer that required no authentication. Weave Scope can open a shell in running containers, and its scope-agent containers ran privileged, as root and with the host's root filesystem mounted, so a command started there could run on the host.
- Root cause
- Component
- Contributing factor
- Detection
Datadog alerts on high normalised load average, muted at first as noise from a legitimate service; on Day 3 an engineer ran top on a node and found the gcc process at 100% CPU.
- Remediation
- stopped Weave Scope and removed its deployment from all Kubernetes clusters
- checked access logs for unauthorised access to the instances
- confirmed the miner's outbound connections went only to a mining pool
- isolated one affected node for later investigation
- rotated out every node in each cluster so all affected hosts were destroyed and rebuilt
- Action items
- Audit all Kubernetes and deployment YAML files and security groups for services that are unintentionally public or misconfigured
- Replace load-average alerts with more meaningful monitors and tune them to signal a real anomaly
- Research tools such as falcon or sysdig for behavioural monitoring and anomaly and intrusion detection
- Evaluate Istio and Linkerd for observing and controlling end-to-end network traffic
- Analyse the cost of scanning Docker images and containers for known vulnerabilities
- Set aside time in architecture discussions to revisit older choices such as running containers as root
- Share knowledge of large projects, such as Kubernetes version migrations, across the whole team
- Lessons
Load average was not a useful signal for spotting a problem in the clusters, and muted noisy alerts nearly hid the miner. A load balancer that Kubernetes creates belongs to Kubernetes: a manual security group edit in the AWS console is reverted, so internal exposure must be declared in the Kubernetes YAML. A dashboard that can open shells, in front of privileged agents that mount the host's root filesystem, gives whoever reaches it root on every node.
These 2 cases involve Cloud load balancer and Cluster dashboard. 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-0111Switching the main Kubernetes ingress controller from Traefik v1 to v2 stopped X-Forwarded headers being passed, which broke the Okta login flow for every service using Okta and stopped DFDS online bookings for over an hourDFDS2021IL-0052A cryptocurrency miner ran on every node of the development and staging clusters through a public, unauthenticated Weave Scope dashboardJW Player2019