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

사례9건

9건 중 8~9번째

  1. 증상

    jupyter.utoronto.ca 가 응답하지 않았고 사용자는 UToronto JupyterHub 에 아예 접속하지 못했다. 신고는 Freshdesk 티켓으로 들어왔다.

    촉발

    Microsoft Azure 가 모든 Ubuntu 18.04 노드에 Ubuntu 업데이트를 자동으로 배포했고, 이 업데이트가 systemd 버그 1988119 를 드러내 노드의 네트워크를 끊었다.

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

    Freshdesk 티켓으로 jupyter.utoronto.ca 가 응답하지 않는다는 신고가 들어왔다.

    조치
    • 노드를 Azure Portal 의 VM 페이지에서 찾을 수 없어서, 재부팅 대신 클러스터의 쿠버네티스 버전과 노드 버전 업그레이드를 시작했다. 업그레이드가 옛 노드를 모두 내리고 새 노드로 바꾸면서 허브가 돌아왔다.
    후속 조치
    • 쿠버네티스 노드에 SSH 로 들어가는 방법을 문서로 남긴다.
    • Azure 공지를 알림으로 받아 볼 방법을 찾는다.
    교훈

    원인을 찾고 나서는 바로 복구할 수 있었다. 쿠버네티스 클러스터의 노드에 SSH 로 들어가는 방법이 문서로 없었다. 2i2c 는 클러스터 업그레이드를 아직 하지 않아 그 선택지가 남아 있었던 것과, 고객 쪽 담당자가 Azure 공지를 보고 알려 준 것이 운이 좋았다고 적었다.

  2. 증상

    WER 허브의 학생들이 페이지가 멈춘다고 알려 왔다. 아무것도 쓸 수 없는 완전한 장애였다. 08:52 PM IST 에 많은 학생이 허브에 접속하지 못하고 허브가 멈췄다는 보고가 들어왔다.

    촉발

    WER 학생들의 사용량이 늘어 사용자 파드와 코어 파드가 함께 도는 노드의 CPU 와 메모리를 다 썼다.

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

    08:52 PM IST 에 많은 학생이 허브에 접속하지 못하고 허브가 멈췄다는 보고가 들어왔다.

    조치
    • 09:23 PM 에 WER 학생 파드의 메모리 오버커밋을 없앴다. 학생들이 메모리 한도의 상당 부분을 쓰고 있었고, 새 노드가 하나 더 떠서 기존 노드의 부담을 덜 것으로 보았다.
    • 09:24 PM 에 모든 코어 파드의 자원 보장을 올려 노드가 가득 차도 코어 파드가 동작할 자원을 갖게 했다. 코어 파드가 재시작되며 일부가 새 노드로 옮겨졌다.
    후속 조치
    • 사용자 파드를 별도 노드 풀로 옮겨 코어 파드에 부담을 주지 않게 한다.
    • prometheus, grafana, ingress 같은 지원 인프라에도 한도를 건다.
    • 메모리 오버커밋 비율을 검토하고 문서로 남긴다.
    • 자원 사용량을 감시할 Grafana 대시보드를 더 낫게 만든다.
    • 다른 사람도 문제를 살펴볼 수 있게 클러스터의 kubectl 접근 권한을 얻는 방법을 문서로 남긴다.
    교훈

    코어 파드와 사용자 파드가 같은 노드에 섞여 있으면 사용자 사용량이 몰릴 때 코어 파드까지 자원을 얻지 못한다. 코어 파드에는 노드가 가득 차도 동작할 만큼의 자원 보장이 있어야 한다. 메모리 오버커밋 비율은 관례대로 정하지 말고 실제 사용량에 맞춰야 한다. WER 학생들은 한도의 상당 부분을 실제로 쓰고 있어서 4배 오버커밋은 지나쳤다.

내 클러스터에도 있는지 확인하기

이 9건에서 가장 많이 나오는 구성 요소: 노드 풀, 클러스터 오토스케일러. kubegap 은 Claude Code 나 Codex 에서 쿠버네티스 클러스터를 읽기만 하며 이런 틈을 점검합니다. 점검 항목의 근거는 이 라이브러리와 같은 공개 보고서입니다.

원인별4

업그레이드로 깨진 호환성3건

조직
  1. IL-0097 cluster autoscaler 버전을 올린 뒤 Kubernetes 1.33 에 남아 있던 클러스터에서 스케일업이 일어나지 않아 새 노드가 만들어지지 않았다
    2i2c2026
  2. IL-0098 ingress-nginx 에서 nginx-ingress 로 옮긴 뒤 같은 호스트를 나눠 쓰는 인그레스들의 동작이 바뀌어 cert-manager 가 새 TLS 인증서를 받지 못했다.
    2i2c2026
  3. IL-0501 Azure 가 배포한 Ubuntu 18.04 업데이트로 UToronto AKS 클러스터의 모든 노드에서 네트워크가 끊겨 허브에 접속할 수 없었다
    2i2c2022

운영 실수1건

조직
  1. IL-0095 엔지니어가 kubectl 이 다른 클러스터를 가리키는 줄 모르고 prod 네임스페이스를 지워 LEAP JupyterHub 가 약 1시간 동안 멈췄다.
    2i2c2025

용량 한계4건

조직
  1. IL-0099 메모리 상한 없이 8GB 만 보장한 프로필 때문에 워크숍 중 사용자 파드가 서로를 축출해 서버 시작이 15분을 넘고 커널이 죽었다.
    2i2c2025
  2. IL-0070 dask-gateway로 워커를 대량으로 띄우자 노드가 1분 만에 100대 늘었고, Prometheus가 메모리를 거의 다 쓰던 코어 노드에서 hub 파드를 비롯한 중요한 파드들이 축출되거나 재시작됐다
    2i2c2023
  3. IL-0500 UToronto JupyterHub 의 데이터베이스 디스크가 가득 차서 로그인과 서버 시작이 500 오류로 실패했다
    2i2c2022
  4. IL-0094 JupyterHub 클러스터에서 학생 파드가 노드의 CPU 와 메모리를 다 써서 자원 보장이 부족했던 코어 파드가 자원을 얻지 못했고, 허브 전체가 멈췄다.
    2i2c2020

클라우드 제공자 장애1건

조직
  1. IL-0096 GCP europe-west2-b 존의 자원이 바닥나 이 존 하나에 묶인 GKE 노드 풀이 늘어나지 못했고, LIS 허브의 사용자 서버가 6시간 30분 동안 뜨지 않았다.
    2i2c2022