IL-0507 UC Berkeley · 2017-10-10kubernetesazure
Azure 쿠버네티스 노드 두 대에서 Docker 데몬이 멈춰 학생 파드가 시작되거나 종료되지 않았다
2017년 10월 10일 UC Berkeley DataHub 의 Azure 쿠버네티스 클러스터에서 일부 학생 파드가 제대로 시작되거나 종료되지 않았다. 영향받은 파드는 모두 k8s-pool1-19522833-13 과 k8s-pool2-19522833-9 두 노드에서 돌고 있었고, 두 노드 모두 Docker 데몬이 응답하지 않았다. 보고서는 두 노드에서 Docker 가 멈춰 파드가 제대로 시작되거나 멈추지 못했다고 결론지었다.
오전 10:45 에 학생 두 명의 서버가 시작되지 않는다는 신고가 왔고, 12:29 에 Terminating 에 멈춘 파드를 --grace-period=0 --force 로 강제로 지우자 서버가 시작됐다. 13:27 에 다른 학생의 신고를 살피다가 그 파드가 돌던 노드 pool1-...-13 에 Terminating 파드가 많고 docker ps 가 멈춘 것을 찾아 노드를 cordon 했다. 클러스터 전체를 살펴 pool2-...-9 도 같은 상태인 것을 찾았고, 그 노드의 파드를 강제로 지우고 cordon 했다. 다른 날 cordon 해 둔 pool1-...-14 는 재부팅하자 돌아와 uncordon 했다.
pool1-...-13 은 셸 재부팅과 Azure 포털 재시작으로도 돌아오지 않았다. 14:30 에 Azure 포털에서 이 노드를 멈췄다가 다시 시작하자 Docker 가 다시 응답했고, 운영팀은 노드를 uncordon 했다. pool2-...-9 도 Azure 포털에서 멈춘 뒤 14:45 에 다시 시작했다. 17:25 에 pool1-19522833-13 의 /var/lib/docker 가 /mnt 의 sdb 가 아니라 / 의 sda 에 있는 것을 발견했다.
- 심각도
- –
- 영향 범위
- UC Berkeley DataHub: student servers whose pods ran on two nodes could not start or stop
- 영향 사용자
- students whose pods were placed on the two nodes
- 지역
- –
- 감지까지
- –
- 복구까지
- –
증상
학생 두 명이 서버를 시작할 수 없다고 강의 Piazza 에 알렸고, /hub/admin 화면에서도 서버가 시작되지 않았다. 처음에는 학생들이 메모리를 다 썼을 수 있다는 말이 나왔다.
사용자 파드는 Terminating 상태에 멈춰 일반 삭제에 응하지 않았다. 영향받은 파드는 모두 특정 노드 두 대에서 돌고 있었고, 그 노드에는 Terminating 에 멈춘 파드가 그 밖에도 많았다.
두 노드에서 docker ps 가 멈췄다. pool2-...-9 의 load average 는 530, pool1-...-13 은 476 이었고, pool1-...-13 에서는 hypercube 가 CPU 766% 를 쓰고 있었다.
pool2-...-9 의 systemctl status docker 에는 level=error msg="containerd: start container" error="containerd: container did not start before the specified timeout" 와 Create container failed with error: containerd: container did not start before the specified timeout 이 되풀이됐다. 그 뒤로 Handler for GET /v1.24/containers/json returned error: write unix /var/run/docker.sock->@: write: broken pipe, http: multiple response.WriteHeader calls, No such container 가 이어졌다.
같은 노드에서 ps aux | grep exe | wc -l 의 결과는 520 이었고, 프로세스는 Dsl 상태의 /proc/self/exe init 였다.
pool1-...-13 은 셸에서 재부팅해도, Azure 포털에서 재시작해도 돌아오지 않았다.
원인
- 촉발
- –
감지
학생들이 강의 Piazza 와 강의 slack 에 서버가 시작되지 않는다고 알렸다.
조치
- Terminating 에 멈춘 사용자 파드를 kubectl --namespace=prod delete pod jupyter-<name> --grace-period=0 --force 로 강제로 지웠다. 그 뒤 /hub/admin 에서 서버가 제대로 시작됐다.
- docker ps 가 멈춘 노드 k8s-pool1-19522833-13 을 cordon 했다.
- 같은 상태인 k8s-pool2-19522833-9 에서 멈춘 파드를 모두 강제로 지우고 그 노드도 cordon 했다.
- pool1-...-13 을 Azure 포털에서 손으로 멈췄다가 다시 시작했다. 노드가 돌아와 Docker 가 응답하자 uncordon 했다.
- pool2-...-9 가 완전히 멈춘 뒤 Azure 포털에서 손으로 다시 시작했다.
후속 조치
- 학생 서버가 시작되거나 멈추지 않는다는 신고가 여러 건 오면 그 사용자 파드들이 같은 노드에서 돌았는지 확인한다.
- /var/lib/docker 를 sdb1 에 마운트하지 않은 노드가 몇 대인지 알아본다.
- Terminating 에 멈춘 파드 수가 늘어나는지 지켜본다. 예를 들어 kubectl --namespace=prod get pod -o wide| grep Terminating 으로 본다.
교훈
–
출처
관련 사례
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0507
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0507/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.