{"id":"IL-0522","org":"Jenkins project","date":"2021-11-18","docs":["https://github.com/jenkins-infra/charts/pull/1708","https://github.com/jenkins-infra/charts/pull/1724","https://github.com/jenkins-infra/charts/commit/aa9f5293ae38b6958a4fde6a9196333d1cb68908","https://github.com/jenkins-infra/charts/commit/03d55efab4a69fc2c947b56495073363775426cc","https://github.com/jenkins-infra/charts/commit/93a6228823b404ee5b3108ec72db5ab52db4738a","https://github.com/jenkins-infra/charts/pull/1736/files"],"title":{"en":"An ingress-nginx chart upgrade deleted the jenkins.io Ingress and Fastly served HTTP/503 errors for hours","ko":"ingress-nginx Helm 차트 패치 업그레이드 뒤 jenkins.io 의 Ingress 가 지워져 사이트가 HTTP/503 을 냄"},"domain":["kubernetes","networking"],"impact":{"scope":"jenkins.io (also www.jenkins.io) was unavailable and answered HTTP/503 from 11:07 to 13:40 UTC and from 15:30 to 17:11 UTC on 18 November 2021","users":"unknown","region":"unknown"},"review":{"written_by":"session","reviewed_at":null,"reviewed_by":null},"lessons":{"en":"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.","ko":"인그레스 컨트롤러처럼 민감한 구성 요소는 패치 버전 업그레이드라도 변경 기록을 깊이 확인해야 한다. 원본 호스트인 origin.jenkins.io 를 직접 지켜보는 모니터링이 없으면 CDN 뒤에서 난 오류를 사용자 신고로 처음 알게 된다."},"related":[],"sources":[{"url":"https://github.com/jenkins-infra/documentation/blob/main/postmortem/20211118-jenkinsio-outage.md","kind":"github","archived":null}],"summary":{"en":"Fastly serves jenkins.io from an Ingress in the Jenkins infrastructure Kubernetes cluster. At 10:42 UTC on 18 November 2021 the ingress-nginx Helm chart was upgraded from 4.0.6 to the patch version 4.0.8, which brought a new admission webhook rule forbidding Ingress annotations that contain an Nginx configuration block. The jenkins.io Ingress rule did not comply and was deleted, the cluster answered HTTP/404 to Fastly, and from 11:07 UTC Fastly dropped pages from its cache and served HTTP/503. A user reported the errors at 11:32 UTC; no monitoring covered origin.jenkins.io. The team had trusted the patch version of a chart for a sensitive component, the Ingress controller, without a deep read of its changelog.\n\nAt 13:40 UTC the team disabled its automated systems, rolled the chart back to 4.0.6 and deleted the admission webhook by hand, which ended the first outage after 2h 37min. At 15:30 UTC, after a first batch of changes to the jenkins.io configuration, the chart was deployed at 4.0.8 again and caused a second outage. The fixes removed the forbidden annotations and upgraded the jenkins.io Helm chart to the last version known to work with ingress-nginx 4.0.8. At 17:11 UTC all required fixes had been applied, the automated system redeployed the jenkins.io Helm chart, the website was back and Fastly was told to drop all cached pages, ending the second outage after 1h 41min. The upgrade to ingress-nginx 4.0.9 was later done after a deep changelog check.","ko":"2021년 11월 18일 10:42 UTC 에 Jenkins 인프라 팀은 쿠버네티스 클러스터의 nginx Helm 차트를 패치 버전인 4.0.6 에서 4.0.8 로 올렸다. 새 버전은 Nginx 설정 블록이 든 Ingress 어노테이션을 막는 어드미션 웹훅 규칙을 만들었고, 쿠버네티스는 이 규칙에 맞지 않는 jenkins.io 의 Ingress 규칙을 지웠다. 지워진 Ingress 규칙은 jenkins.io 와 함께 www.jenkins.io, origin.jenkins.io, www.origin.jenkins.io 도 받고 있었다. 원본이 HTTP/404 를 내자 11:07 UTC 부터 Fastly 가 jenkins.io 페이지 일부를 캐시에서 내렸고, 그 페이지들은 HTTP/503 이 됐다. 11:32 UTC 에 사용자가 Gitter 에 신고했고 11:49 UTC 에 status.jenkins.io 에 장애 공지가 올라갔다.\n\n13:40 UTC 에 팀은 자동화 시스템을 모두 멈춘 채 nginx Helm 차트를 4.0.6 으로 롤백하고 어드미션 웹훅 구성을 손으로 지워 jenkins.io 를 되살렸다. 15:30 UTC 에 jenkins.io 설정의 첫 번째 수정을 적용한 뒤 Nginx Helm 차트를 다시 4.0.8 로 배포했는데, 이 배포가 두 번째 장애를 냈다. 17:11 UTC 에 필요한 수정을 모두 적용하자 자동화 시스템이 jenkins.io Helm 차트를 다시 배포해 사이트가 돌아왔고, 팀은 Fastly 에 모든 페이지의 캐시를 비우게 했다.\n\n팀은 두 가지가 잘못됐다고 밝혔다. 인그레스 컨트롤러라는 민감한 구성 요소의 Helm 차트를 패치 버전이라고 믿고 변경 기록을 깊이 확인하지 않았고, origin.jenkins.io 에는 오류가 보일 때 알려 줄 모니터링이 없었다."},"trigger":{"en":"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.","ko":"2021년 11월 18일 10:42 UTC 에 nginx Helm 차트를 패치 버전인 4.0.6 에서 4.0.8 로 올리는 배포가 성공했다. 새 버전은 `{}` 같은 Nginx 설정 블록이 든 Ingress 어노테이션을 막는 어드미션 웹훅 규칙을 새로 만들었다."},"severity":"unknown","symptoms":["service-unavailable","resources-deleted"],"timeline":{"detected_after":"25m","resolved_after":"6h 4m"},"date_kind":"incident","detection":{"en":"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.","ko":"장애가 시작되고 25분 뒤인 11:32 UTC 에 사용자가 Gitter 채널 jenkinsci/jenkins 에 신고해 알았다. origin.jenkins.io 에는 오류를 알릴 모니터링이 없었다."},"components":["ingress","admission-webhook","helm","cdn"],"root_cause":"upgrade-breaking-change","remediation":[{"text":{"en":"Disabled the automated systems, rolled the ingress-nginx chart back to 4.0.6 and deleted the admission webhook by hand","ko":"13:40 UTC 에 자동화 시스템을 모두 멈춘 채 nginx Helm 차트를 이전 버전 4.0.6 으로 롤백하고, 어드미션 웹훅 구성을 손으로 지워 jenkins.io 를 되살렸다."}},{"text":{"en":"Removed the forbidden annotations from the jenkins.io configuration","ko":"jenkins-infra/charts 에서 jenkins.io 설정의 금지된 어노테이션을 지웠다."}},{"text":{"en":"Upgraded the jenkins.io Helm chart to the last version known to work with ingress-nginx 4.0.8","ko":"jenkins.io Helm 차트를 nginx 4.0.8 에서 제대로 동작한다고 알려진 마지막 버전으로 올렸다."}},{"text":{"en":"Redeployed the jenkins.io Helm chart through the automated system and told Fastly to drop all cached pages","ko":"필요한 수정을 모두 적용한 뒤 17:11 UTC 에 자동화 시스템이 jenkins.io Helm 차트를 다시 배포해 사이트가 돌아왔고, Fastly 에 모든 페이지의 캐시를 비우게 했다."}}],"action_items":[{"text":{"en":"Always read the changelog in depth when updating the ingress controllers, with two people pairing in real time","ko":"인그레스 컨트롤러를 업데이트할 때는 항상 변경 기록을 깊이 읽고, 적어도 두 사람이 실시간으로 함께 본다."}},{"text":{"en":"Add custom Datadog monitoring for www.origin.jenkins.io so that such an outage is detected","ko":"www.origin.jenkins.io 의 장애를 잡아내도록 Datadog 에 이 도메인의 모니터링을 더한다."}},{"text":{"en":"Make the monitor send the Host header www.jenkins.io so it is not redirected to Fastly","ko":"이 모니터링은 Host 헤더를 www.jenkins.io 로 보내, Fastly 를 거치는 jenkins.io 로 리디렉션되지 않게 한다."}},{"text":{"en":"Check a set of pages, such as the pipeline steps page, not only the front page","ko":"첫 페이지만이 아니라 pipeline steps 페이지 같은 여러 페이지를 점검 대상에 넣는다."}},{"text":{"en":"Consider an ephemeral k3s end-to-end test before deploying to production","ko":"운영에 배포하기 전에 k3s 로 잠깐 띄웠다 지우는 엔드 투 엔드 시험 환경을 두는 방안을 다음 분기에 검토한다."}}],"contributing":["assumption-unverified","failure-delayed-by-cache","monitoring-blind-spot","manual-action-worsened"],"recurrence_of":null,"symptoms_text":{"en":"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.\n\nThe failure had started with an upgrade of the ingress-nginx Helm chart from 4.0.6 to 4.0.8, a patch version, at 10:42 UTC. The new chart created an admission webhook rule that forbids any Ingress annotation containing an Nginx configuration block, such as any `{}`. The Ingress rule for jenkins.io, www.jenkins.io, origin.jenkins.io and www.origin.jenkins.io did not comply and was deleted, so the pages answered HTTP/404 to Fastly.\n\nFrom 11:07 UTC Fastly began to drop pages of jenkins.io from its cache because it could not update them from the Kubernetes cluster, and jenkins.io answered HTTP/503. There was no monitoring on origin.jenkins.io to report the errors once they were visible, and status.jenkins.io reported the incident at 11:49 UTC.\n\nA manual fix brought jenkins.io back at 13:40 UTC. At 15:30 UTC, after a first batch of changes to the jenkins.io configuration in Kubernetes, the ingress-nginx chart was deployed at 4.0.8 again and jenkins.io went down a second time, until 17:11 UTC.","ko":"2021년 11월 18일 11:32 UTC, 한 사용자가 Gitter 채널 jenkinsci/jenkins 에 https://www.jenkins.io/doc/pipeline/steps/ 가 HTTP/503 오류를 낸다고 알렸다. 화면에는 Fastly 의 Varnish 가 내는 \"Guru meditation\" 메시지가 떴다.\n\n쿠버네티스가 jenkins.io, www.jenkins.io, origin.jenkins.io, www.origin.jenkins.io 를 받는 Ingress 규칙을 지운 뒤로, 클러스터의 원본 페이지는 Fastly 에 HTTP/404 를 냈다. 11:07 UTC 부터 Fastly 는 클러스터에서 페이지를 새로 받지 못해 jenkins.io 페이지 일부를 캐시에서 내리기 시작했고, 그 페이지들이 HTTP/503 으로 바뀌었다.\n\n장애는 두 번 났다. 11:07 UTC 부터 13:40 UTC 까지 2시간 37분 동안 사이트가 멈췄고, 수동 조치로 되살린 뒤 15:30 UTC 에 Nginx Helm 차트를 다시 4.0.8 로 배포하자 17:11 UTC 까지 1시간 41분 동안 다시 멈췄다."},"updated_at":"2026-11-14T12:34:16.493977Z","url":"https://benchlet.com/incidentlib/app/cases/IL-0522","org_slug":"jenkins-project"}