Incident Library
  • 원인
  • 구성 요소
  • 증상
  • 기여 요인
  • 사례

사례3건

3건 중 1~3번째

  1. 증상

    2021년 11월 18일 11:32 UTC, 한 사용자가 Gitter 채널 jenkinsci/jenkins 에 https://www.jenkins.io/doc/pipeline/steps/ 가 HTTP/503 오류를 낸다고 알렸다. 화면에는 Fastly 의 Varnish 가 내는 "Guru meditation" 메시지가 떴다.

    촉발

    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 뒤에서 난 오류를 사용자 신고로 처음 알게 된다.

  2. 증상

    2020-08-14 10:43 에 클러스터의 ingress 컨트롤러 파드 복제본 6개 중 2개가 크래시 루프에 빠진 것이 감지되었다.

    원인
    구성 요소
    기여 요인
    감지

    2020-08-14 10:43 에 ingress 컨트롤러 파드 6개 중 2개가 크래시 루프에 빠진 것이 감지되었다.

    조치
    • 리더 ingress 컨트롤러 파드를 재시작했다. 그러자 다른 파드들이 리더에 연결해 최신 nginx.config 파일을 받았다.
  3. 증상

    mybinder.org 에서 새 서버를 실행하면 임시 사용자를 만들지 못했다는 오류가 떴다. 엔지니어가 마침 Grafana 를 보다가 그래프가 이상한 것을 보고 알아챘다.

    촉발

    GKE 노드 하나의 메모리가 바닥났다. 빌드에 메모리 제한이 없어서 빌드 컨테이너가 노드의 메모리를 다 썼을 가능성이 크다고 봤다.

    원인
    구성 요소
    기여 요인
    감지

    엔지니어가 마침 Grafana 를 보다가 그래프가 이상한 것을 보고 알아챘다.

    조치
    • 메모리가 바닥난 노드를 cordon 했다.
    • cordon 했던 노드를 다시 uncordon 했다.
    후속 조치
    • repo2docker 에서 빌드 파드가 쓸 수 있는 메모리를 제한한다.
    • jupyterhub 파드가 재시작해도 사용자 파드가 정리되지 않게 설정을 고친다.
    • 장애 대응 때 명령을 직접 실행할 사람 한 명을 정하고 터미널 공유도 고려한다. 클러스터 상태를 바꾸는 명령은 그 한 사람만 내리고, 다른 사람은 그 명령을 알고 있게 한다.
    • 클러스터에 문제가 생겼을 때 울리는 경보를 더 잘 갖춘다. 이번 장애는 jupyterhub 파드의 4xx 응답 수를 세는 경보로 잡을 수 있었다.
내 클러스터에도 있는지 확인하기

이 3건에서 가장 많이 나오는 구성 요소: 인그레스 컨트롤러, 어드미션 웹훅. kubegap 은 Claude Code 나 Codex 에서 쿠버네티스 클러스터를 읽기만 하며 이런 틈을 점검합니다. 점검 항목의 근거는 이 라이브러리와 같은 공개 보고서입니다.

원인별2