{"id":"IL-0111","org":"DFDS","date":"2021-08-26","docs":[],"title":{"en":"Switching 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 hour","ko":"메인 인그레스 컨트롤러를 Traefik v2 로 바꾸자 X-Forwarded 헤더가 전달되지 않아 Okta 로그인이 깨졌고, DFDS 온라인 예약이 한 시간 넘게 멈췄다"},"domain":["kubernetes","aws","networking"],"impact":{"scope":"every service using Okta authentication; complete loss of online bookings for a bit over 1 hour","users":"unknown","region":"unknown"},"review":{"written_by":"session","reviewed_at":null,"reviewed_by":null},"lessons":{"en":"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.","ko":"Cloud Engineering 팀이 모든 시나리오를 시험할 수는 없었다. 팀은 자기 애플리케이션 몇 개로 몇 주 동안 시험했지만 Okta 로그인 흐름의 문제는 잡지 못했다. 마이그레이션 전후의 요청 헤더를 비교했다면 미리 알 수 있었을지도 모른다는 물음도 남았다."},"related":[],"sources":[{"url":"https://github.com/dfds/postmortems/blob/master/PM2021-008%20-%20Kubernetes%20ingress%20controller%20Traefik%20v2%20configuration%20caused%20outage.md","kind":"github","license":"unknown","archived":null}],"summary":{"en":"On August 26, 2021, as part of moving off Traefik v1, DFDS made Traefik v2 the main Kubernetes ingress controller by pointing the AWS load balancers at it. A misconfiguration kept Traefik v2 from forwarding the X-Forwarded headers, so x-forwarded-proto reached applications as http instead of https. The Okta authentication workflow broke for every service that used Okta, and the online booking system was completely down for a little over an hour.\n\nFunctional tests after the switch looked fine, and the problem was noticed 64 minutes later through a developer's report of many HTTP 307 redirects. Because the booking system was critical, the team rolled back before investigating further, and service was back at 09:49 UTC, 87 minutes after the change. The root cause was found afterwards in a deep dive with the Okta team. Among the contributing factors, DFDS lists the overlooked header change, the long detection time, the expectation that every team watches its own application after critical changes, and Slack announcements that get lost among other messages.","ko":"DFDS 는 쿠버네티스 인그레스 컨트롤러 Traefik v1 을 걷어 내는 마이그레이션 작업으로 메인 인그레스 컨트롤러를 Traefik v2 로 바꿨다. 새 설정이 잘못되어 insecure 헤더로 취급되는 X-Forwarded- 헤더가 전달되지 않았다. 그 결과 x-forwarded-proto 값이 https 에서 http 로 바뀌었고, Okta 인증 흐름이 깨졌다. Okta 를 쓰는 서비스가 모두 영향을 받았고, 온라인 예약이 1시간 남짓 완전히 멈췄다.\n\n기능 테스트는 정상으로 나왔고, 문제는 변경 64분 뒤 개발자의 보고로 드러났다. 09:26 UTC 에 Cloud Engineering 팀과 개발자가 조사를 시작했지만, 서비스가 중요한 만큼 조사보다 롤백을 먼저 했다. 09:48 UTC 에 롤백했고 09:49 UTC 에 서비스가 정상으로 돌아왔다. 10:00 UTC 부터 Okta 팀과 함께 깊이 조사했고, 나중에 근본 원인을 찾았다. DFDS 는 장애에 영향을 준 요인으로 세 가지를 꼽았다. 탐지가 지나치게 늦었다. 중요한 변경 뒤 자기 애플리케이션을 지켜볼 책임이 각 팀에 있었다. Slack 공지는 다른 메시지에 묻히곤 했다."},"trigger":{"en":"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.","ko":"Traefik v1 을 걷어 내는 마이그레이션 작업으로 08:22 UTC 에 AWS 로드밸런서가 새 Traefik v2 리버스 프록시로 요청을 보내도록 바뀌었다."},"severity":"unknown","symptoms":["service-unavailable"],"timeline":{"detected_after":"64m","resolved_after":"1h27m"},"date_kind":"incident","detection":{"en":"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.","ko":"09:26 UTC 에 한 개발자가 HTTP 307 리다이렉트가 많다고 보고하면서 문제가 드러났다. 특히 Okta 서비스에서 많았다. 변경 뒤 64분 만이었다. 09:32 UTC 에는 온라인 예약 시스템이 다운됐다는 연락을 받았다."},"components":["ingress","cloud-load-balancer"],"root_cause":"config-change","remediation":[{"text":{"en":"Rolled back the switch to Traefik v2, putting rollback ahead of investigation because of how critical the booking system is","ko":"조사보다 롤백을 먼저 하기로 하고 09:48 UTC 에 변경을 롤백했다."}}],"action_items":[{"text":{"en":"Consider how critical announcements can be made more visible","ko":"중요한 공지가 더 잘 보이게 할 방법을 검토한다."}},{"text":{"en":"Consider whether the ALBs used for testing should have been shared with the teams so they could test their own scenarios","ko":"시험에 쓴 ALB 를 각 팀에 알려 팀이 자기 시나리오를 직접 시험하게 했어야 하는지 검토한다. 이번에 멈춘 서비스는 ALB 앞에 CloudFront 가 있어서 그렇게 했어도 시험하기 어려웠을 수 있다."}}],"contributing":["review-missed","monitoring-blind-spot"],"recurrence_of":null,"symptoms_text":{"en":"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.\n\nThe cause turned out to be request headers: Traefik v2 was configured so that it did not forward the insecure \"X-FORWARDED-\" headers, and the x-forwarded-proto header that applications received changed from https to http. That broke the Okta authentication workflow for every service using Okta. The headers had been checked before the migration, but this change was missed.","ko":"09:26 UTC 에 한 개발자가 HTTP 307 리다이렉트 응답이 유난히 많다고 알렸다. 특히 Okta 서비스에서 많았다. 6분 뒤인 09:32 UTC 에 온라인 예약 시스템이 다운됐다는 연락이 왔다.\n\n앞서 08:22 UTC 에 AWS 로드밸런서가 새 Traefik v2 리버스 프록시로 요청을 보내도록 바뀌었다. 08:44 UTC 에 돌린 기능 테스트는 모두 정상이었고, 이 결과가 Slack 에 공유됐다. 새 프록시 뒤에서 x-forwarded-proto 헤더 값은 https 에서 http 로 바뀌어 있었다. 마이그레이션 전에 요청 헤더를 확인했지만 이 변화는 놓쳤다."},"updated_at":"2026-11-10T00:00:33.839131Z","url":"https://benchlet.com/incidentlib/app/cases/IL-0111","org_slug":"dfds"}