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

사례10건

10건 중 1~5번째

  1. 증상

    2026-08-06 15:05 UTC 부터 GitHub Actions 워크플로 실행이 시작하지 못하거나 도중에 실패했고, 일부 Actions REST API 요청이 오류를 냈다. 일부 고객은 워크플로에서 예상하지 못한 rate limiting 을 겪었다.

    촉발

    이벤트를 처리하고 Actions 작업을 만드는 Actions 내부 서비스에 일상 배포를 했다. 배포로 파드가 교체되는 동안 남은 용량이 포화됐다.

    원인
    구성 요소
    기여 요인
    조치
    • 용량을 늘렸고, 처음 무너진 서비스들은 17:00 에 회복했다.
    • 시스템이 회복할 수 있게 웹훅으로 들어오는 작업을 줄였다. 한때 웹훅의 약 15% 만 처리했다.
    • 밀린 이벤트를 처리할 용량을 늘렸다.
    • 러너가 유효하지 않은 작업을 되풀이해 가져가려 하지 않도록 하는 변경을 배포했다.
    • 작업을 가져가지 못하던 자체 호스트 러너를 위한 수정을 배포하고 조금씩 켰다.
    • 완화 작업에 도움이 되도록 GitHub Enterprise Importer 마이그레이션을 멈췄다.
    • 웹훅으로 시작하는 Actions 워크플로를 전체 처리량으로 되돌렸다.
    • 완화 조치 하나 때문에 오프라인으로 남은 Actions Runner Controller 러너는 손으로 복구했고, 그 변경은 나중에 롤백했다.
    • 재시도도 취소도 되지 않는 작업을 고객이 정리할 수 있는 CLI 와 UI 방법을 GitHub 커뮤니티 토론 글로 공유했다.
    후속 조치
    • 영향받은 서비스의 배포 안전장치와 용량 안전장치를 개선한다.
    • 이번 장애에 앞서 나타난 조건을 잡아내도록 모니터링을 강화한다.
    • 장애가 나도 큐에 쌓인 작업과 러너 배정이 버티고 빨리 복구되도록 개선한다.
    • 다음 Actions Runner 와 Actions Runner Controller 릴리스에 자동 복구를 넣어 손으로 하는 조치가 필요 없게 한다.
    • 대규모 Actions 장애에서 연쇄 장애가 번질 위험을 줄이고 복구를 앞당기는 개선을 더 한다.
  2. 증상

    2026-05-28 20:01 UTC 부터 알림 처리 워커가 모자라 Buildkite 의 알림 전달 지연이 늘었다. 내부 큐 지연 모니터링이 이를 잡았다.

    촉발

    EKS 의 오토스케일링이 쓰는 Prometheus 서비스의 저장 공간이 다 찼다. 그래서 큐가 쌓이는 동안 EKS 위의 알림 처리 워커 일부가 제대로 늘지 못했다.

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

    팀은 내부 큐 지연 모니터링으로 장애를 알아챘다. 공개 상태 페이지에는 20:20 UTC 에 첫 공지가 올라왔다.

    조치
    • 영향받은 워크로드를 EKS 에서 이전의 ECS 인프라로 옮기기 시작했다.
    • ECS 서비스가 전체 부하를 바로 받지 못해 엔지니어가 장애 중에 스케일링 설정과 워커 수를 손으로 조정했다.
    • 두 번째 지연은 롤백을 마저 끝내고 남은 ECS 서비스를 늘려 해소했다.
    • Prometheus 저장 공간을 늘리고, 같은 변경을 인프라 코드에도 반영했다.
    후속 조치
    • Prometheus 저장 공간이 바닥나 오토스케일링에 영향을 주기 전에 알림이 오도록 모니터링을 더한다.
    • 특정 종류의 오류에서 GitHub 알림 재시도가 되풀이되어 알림 지연을 늘리는 동작을 고친다.
    • EKS 에서 ECS 로 되돌리는 롤백 절차를 보강해, 롤백 전과 도중에 옮겨 갈 쪽의 용량, 오토스케일링 설정, 트래픽 이동을 확인하게 한다.
    • KEDA 와 Karpenter 를 비롯해 EKS 컨트롤 플레인이 의존하는 다른 구성 요소를 검토하고, CPU, 메모리, 저장 공간 할당이 운영 부하에 맞는지 확인한다.
    • 앞으로 EKS 로 옮기는 순서와 속도를 다시 따져, 고객에게 중요한 워크로드는 더 천천히 옮기고 안정될 시간을 분명히 둔다.
    • 고객 단위로 알림 전달 지연을 보는 모니터링을 개선해 고객에게 영향을 주는 회귀를 더 일찍 잡는다.
    • 어떤 알림 종류가 고객의 스케줄링이나 CI 의 핵심 경로에 있는지 검토한다. 그런 알림에는 더 엄격한 지연 기준, 별도 큐, 일반 알림 작업보다 구체적인 모니터링 경보가 필요한지 따진다.
    • 알림 지연이 고객의 작업 흐름에 영향을 줄 것 같으면 상태 페이지를 더 일찍 갱신한다.
    • 상태 페이지에 영향받은 내부 서비스만이 아니라 고객이 겪는 영향을 분명하게 적는다.
    • 장애를 다 파악하기 전이라도 심각한 CI 영향을 알려 오는 고객의 문의가 내부에서 빨리 올라가도록 에스컬레이션 경로를 개선한다.
    교훈

    Buildkite 는 롤백 경로가 이번 상황을 다 다루지 못해 복구가 예상보다 오래 걸렸다고 보았다. 알림 지연의 영향은 고객이 알림을 CI 와 배포 흐름에 어떻게 쓰는지에 따라 다르게 나타난다. Buildkite 는 공개 상태 페이지가 고객이 겪는 영향을 제때 분명하게 보여 주지 못했다고 밝혔다.

  3. 증상

    2025년 5월 16일, Neon 의 AWS us-east-1 클러스터에서 새 파드가 스케줄링은 되지만 IP 할당 오류를 내며 시작하지 못했다. 새 컴퓨트 파드를 시작할 수 없어 유휴 데이터베이스를 깨울 수도 없었다.

    촉발

    5월 16일 유휴 컴퓨트를 종료하는 Neon 컨트롤 플레인의 주기 작업이 실패했다. 종료는 멈췄는데 생성은 계속되어 활성 컴퓨트가 몇 분 만에 약 8천 개로 늘었다. 5월 19일에는 후속 조치로 WARM_IP_TARGET=1 을 다시 배포한 것이 계기가 되어 같은 장애가 다시 났다.

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

    노드가 추가되면서 새 파드가 스케줄링은 되지만 시작하지 못하고 IP 할당 오류를 내는 것이 보였다. 5월 19일에는 WARM_IP_TARGET=1 배포 직후 IP 배정 실패와 파드 시작 성공률 하락이 바로 나타났다.

    조치
    • 5월 16일 노드에 묶인 IP 를 풀려고 WARM_IP_TARGET=1 을 설정했다.
    • 컨트롤 플레인의 실패하던 주기 작업을 안정시켜 유휴 컴퓨트 약 7천 개를 종료했다.
    • aws-node DaemonSet 을 재시작해 ipamd 를 다시 초기화했고, 재시작할 때마다 잠시 나아졌다.
    • WARM_IP_TARGET, MINIMUM_IP_TARGET, WARM_ENI_TARGET 을 모두 0 으로 바꿔 파드 시작 성공률을 정상으로 되돌렸다.
    • 5월 19일 WARM_IP_TARGET=1 을 다시 배포했다가 같은 증상이 나오자 0 으로 되돌렸다.
    • 미리 만들어 두는 컴퓨트 풀을 늘려 약 10% 의 파드 시작 실패를 메우고 사용자 영향을 줄였다.
    후속 조치
    • ipamd 의 동작을 개선하는 PR 을 AWS CNI 에 올렸다.
    • 서브넷에서 IP 약 100개가 왜 할당되지 않고 남았는지 AWS Support 와 확인한다.
    • 수평 확장을 지원하도록 아키텍처를 바꾼다.
    교훈

    AWS CNI 기본 설정에서는 노드마다 적어도 ENI 한두 개 분량의 IP 가 더 잡히고, IP 는 ENI 가 통째로 비어야만 반납된다. 그래서 파드에 배정된 IP 수만 보고 서브넷 여유를 판단하면 안 된다. 이번에는 IP 의 71% 만 파드에 배정된 상태에서 서브넷이 바닥났다. WARM_IP_TARGET 은 지정하지 않을 때, 0 일 때, 1 일 때 동작이 서로 크게 다르다. cooldown 중인 IP 도 여유 IP 로 세기 때문에 WARM_IP_TARGET=1 은 파드가 지워질 때마다 그 노드의 파드 시작을 30초 동안 막을 수 있다. 문서를 잘못 읽고 바꾼 설정도, 원래대로 돌린 설정도 예상과 다르게 동작했고, 되돌리는 것만으로는 망가진 상태가 회복되지 않았다. 서브넷 크기는 부하 시험에서 정한 상한인 1만 컴퓨트를 넘지 않는다는 가정에 맞춰 잡혀 있었다. 서비스가 예상보다 빨리 커지면서 이 가정이 맞지 않게 됐다.

  4. 증상

    2022년 1월 Render 의 프랑크푸르트 Kubernetes 클러스터 하나에서 새 배포와 크론 잡 실행이 실패했다. etcd 메모리 급증으로 컨트롤 플레인이 과부하에 걸린 상태였다.

    촉발

    etcd 메모리가 급증해 Kubernetes 컨트롤 플레인이 과부하에 걸렸다.

    원인
    구성 요소
    기여 요인
    후속 조치
    • CoreDNS 를 컨트롤 플레인 노드가 아닌 데이터 플레인 노드에서 돌게 했다.
    • etcd 를 전용 노드에서 돌게 했다.
    교훈

    CoreDNS 는 API 서버가 내려가 있어도 메모리 캐시로 DNS 질의에 답할 수 있지만, 초기화할 때는 API 서버가 필요하다. CoreDNS 가 컨트롤 플레인 노드에 있었기 때문에, 컨트롤 플레인 장애 중에 노드를 재부팅하자 새 배포와 크론 잡만 실패하던 장애가 이미 돌던 서비스로 가는 요청까지 실패하는 장애로 커졌다. 핵심 문제는 데이터 플레인이 컨트롤 플레인에서 충분히 분리되어 있지 않았다는 점이다. 노드를 재부팅하지 않았더라도 etcd 메모리 급증만으로 CoreDNS 가 재시작될 수 있었다.

  5. 증상

    트래픽이 급하게 오르내리는 환경에서 CoreDNS 에 부하가 몰렸다. 네트워크 문제가 생기고 응답 지연이 크게 늘었다.

    촉발

    트래픽이 급변하면서 수가 적은 CoreDNS 파드에 처리할 수 있는 양보다 많은 부하가 몰렸다.

    원인
    구성 요소
    기여 요인
    조치
    • 클러스터 크기에 맞춰 CoreDNS replica 를 늘리도록 CPA 를 설정하고, 인스턴스 타입에 맞게 nodesPerReplica, coresPerReplica, replica 최솟값과 최댓값을 조정했다.
    • CoreDNS 에 anti-affinity 대신 ScheduleAnyway 로 느슨하게 한 topologySpreadConstraints 를 걸어, Karpenter 의 Consolidation 과 Drift 가 CoreDNS 에 막히지 않게 했다.
    • CoreDNS 의 Error Rate, Panics, Request Duration, Request Rate 에 임곗값 알림을 걸었다.
    • NodeLocal DNSCache 를 적용해 노드마다 DNS 캐시를 두고 메인 CoreDNS 의 부하를 낮췄다.
    교훈

    CoreDNS 가 감당할 수 있는 양은 파드에 준 리소스에 따라 다르고, 그에 따라 평균 지연과 초당 질의 수인 QPS 도 달라진다. CoreDNS replica 를 무작정 늘리면 taint 와 topologySpreadConstraints 때문에 파드가 몇몇 노드에 몰려 Karpenter 의 Consolidation 을 막을 수 있다. 노드 하나가 드레인될 때 그 노드의 CoreDNS 가 한꺼번에 많이 종료되면 서비스에 영향이 갈 수 있다. NodeLocal DNSCache 를 쓰면 메인 CoreDNS 로 가는 DNS 질의가 크게 줄고 스파이크를 다루기 쉬워진다. 어느 노드에서 문제가 생겨도 메인 CoreDNS 는 영향을 받지 않는다. 그래서 서비스 전체 장애로 번질 일이 노드 하나의 문제로 그친다. 글쓴이는 CPA 와 NodeLocal DNSCache 를 함께 적용해 CoreDNS 부하 문제를 거의 없앴다고 보았다.

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

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

원인별1

용량 한계10건

  1. IL-0471 GitHub Actions 워크플로 실행이 대량으로 실패하거나 큐에서 오래 기다렸다
    GitHub2026
  2. IL-0470 알림 처리 워커가 모자라 Buildkite 알림 전달이 두 차례 늦어졌다
  3. IL-0006 AWS VPC CNI 가 자원이 찬 노드에 IP 를 붙잡아 두어 us-east-1 서브넷 IP 가 바닥났고, WARM_IP_TARGET 을 바꾼 조치가 파드 시작 실패를 더 오래 끌었다
    Neon2025
  4. IL-0204 Render 프랑크푸르트 클러스터에서 etcd 메모리 급증으로 컨트롤 플레인이 과부하에 걸렸고, 컨트롤 플레인 노드를 재부팅하자 그 위의 CoreDNS 가 다시 뜨지 못해 DNS 가 멈췄다.
    Render2024
  5. IL-0182 트래픽이 급변할 때 수가 모자란 CoreDNS 가 과부하로 지연과 간헐적 네트워크 끊김을 일으켰고, 나중에는 과하게 늘린 CoreDNS 파드가 Karpenter 의 노드 통합을 막았다
  6. IL-0110 Grafana Agent 파드가 메모리를 많이 쓰던 노드에 Hangfire 파드가 함께 올라가 시스템 OOM 으로 CrashLoopBackOff 를 반복했고, 노드가 응답을 멈추고 NotReady 가 됐다.
    DFDS2024
  7. IL-0093 리더 ingress 컨트롤러 파드가 공유 메모리를 다 써서 ingress 컨트롤러 파드 6개 중 4개가 크래시 루프에 빠졌다
  8. IL-0076 dex의 AuthRequest 리소스가 끝없이 쌓였고, 이를 치우려고 네임스페이스를 지우자 목록 조회 타임아웃과 재시도가 반복되며 쿠버네티스 마스터가 내려갔다
  9. IL-0037 imagePullPolicy가 Always인 DaemonSet이 크래시 루프를 돌며 이미지를 계속 받아, NAT 세 대를 같이 쓰던 리전 전체가 이미지 레지스트리에서 429로 막혔다
  10. IL-0503 GKE 노드의 메모리가 바닥나 mybinder.org 의 proxy 파드가 OOM 으로 죽고 새 서버 실행이 실패했다