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

사례3건

3건 중 1~3번째

  1. 증상

    2023-01-11 14:22, Cloud Platform 팀원 한 명이 DockerHub 로그인이 실패하는 오류를 발견했다.

    촉발

    LastPass 대응 작업의 하나로 DockerHub 비밀번호를 바꿨는데, EKS 클러스터 노드와 Concourse 는 예전 비밀번호로 계속 로그인하고 있었다.

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

    14:22 에 Cloud Platform 팀원이 DockerHub 로그인 실패 오류를 직접 발견했다. 14:52 에는 Kuberhealthy 데몬셋 점검에서 클러스터도 이미지를 받지 못한다는 것이 드러났고, 14:54 에 사용자 보고가 들어왔다. 장애 선언은 15:17 이었다.

    조치
    • DockerHub 비밀번호를 EKS 클러스터 노드와 Concourse 가 아직 쓰던 예전 값으로 되돌렸다.
    • 보고한 사용자에게 물어 파드가 배포되는 것을 확인했고, 클러스터가 다시 이미지를 받는 것도 확인했다.
    후속 조치
    • DockerHub 사용자 이름과 비밀번호 대신 Cloud Platform 전용으로 만든 DockerHub 토큰을 쓰도록 바꿨다.
    • 업무 시간 밖에 DockerHub 자격 증명을 새 값으로 바꾸고 노드를 차례로 교체한다.
    교훈

    이 글은 교훈을 따로 적지 않았다. 후속 조치로는 DockerHub 사용자 이름과 비밀번호 대신 Cloud Platform 전용으로 만든 DockerHub 토큰을 쓰도록 바꿨다.

  2. 증상

    2019년 6월 11일, Zalando 가 직접 만들어 운영하는 CI/CD 플랫폼인 CDP 의 빌드가 한 시간 가까이 타임아웃으로 실패했다.

    촉발

    CDP 쿠버네티스 클러스터의 규모가 조정되면서 공교롭게도 빌더 파드가 쓸 수 있는 노드가 한 대만 남았다. 그 노드에서 파드가 빠르게 생성되고 삭제되자 kubelet 이 따라가지 못했다.

    원인
    구성 요소
    기여 요인
    조치
    • 클러스터를 수동으로 늘려 빌더 파드가 노드 한 대가 아니라 여러 대에 흩어지게 했다.
    후속 조치
    • 전역 클러스터 설정으로 kubelet QPS 를 기본값 5 에서 50 으로 올렸다.
  3. 증상

    Terraform 이 아시아 운영 GKE 클러스터를 지웠다. 사내 서비스 디스커버리가 사라진 클러스터에 닿지 못하자 클러스터 운영 팀이 호출을 받았다.

    촉발

    클러스터 운영 팀이 아시아 클러스터를 Terraform 상태 파일로 가져오는 PR 을 올렸고, 그 리뷰 빌드가 운영에 쓰이는 전역 상태 파일을 바꿨다. 그런데 이 PR 보다 클러스터 사용자의 PR 이 먼저 머지됐고, 그 PR 에는 아시아 클러스터 정의가 없었다. Terraform 은 정의에 없는 아시아 클러스터를 삭제했다.

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

    사내 서비스 디스커버리가 사라진 클러스터에 닿지 못하자 클러스터 운영 팀이 호출을 받았다.

    조치
    • 서비스 디스커버리 설정에서 사라진 클러스터를 빼고 사내 서비스 디스커버리를 재시작해 파드 IP 를 백엔드 목록에서 지웠고, 트래픽을 쿠버네티스 밖 인스턴스로 넘겼다.
    • 쿠버네티스와 VM 에 반씩 나눠 돌던 한 팀이 부하를 받으려고 쿠버네티스 밖 VM 을 더 만들었다.
    • 미리 복원을 시험해 둔 클러스터 백업으로 삭제된 클러스터를 다시 만들었다.
    • 옛 클러스터 마스터 IP 를 하드코딩한 곳을 찾아 모두 새 값으로 고쳤다.
    후속 조치
    • 드라이런 결과를 PR 댓글로 달아 무엇이 바뀔지 바로 보이게 했다.
    • 머지 전에 브랜치가 최신 master 를 반영해야 하는 필수 상태 검사를 켜서, 드라이런이 실제로 일어날 일을 보여 주게 했다.
    • PR 머지에 승인 리뷰를 필수로 했다.
    • destroy 같은 키워드가 보이면 리뷰를 바로 실패시키고, 클러스터 삭제는 이 저장소 밖에서 손으로 하게 했다.
    • 클러스터 설정을 린터와 검증기로 검사하게 했다.
    • 일정을 미리 잡아 널리 알린 뒤, 클러스터가 사라지는 경우와 그보다 작은 실패를 다루는 재해 복구 훈련을 했다.
    교훈

    Terraform 은 상태 파일을 보고 할 일을 정한다. 리뷰 빌드가 운영 상태 파일을 바꾸게 두면 머지 순서 하나로 운영 리소스가 지워질 수 있다. 같은 리소스도 API 를 호출하는 권한에 따라 다른 속성으로 보이므로, 가져올 때와 관리할 때 권한이 다르면 Terraform 이 그 차이를 변경으로 읽는다. 처음부터 실패에 대비하고, 큰 인프라를 서서히 옮기고, 되돌릴 방법을 남겨 둔 덕분에 운영 클러스터 두 개가 사라져도 최종 사용자 영향이 없었다. 복원을 시험해 보지 않은 백업은 백업이 아니다. 실수를 누가 했는지보다 무엇을 배웠고 같은 종류의 실수를 어떻게 막을지가 중요하다.

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

이 3건에서 가장 많이 나오는 구성 요소: CI 시스템, 파드용 자격 증명 중개자. kubegap 은 Claude Code 나 Codex 에서 쿠버네티스 클러스터를 읽기만 하며 이런 틈을 점검합니다. 점검 항목의 근거는 이 라이브러리와 같은 공개 보고서입니다.

원인별3