IL-0503 Binder Project · 2017-11-30kubernetesgcp
GKE 노드의 메모리가 바닥나 mybinder.org 의 proxy 파드가 OOM 으로 죽고 새 서버 실행이 실패했다
태평양 시간으로 2017년 11월 30일 16:22 에 mybinder.org 의 GKE 노드 하나가 메모리를 다 쓰면서 서비스에 문제가 생기기 시작했다. 그 노드에서 돌던 proxy 파드가 죽고 재시작하기를 되풀이했고, 새 서버 실행은 임시 사용자를 만들지 못하고 실패했다. 운영팀은 빌드에 메모리 제한이 없어서 빌드 컨테이너가 노드의 메모리를 다 썼을 가능성이 크다고 봤다.
16:59 에 엔지니어가 Grafana 가 이상한 것을 보고 조사를 시작했다. 처음에는 Google Cloud 의 storage 사고를 의심했고, 콘솔에서는 모든 노드가 Ready 였다. 17:04 에 proxy 파드가 CrashloopBackoff 에 빠진 것을 찾았다. 17:12 에 jupyterhub 파드를 kubectl replace --force 로 다시 만들었지만 이 때문에 사용자 파드가 모두 지워졌고 오류는 남았다. 17:14 에 proxy 가 돌던 노드에서 OOMKilling 이벤트를 찾았다. 17:18 에 그 노드를 cordon 하고 proxy 파드를 지우자는 제안이 나왔고, 17:20 에 proxy 파드가 다시 동작하는 것을 알아챘다. 그 proxy 파드는 그때 이미 10분째 돌고 있었다. 노드는 다시 uncordon 했고, 17:21 에 사용자 파드가 다시 뜨며 서비스가 돌아왔다.
- 심각도
- –
- 영향 범위
- mybinder.org: new server launches failed; restarting the jupyterhub pod also removed all running user pods
- 영향 사용자
- –
- 지역
- us-central1-a
- 감지까지
- 37m
- 복구까지
- 59m
증상
mybinder.org 에서 새 서버를 실행하면 임시 사용자를 만들지 못했다는 오류가 떴다. 엔지니어가 마침 Grafana 를 보다가 그래프가 이상한 것을 보고 알아챘다.
실행 화면에는 Found built image, launching... 과 Launching server... 다음에 Failed to create temporary user for gcr.io/binder-prod/r2d-<repository>:6be6d6329de99168d0a0b68f9d52228ecc61ac50 이 찍혔다.
proxy 파드는 CrashloopBackoff 상태로 13번쯤 재시작해 있었다. kubectl describe 의 이벤트에는 Back-off restarting failed container 와 Error syncing pod, 그리고 Readiness probe failed: Get http://10.12.5.36:10254/healthz: dial tcp 10.12.5.36:10254: getsockopt: connection refused 가 있었다. 컨테이너 이미지는 gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.15 였다.
proxy 가 돌던 노드를 kubectl describe 로 보니 Warning OOMKilling 58m kernel-monitor, gke-prod-a-default-pool-6ab3d8ec-0h28 Memory cgroup out of memory: Kill process 8339 (python) score 1576 or sacrific 이벤트가 있었다. 그런데 클라우드 콘솔의 Kubernetes clusters 페이지에서는 모든 노드가 Ready 로 보였다.
처음에는 Google Cloud 상태 페이지의 storage 사고 17006 과 관련이 있는지 의심했다. jupyterhub 파드 로그에는 타임아웃 나는 DELETE 요청과 트레이스백이 많았다. 기존 파드는 돌고 있었지만 새 파드가 생기지 않았다. jupyterhub 파드를 강제로 다시 만들었더니 사용자 파드가 모두 지워졌고 오류는 그대로였다.
원인
- 촉발
- GKE 노드 하나의 메모리가 바닥났다. 빌드에 메모리 제한이 없어서 빌드 컨테이너가 노드의 메모리를 다 썼을 가능성이 크다고 봤다.
감지
엔지니어가 마침 Grafana 를 보다가 그래프가 이상한 것을 보고 알아챘다.
조치
- 메모리가 바닥난 노드를 cordon 했다.
- cordon 했던 노드를 다시 uncordon 했다.
후속 조치
- repo2docker 에서 빌드 파드가 쓸 수 있는 메모리를 제한한다.
- jupyterhub 파드가 재시작해도 사용자 파드가 정리되지 않게 설정을 고친다.
- 장애 대응 때 명령을 직접 실행할 사람 한 명을 정하고 터미널 공유도 고려한다. 클러스터 상태를 바꾸는 명령은 그 한 사람만 내리고, 다른 사람은 그 명령을 알고 있게 한다.
- 클러스터에 문제가 생겼을 때 울리는 경보를 더 잘 갖춘다. 이번 장애는 jupyterhub 파드의 4xx 응답 수를 세는 경보로 잡을 수 있었다.
교훈
–
출처
참고 문서
관련 사례
IL-0102배포와 워커 오토스케일링 폭주가 겹치자 크기를 고정해 둔 CoreDNS 가 메모리 한도를 넘겨 재시작된 뒤 회복하지 못했고, Buildkite 사이트 전체가 약 30분 멈췄다.Buildkite · 2026같은 원인 · 공통 컨테이너 메모리 한도
같은 원인 · 공통 컨테이너 메모리 한도
같은 원인 · 공통 컨테이너 메모리 한도
IL-0170설날 이벤트 트래픽이 평소의 3배를 넘자 Istio ingressGateway 가 있는 EKS 노드의 nf_conntrack 테이블이 가득 차 패킷이 버려졌고, 웹과 앱 서비스 전체가 멈췄다.Backpackr · 2025같은 원인 · 공통 인그레스 컨트롤러
같은 원인 · 공통 컨테이너 메모리 한도
IL-0044kube-prometheus-stack 업그레이드 뒤 Prometheus 가 WAL 재생 중 메모리를 50Gi 넘게 써서 시작할 때마다 OOMKilled 로 죽었다Saifeddine Rajhi · 2024같은 원인 · 공통 컨테이너 메모리 한도
IL-0110Grafana Agent 파드가 메모리를 많이 쓰던 노드에 Hangfire 파드가 함께 올라가 시스템 OOM 으로 CrashLoopBackOff 를 반복했고, 노드가 응답을 멈추고 NotReady 가 됐다.DFDS · 2024같은 원인 · 공통 컨테이너 메모리 한도
IL-0169FR-PAR 의 Scaleway Kubernetes API 가 메모리 부족으로 쓰러져 노드 인증이 막히고 Kapsule 노드가 NotReady 가 됐다.Scaleway · 2024같은 원인 · 공통 컨테이너 메모리 한도
IL-0016네임스페이스와 규칙이 늘어 live 클러스터의 Prometheus 가 메모리 부족으로 OOMKilled 되며 플랫폼 모니터링이 끊겼다UK Ministry of Justice · 2023같은 원인 · 공통 컨테이너 메모리 한도
같은 원인 · 공통 컨테이너 메모리 한도
같은 원인 · 공통 JupyterHub
IL-0206GKE 파드 안의 Consul 에이전트가 메모리 급증으로 거듭 OOM kill 되어 Rails 파드가 데이터베이스 복제본을 찾지 못했고, 모든 쿼리가 primary 로 몰려 GitLab.com 이 느려졌다.GitLab · 2022같은 원인 · 공통 컨테이너 메모리 한도
IL-0094JupyterHub 클러스터에서 학생 파드가 노드의 CPU 와 메모리를 다 써서 자원 보장이 부족했던 코어 파드가 자원을 얻지 못했고, 허브 전체가 멈췄다.2i2c · 2020같은 원인 · 공통 컨테이너 메모리 한도
IL-0093리더 ingress 컨트롤러 파드가 공유 메모리를 다 써서 ingress 컨트롤러 파드 6개 중 4개가 크래시 루프에 빠졌다UK Ministry of Justice · 2020같은 원인 · 공통 인그레스 컨트롤러
IL-0026메모리 제한이 없는 fluentd-sumologic 파드가 메모리를 다 써서 운영 쿠버네티스 노드 두 대에 이틀 연속 SystemOOM 이 났다Blue Matador · 2019같은 원인 · 공통 컨테이너 메모리 한도
같은 원인 · 공통 컨테이너 메모리 한도
같은 원인 · 공통 인그레스 컨트롤러
같은 원인 · 공통 컨테이너 메모리 한도
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0503
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0503/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.