IL-0522 Jenkins project · 2021-11-18kubernetesnetworking
ingress-nginx Helm 차트 패치 업그레이드 뒤 jenkins.io 의 Ingress 가 지워져 사이트가 HTTP/503 을 냄
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 에 장애 공지가 올라갔다.
13: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 에 모든 페이지의 캐시를 비우게 했다.
팀은 두 가지가 잘못됐다고 밝혔다. 인그레스 컨트롤러라는 민감한 구성 요소의 Helm 차트를 패치 버전이라고 믿고 변경 기록을 깊이 확인하지 않았고, origin.jenkins.io 에는 오류가 보일 때 알려 줄 모니터링이 없었다.
- 심각도
- –
- 영향 범위
- 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
- 영향 사용자
- –
- 지역
- –
- 감지까지
- 25m
- 복구까지
- 6h 4m
증상
2021년 11월 18일 11:32 UTC, 한 사용자가 Gitter 채널 jenkinsci/jenkins 에 https://www.jenkins.io/doc/pipeline/steps/ 가 HTTP/503 오류를 낸다고 알렸다. 화면에는 Fastly 의 Varnish 가 내는 "Guru meditation" 메시지가 떴다.
쿠버네티스가 jenkins.io, www.jenkins.io, origin.jenkins.io, www.origin.jenkins.io 를 받는 Ingress 규칙을 지운 뒤로, 클러스터의 원본 페이지는 Fastly 에 HTTP/404 를 냈다. 11:07 UTC 부터 Fastly 는 클러스터에서 페이지를 새로 받지 못해 jenkins.io 페이지 일부를 캐시에서 내리기 시작했고, 그 페이지들이 HTTP/503 으로 바뀌었다.
장애는 두 번 났다. 11:07 UTC 부터 13:40 UTC 까지 2시간 37분 동안 사이트가 멈췄고, 수동 조치로 되살린 뒤 15:30 UTC 에 Nginx Helm 차트를 다시 4.0.8 로 배포하자 17:11 UTC 까지 1시간 41분 동안 다시 멈췄다.
원인
- 촉발
- 2021년 11월 18일 10:42 UTC 에 nginx Helm 차트를 패치 버전인 4.0.6 에서 4.0.8 로 올리는 배포가 성공했다. 새 버전은 `{}` 같은 Nginx 설정 블록이 든 Ingress 어노테이션을 막는 어드미션 웹훅 규칙을 새로 만들었다.
감지
장애가 시작되고 25분 뒤인 11:32 UTC 에 사용자가 Gitter 채널 jenkinsci/jenkins 에 신고해 알았다. origin.jenkins.io 에는 오류를 알릴 모니터링이 없었다.
조치
- 13:40 UTC 에 자동화 시스템을 모두 멈춘 채 nginx Helm 차트를 이전 버전 4.0.6 으로 롤백하고, 어드미션 웹훅 구성을 손으로 지워 jenkins.io 를 되살렸다.
- jenkins-infra/charts 에서 jenkins.io 설정의 금지된 어노테이션을 지웠다.
- jenkins.io Helm 차트를 nginx 4.0.8 에서 제대로 동작한다고 알려진 마지막 버전으로 올렸다.
- 필요한 수정을 모두 적용한 뒤 17:11 UTC 에 자동화 시스템이 jenkins.io Helm 차트를 다시 배포해 사이트가 돌아왔고, Fastly 에 모든 페이지의 캐시를 비우게 했다.
후속 조치
- 인그레스 컨트롤러를 업데이트할 때는 항상 변경 기록을 깊이 읽고, 적어도 두 사람이 실시간으로 함께 본다.
- www.origin.jenkins.io 의 장애를 잡아내도록 Datadog 에 이 도메인의 모니터링을 더한다.
- 이 모니터링은 Host 헤더를 www.jenkins.io 로 보내, Fastly 를 거치는 jenkins.io 로 리디렉션되지 않게 한다.
- 첫 페이지만이 아니라 pipeline steps 페이지 같은 여러 페이지를 점검 대상에 넣는다.
- 운영에 배포하기 전에 k3s 로 잠깐 띄웠다 지우는 엔드 투 엔드 시험 환경을 두는 방안을 다음 분기에 검토한다.
교훈
인그레스 컨트롤러처럼 민감한 구성 요소는 패치 버전 업그레이드라도 변경 기록을 깊이 확인해야 한다. 원본 호스트인 origin.jenkins.io 를 직접 지켜보는 모니터링이 없으면 CDN 뒤에서 난 오류를 사용자 신고로 처음 알게 된다.
출처
- https://github.com/jenkins-infra/documentation/blob/main/postmortem/20211118-jenkinsio-outage.md · github
참고 문서
- 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
관련 사례
IL-0405AWS Load Balancer Controller 의 webhook 인증서가 만료돼 US·Canada 지역의 BSEE SaaS 인스턴스가 전부 멈췄다PortSwigger · 2026같은 원인 · 공통 Helm, 인그레스 컨트롤러, 어드미션 웹훅
IL-0090ModSec 인그레스 컨트롤러 모듈을 v3.33.0 으로 올린 뒤 검증 웹훅 호출이 x509 인증서 오류로 실패해, 모든 인그레스 생성과 변경이 막히고 사용자 애플리케이션 배포가 멈췄다.UK Ministry of Justice · 2021같은 원인 · 공통 인그레스 컨트롤러, 어드미션 웹훅
IL-0098ingress-nginx 에서 nginx-ingress 로 옮긴 뒤 같은 호스트를 나눠 쓰는 인그레스들의 동작이 바뀌어 cert-manager 가 새 TLS 인증서를 받지 못했다.2i2c · 2026같은 원인 · 공통 인그레스 컨트롤러
IL-0092ingress-nginx 를 1.12.0 에서 1.14.3 으로 올리자 새 ModSecurity 와 OWASP Core Rule Set 이 정상 요청을 오탐으로 막아 HMPPS 사용자가 인증하지 못했다.UK Ministry of Justice · 2026같은 원인 · 공통 인그레스 컨트롤러
IL-0117인그레스 업그레이드가 네트워크 컨트롤 플레인 회귀를 일으켜 데이터 플레인이 잠깐 끊겼고, 한꺼번에 재시작한 서비스들이 백엔드 저장소에 과부하를 일으켜 OpenAI API 오류가 늘었다OpenAI · 2024같은 원인 · 공통 인그레스 컨트롤러
IL-0203클러스터 시스템 업데이트 뒤 AWS Load Balancer Controller 가 실패해 새 파드가 ALB 에 등록되지 않았고, Honeycomb EU1 의 수집과 UI 가 11분 동안 멈췄다Honeycomb · 2024같은 원인 · 공통 인그레스 컨트롤러
IL-0180GKE 컨트롤 플레인이 1.22 에서 1.23 으로 자동 업그레이드되면서 v1beta1 API 를 쓰던 Istio 1.7.4 가 제대로 동작하지 않았다Sunwoo Park · 2023같은 원인 · 공통 어드미션 웹훅
IL-0060쿠버네티스 1.24 업그레이드로 node-role.kubernetes.io/master 레이블이 사라지자 이 레이블에 기대던 Calico 라우트 리플렉터가 동작을 멈춰 레거시 클러스터의 네트워크가 모두 끊기고 Reddit 이 314분 동안 멈췄다Reddit · 2023같은 원인 · 공통 어드미션 웹훅
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0522
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0522/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.