Cases5 cases
1 to 5 of 5
- 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-0106A malformed Traefik IngressRoute triggered a Traefik v2 bug once a node rollover restarted every Traefik pod, and all Kubernetes services returned 404DFDS2021- Symptoms
At 08:00 UTC on 2021-09-06 every service in DFDS's Kubernetes cluster answered with 404. Investigation started five minutes later.
- Trigger
The automated Kubernetes node rollover on 2021-09-06 restarted all the Traefik v2 pods, five days after a malformed IngressRoute manifest had been applied.
- Root cause
- Component
- Contributing factor
- Detection
All services returned 404 from 08:00 UTC and root cause investigation started at 08:05. Time to detection was 5 minutes.
- Remediation
- changed the ALB health check path, which made the targets healthy but did not stop the 404s
- rolled back by hand to Traefik v1 as the main ingress controller
- deleted the malformed IngressRoute by hand and confirmed the Traefik v2 bug
- applied the changes upstream
- Action items
- Upgrade Traefik to v2.5, where the bug is fixed, and verify that it removes the bug
- Change the Traefik v2 health check path to something more robust
- Set up an external liveness probe on the ingress controller
- Consider workload segmentation to limit the blast zone
- Look into monitoring the Traefik v2 API for rapid changes
- Look into smoke testing during and after node rollover
- Lessons
A malformed IngressRoute did nothing visible for five days and then took down all ingress when every Traefik v2 pod had restarted during a node rollover. Because Traefik v2 failed gracefully, the first signals pointed at the ALB health checks instead of at Traefik. On incident handling, the team concluded that appointing an incident manager could have helped, that the war room meeting should be recorded and a log book kept, that people not involved should only make suggestions in writing, and that a short first round of sharing thoughts and gut feelings is useful.
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-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-0365A Terraform change to auto-scaling groups detached all worker nodes from both ALBs and cut off every cluster serviceDFDS2020- Symptoms
On 9 June 2020 at 12:25 CET a CloudWatch alert fired on a high count of 5XX responses from the AWS Application Load Balancers (ALBs) of DFDS's Hellman Kubernetes cluster, and at 12:28 the SRE team verified that no ingress traffic was reaching the cluster. Every service running inside the cluster was unreachable from outside it, because both ALBs, the authenticated one and the one without authentication, no longer had any Kubernetes worker nodes attached.
- Trigger
Planned maintenance to split the Hellman cluster's auto-scaling groups by availability zone applied Terraform changes at 12:20 CET that removed the ALB instance attachments.
- Root cause
- Component
- Contributing factor
- Detection
A CloudWatch alert detected a high count of 5XX responses for the ALBs, and the lack of ingress traffic was then verified.
- Remediation
- Attached the worker node instances to the ALBs by hand
- Implemented a permanent fix within the hour
- Action items
- Implement alerts on healthy and unhealthy ALB targets for more precise and immediate notice
- Reduce alert noise further
- Implement host name resolution for Goldpinger
- Lessons
General alert noise is still too high, there was no alert on healthy and unhealthy ALB targets, and test clusters should check ingress through the ALBs.
These 5 cases involve Cloud load balancer and Terraform. 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 cause2
Configuration change4 cases
- Component
- Contributing factor
- Organisation
IL-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-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-0105Replacing the AWS VPC CNI during a Terraform refactoring detached the ALB target groups, and every service in the Kubernetes cluster returned 503DFDS2021IL-0365A Terraform change to auto-scaling groups detached all worker nodes from both ALBs and cut off every cluster serviceDFDS2020
Software defect1 case
- Contributing factor
- Organisation