{"id":"IL-0512","org":"MIT Open Learning","date":"2026-06-03","docs":[],"title":{"en":"xpro.mit.edu returned 503 for an hour when its Kubernetes/APISIX origin certificate expired after renewal failed","ko":"xPRO 의 쿠버네티스 APISIX 오리진 인증서가 갱신되지 못하고 만료되어 xpro.mit.edu 가 한 시간 동안 503 을 냈다"},"domain":["kubernetes","networking","aws"],"impact":{"scope":"The public xPRO site https://xpro.mit.edu and the xPRO production CMS returned 503 errors","users":"xPRO customers could not reliably access the production site","region":"unknown"},"review":{"written_by":"session","reviewed_at":null,"reviewed_by":null},"lessons":{"en":"Reading the outage as a failed cert-manager ACME renewal was true but incomplete; the missing part was that Fastly had been set to manage validation for a backend origin domain that belonged to cert-manager. The team concluded that TLS certificates and DNS validation records need guardrails around ownership, and that public Fastly frontend domains and Kubernetes/APISIX origin domains must not be treated as interchangeable service domains in TLS automation.","ko":"이 장애는 처음에 cert-manager 의 ACME 갱신 실패로 이해됐다. 그 이해는 맞았지만 모자랐고, 빠진 진단은 Fastly 가 cert-manager 의 몫인 백엔드 오리진 도메인의 검증까지 관리하도록 설정돼 있었다는 점이었다. 갱신 실패를 일찍 잡지 못한 것은 cert-manager 가 관리하는 백엔드 오리진 도메인이 Fastly TLS 구독에 들어가면 안 된다는 것을 검사하는 장치나 테스트가 없었기 때문이다.\n\n팀은 TLS 인증서와 DNS 검증 레코드를 누가 맡는지 경계를 분명히 정하고 그 경계를 지키는 장치를 둬야 한다고 정리했다. 특히 TLS 자동화를 설정할 때 Fastly 의 공개 프런트엔드 도메인과 쿠버네티스 APISIX 백엔드 오리진 도메인을 바꿔 써도 되는 같은 서비스 도메인으로 다루면 안 된다."},"related":[],"sources":[{"url":"https://engineering.ol.mit.edu/runbooks_post_mortems/20260603_xpro_outage/","kind":"runbook","archived":null}],"summary":{"en":"The non-OpenEdX xPRO application at MIT Open Learning used two domains: xpro.mit.edu, the public frontend served by Fastly, and xpro-web.odl.mit.edu, the backend origin on Kubernetes behind APISIX. cert-manager issued the origin certificate from Let's Encrypt with DNS-01 validation in Route 53. The application's Pulumi code, however, passed every Fastly service domain into the Fastly TLS subscription, so Fastly also created DNS validation records for the backend domain, including a CNAME at _acme-challenge.xpro-web.odl.mit.edu. That CNAME conflicted with the TXT record cert-manager needed for its DNS-01 challenge.\n\nFrom 4 May 2026 cert-manager's renewal could not complete validation, the ACME order went stale, and the origin certificate expired at 3:29 PM EDT on 3 June. Fastly could no longer connect to the origin and the site returned 503 errors. An engineer deleted and recreated the stale cert-manager certificate resources, cert-manager issued a fresh certificate, and service was restored at 4:38 PM EDT. After the incident, PR mitodl/ol-infrastructure#4713 changed the Fastly TLS subscription to cover only xpro.mit.edu, leaving the origin certificate to cert-manager; no edxapp or xpro-openedx changes were needed.","ko":"MIT Open Learning 의 OpenEdX 가 아닌 xPRO 애플리케이션은 공개 프런트엔드 도메인 xpro.mit.edu 와 백엔드 도메인 xpro-web.odl.mit.edu 를 따로 쓴다. xpro-web.odl.mit.edu 는 쿠버네티스 APISIX 백엔드 오리진이고, 그 인증서는 cert-manager 가 Route 53 의 DNS-01 검증으로 Let's Encrypt 에서 받는다. 그런데 Pulumi 코드가 Fastly TLS 구독에 Fastly 서비스의 도메인 전부를 넘겼고, Fastly 는 두 도메인 모두의 DNS 검증 레코드를 만들었다. 그 가운데 _acme-challenge.xpro-web.odl.mit.edu CNAME 이 같은 이름에 cert-manager 가 만들어야 하는 DNS-01 TXT 레코드를 막았다.\n\n2026-05-04 에 시작된 갱신은 끝나지 못했고, ACME Order 는 오래되어 정리됐으며, 오리진 인증서는 2026-06-03 오후 3시 29분 EDT 에 만료됐다. 9분 뒤 CMS 와 본 사이트의 503 알림이 울렸다. Fastly 가 만료된 인증서 때문에 오리진에 연결하지 못해 고객이 xPRO 운영 사이트에 제대로 접속하지 못했다. 장애 등급은 SEV1 이었다. 오후 4시 8분 EDT 에 Rootly 장애가 열렸고, 오후 4시 16분에 재시작한 cert-manager 는 Let's Encrypt 에서 404: No order for ID 507326254665 를 받고 발급에 실패했다.\n\n엔지니어가 오후 4시 27분 EDT 쯤 만료된 인증서와 오래된 ACME Order 를 찾았고, 오후 4시 38분 EDT 에 관련 cert-manager 인증서 자원을 손으로 다시 만들어 서비스를 되살렸다. 장애가 끝난 뒤의 검토에서 Fastly TLS 구독 설정이 결함으로 밝혀졌다. PR mitodl/ol-infrastructure#4713 이 Fastly TLS 구독의 도메인을 domains=[frontend_domain] 으로 바꿔 Fastly 는 xpro.mit.edu 의 공개 엣지 인증서만 관리하고 오리진 인증서는 cert-manager 가 맡게 했다. edxapp 과 xpro-openedx 는 바꿀 필요가 없었다."},"trigger":{"en":"The origin certificate xpro-cert for xpro-web.odl.mit.edu, issued on 2026-03-05 with a 90-day validity period, expired at 3:29 PM EDT on 3 June 2026.","ko":"cert-manager 가 2026-05-04 에 xpro-web.odl.mit.edu 인증서의 갱신 구간에 들어가 DNS-01 검증을 시작했다. 이 검증이 Fastly 가 만든 _acme-challenge.xpro-web.odl.mit.edu CNAME 과 부딪혀 끝나지 못했고, 기존 오리진 인증서가 2026-06-03 오후 3시 29분 EDT 에 만료됐다."},"severity":"sev1","symptoms":["service-unavailable","tls-certificate-errors"],"timeline":{"detected_after":"9m","resolved_after":"1h 9m"},"date_kind":"incident","detection":{"en":"Alerts for the xPRO production CMS and the main xPRO site fired at 3:38 PM EDT on the 503 errors, and a Rootly incident was created at 4:08 PM EDT.","ko":"오후 3시 38분 EDT 에 xPRO 운영 CMS 와 xPRO 본 사이트가 503 을 낸다는 알림이 울렸다. 인증서가 만료된 지 9분 뒤였다."},"components":["cert-manager","cdn","dns-server"],"root_cause":"config-change","remediation":[{"text":{"en":"Deleted and recreated the stale cert-manager certificate resources so that cert-manager issued a fresh origin certificate","ko":"오래된 cert-manager 자원을 지우고 다시 만들어 cert-manager 가 백엔드 오리진의 새 인증서를 발급하게 했다. 이것으로 서비스가 돌아왔다."}}],"action_items":[{"text":{"en":"Remove the backend origin domain from the non-OpenEdX xPRO Fastly TLS subscription, so Fastly manages only xpro.mit.edu","ko":"OpenEdX 가 아닌 xPRO 의 Fastly TLS 구독에서 백엔드 오리진 도메인을 뺐다."}},{"text":{"en":"Deploy the Pulumi update for the xPRO application in Production","ko":"src/ol_infrastructure/applications/xpro 의 Production 스택에 Pulumi 변경을 배포했다."}},{"text":{"en":"Trigger cert-manager renewal of the xPRO certificate after the conflicting Fastly validation CNAME is removed","ko":"Fastly 의 검증 CNAME 을 뺀 뒤, xpro 네임스페이스에 있는 OpenEdX 가 아닌 xPRO 인증서를 cert-manager 로 직접 갱신하거나 cert-manager 가 저절로 갱신하게 했다."}},{"text":{"en":"Consider tests or policy checks that keep cert-manager-managed origin domains out of Fastly TLS subscriptions","ko":"cert-manager 가 관리하는 오리진 도메인이 Fastly TLS 구독에 들어가지 못하게 막는 테스트나 정책 검사를 넣는 방안을 검토한다."}},{"text":{"en":"Consider alerting earlier on failed cert-manager CertificateRequests and Orders, so stale ACME failures are found before the certificate expires","ko":"cert-manager 의 CertificateRequest 와 Order 가 실패하면 더 일찍 알림을 보내, 인증서가 만료되기 전에 오래된 ACME 실패를 찾는 방안을 검토한다."}}],"contributing":["no-config-tests","monitoring-blind-spot","delayed-effect-change"],"recurrence_of":null,"symptoms_text":{"en":"At 3:38 PM EDT on 3 June 2026, alerts fired because both the xPRO production CMS and the main xPRO site at https://xpro.mit.edu were returning 503 errors. Fastly, in front of the site, could not connect to the Kubernetes/APISIX origin, because the origin certificate for xpro-web.odl.mit.edu had expired at 3:29 PM EDT.\n\nIn the cluster, the certificate xpro-cert had expired and its cert-manager ACME order was stale. When the cert-manager pod restarted at 4:16 PM EDT and re-evaluated the stale order, Let's Encrypt answered \"404: No order for ID 507326254665\" and the issuance was marked failed.\n\nThe renewal had been failing for a month. cert-manager entered the 30-day renewal window on 4 May 2026 and created xpro-cert-2 with a new CertificateRequest, Order and DNS-01 Challenge, but the challenge did not complete, Let's Encrypt deactivated the ACME authorization, and by late May or early June the order was stale. The first diagnosis stopped at a failed cert-manager renewal; why the DNS-01 challenge failed was found only in a later review.","ko":"2026-06-03 오후 3시 38분 EDT 에 xPRO 운영 CMS 와 xPRO 본 애플리케이션이 503 을 낸다는 알림이 함께 울렸다. 공개 사이트 https://xpro.mit.edu 에 고객이 제대로 접속하지 못했다.\n\nFastly 는 쿠버네티스 APISIX 백엔드 오리진인 xpro-web.odl.mit.edu 에 제대로 연결하지 못했다. 이 오리진의 인증서가 오후 3시 29분 EDT, 곧 19:29 UTC 에 만료됐기 때문이다.\n\n인증서 갱신은 한 달 전부터 실패하고 있었다. 2026-05-04 에 cert-manager 가 30일 갱신 구간에 들어가 xpro-cert-2 를 만들었고, 여기에는 새 CertificateRequest, Order, DNS-01 Challenge 가 들어 있었다. 그러나 Challenge 가 끝나지 않았고 Let's Encrypt 는 ACME 인가를 비활성화했다. 5월 말과 6월 초 사이에 Challenge 는 만료된 채 남았고 Let's Encrypt 의 Order 는 오래되어 정리됐다.\n\n장애 중 오후 4시 16분 EDT 에 cert-manager 파드가 재시작하며 오래된 Order 를 다시 평가했다. 2분 뒤 cert-manager 가 Let's Encrypt 에 물었다가 404: No order for ID 507326254665 를 받았고, 발급은 실패로 표시됐다.\n\n오후 4시 27분 EDT 쯤 엔지니어가 쿠버네티스와 cert-manager 상태를 살펴 xpro-cert 가 만료됐고 ACME Order 가 오래되어 갱신을 끝낼 수 없다는 것을 찾았다. 이때는 cert-manager 의 ACME 갱신 실패로만 이해했고, Fastly 가 _acme-challenge.xpro-web.odl.mit.edu 레코드를 차지했다는 원인은 장애가 끝난 뒤의 검토에서 찾았다."},"updated_at":"2026-11-14T12:34:15.641628Z","url":"https://benchlet.com/incidentlib/app/cases/IL-0512","org_slug":"mit-open-learning"}