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

사례3건

3건 중 1~3번째

  1. 증상

    2023년 3월 8일 06:00 에서 07:00 UTC 사이에 여러 리전과 여러 클라우드의 Kubernetes 노드가 한꺼번에 네트워크 연결을 잃었다. Datadog 의 모든 서비스가 영향을 받았고, CI/CD 와 자동화 도구가 있는 리전도 함께 끊겼다.

    촉발

    2023년 3월 7일 Ubuntu 저장소에 systemd 의 CVE 패치 249.11-0ubuntu3.7 이 올라왔다. 3월 8일 06:00 에서 07:00 UTC 사이에 Ubuntu 기본값 그대로 둔 무인 업그레이드가 이 패치를 설치했고, systemd-networkd 가 재시작되면서 자신이 모르는 IP 규칙을 모두 지웠다.

    원인
    구성 요소
    기여 요인
    조치
    • Google Cloud 와 Azure 에서 네트워크만 잃고 실행 중이던 인스턴스 수천 대를 클라우드 API 로 재시작해 로컬 디스크의 데이터와 함께 복구했다.
    • AWS 에서 교체되면서 로컬 디스크를 잃은 데이터 저장소는 데이터를 다시 만들거나, 다시 처리하거나, 백업에서 복원해 되살렸다.
    교훈

    기본값 그대로 둔 OS 무인 보안 업데이트는 단계적 배포 절차를 거치지 않고 모든 리전과 클라우드에 같은 시각에 변경을 적용한다. systemd-networkd 의 새 동작은 22.04 도입 때부터 있었지만 systemd-networkd 가 재시작될 때만 나타나서 몇 달 동안 보이지 않았다. CNI 가 호스트의 IP 규칙에 기대고 있으면, 그 규칙을 지우는 다른 구성 요소 하나가 노드 네트워크 전체를 끊는다. 클라우드마다 네트워크를 잃은 인스턴스를 다루는 방식이 다르고, 로컬 디스크에 데이터를 두는 서비스에서는 자동 교체가 오히려 복구를 늦춘다.

  2. 증상

    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 공지를 보고 알려 준 것이 운이 좋았다고 적었다.

  3. 증상

    EKS 클러스터의 파드를 새로 만든 관리형 노드 그룹으로 옮기고 2~3일 지나자, 파드가 갑자기 재시작을 되풀이하거나 제대로 종료되지 못하고 Terminating 상태로 계속 남았다. 노드의 CPU 와 메모리 부하가 높아져 클러스터에서 노드를 쓸 수 없게 됐다.

    촉발

    EKS 1.16 업그레이드를 앞두고 파드를 버그가 있는 AMI 로 만든 새 관리형 노드 그룹으로 옮기고 옛 노드 그룹을 지웠다.

    원인
    구성 요소
    기여 요인
    조치
    • 수정된 AMI 가 나오자 관리형 노드 그룹의 AMI 버전을 바꿨다.
    • CloudFormation 으로 관리형 노드 그룹 업데이트를 실행했다.
    • 업데이트가 도는 동안 kubectl get pods --all-namespaces 로 파드 상태를 지켜봤다.
    • Terminating 상태로 한동안 변화가 없는 파드를 찾을 때마다 kubectl delete pods <pod name> --grace-period=0 --force 로 강제로 지웠다.
    후속 조치
    • 분기나 달마다 각종 모듈의 최신 릴리스를 확인하고 정기적으로 업그레이드해, 서비스 영향을 가장 작게 하는 운영 방법을 찾는다.
    교훈

    Amazon EKS 나 쿠버네티스를 쓰는 한 클러스터 본체와 Ingress Controller 같은 모듈의 업그레이드를 늘 신경 써야 한다. 안정적으로 돈다고 한동안 손대지 않고 두면, 그사이 호환성을 깨는 변경이 담긴 릴리스가 갑자기 발표되는 일이 드물지 않다. 쿠버네티스 마이너 버전은 3개월쯤마다 나오므로 1년에 적어도 한 번은 업그레이드해야 한다.

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

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

원인별1