IL-0458 Wikimedia Foundation · 2019-09-10kubernetes
Toolforge 쿠버네티스 API 서버가 재시작 뒤 올라오지 못해 몇 시간 동안 클러스터 전체가 멈췄다
2019-09-10 18:30 에 maintain-kubeusers 프로세스가 Toolforge 쿠버네티스 API 서버를 재시작했고, API 서버는 다시 올라오지 못했다. 전날 밤 퍼핏 변경으로 API 서버가 쓰는 CA 인증서가 etcd 서버의 것과 어긋났는데, 재시작으로 etcd 에 다시 연결하기 전까지는 드러나지 않았다. API 서버가 멈춘 동안 webservice 와 kubectl 로 도구를 띄우거나 관리할 수 없었고, kube2proxy 가 죽어 쿠버네티스 webservice 전부가 프록시 단계에서 내려갔다.
로그에 etcd 오류가 찍히고 옛 etcdctl 이 1초 만에 타임아웃을 내자 팀은 etcd 를 원인으로 보았다. 쿠버네티스 마스터와 etcd 클러스터를 재부팅하고, 백업을 뜬 뒤 잦은 raft 선출을 원인에서 빼려고 etcd 를 노드 하나로 줄였다. 21:24 에 etcd 가 느렸을 뿐 떨어진 것이 아님을 알고 클러스터를 원래 크기로 되돌리기 시작했다. 그런데 첫 노드를 다시 넣을 때 실수가 있어 노드 두 개짜리 etcd 클러스터가 무너졌다. 노드 두 개짜리 etcd 클러스터는 두 노드가 모두 살아 있어야 동작한다. 결국 백업에서 전체 재해 복구를 해 00:25 쯤 etcd 를 원래 용량으로 되돌렸다.
01:02 에 CA 인증서가 전날 밤 바뀌었다는 것을 찾았고, 01:05 에 curl 로 kube API 서버에서 나가는 SSL 호출에서만 CA 신뢰 오류가 나고 etcd 서버끼리는 나지 않는 것을 재현했다. 01:28 에 CA 를 etcd 서버의 것으로 바꾸자 통신과 서비스가 돌아왔지만, 01:33 에 퍼핏이 그 변경을 되돌려 다시 깨졌다. 01:43 에 etcd 퍼핏 CA 인증서를 /var/lib/puppet/client/ssl/certs/ca.pem 에 두자 퍼핏이 그 인증서를 가져가 안정적으로 복구됐다. 복구에는 SRE 4명, 팀 관리자 1명, 기술 자원봉사자 1명이 참여했다.
- 심각도
- –
- 영향 범위
- Toolforge Kubernetes API server down for several hours: tools could not be launched or managed with webservice or kubectl, and Kubernetes webservices were offline at the proxy level after kube2proxy crashed
- 영향 사용자
- Toolforge users and the tools running on the Kubernetes backend
- 지역
- –
- 감지까지
- 15m
- 복구까지
- 7h 13m
증상
18:45 에 toolschecker 의 icinga 검사 "All k8s nodes healthy" 가 알림을 울렸다. 쿠버네티스 API 서버가 응답하지 않아 모니터링에서도 사용자 쪽에서도 클러스터가 완전히 내려간 것처럼 보였다. 사용자는 webservice 명령으로 도구를 띄울 수 없었고 kubectl 로 상태를 보거나 도구를 다룰 수도 없었다.
kube-apiserver 로그의 마지막 실패 메시지는 "Failed to list *storage.StorageClass: client: etcd cluster is unavailable or misconfigured" 였다. kube-apiserver 프로세스를 다시 시작해도 실패했고, 쿠버네티스 마스터를 재부팅해도 같았다.
API 서버가 멈춘 직후 kube2proxy 도 쿠버네티스 변경을 watch 하지 못했다. kube2proxy 는 처음부터 다시 시작했다가 죽었다. prometheus 로 보면 컨테이너와 도구 자체는 영향이 없었지만, 쿠버네티스 webservice 전부가 프록시 단계에서 내려간 것으로 보였다. 19:48 에는 Toolforge 홈페이지 다운 알림도 울렸다.
18:55 에 퍼핏 인증서를 의심했다. 그러나 이 클러스터는 프로젝트 내부 인증서를 쓰고 퍼핏 인증서는 전날 밤에 바뀌었으므로, 장애 시점과 맞지 않는다고 보고 제쳤다. 방화벽 변경도 확인했지만 새 퍼핏 마스터를 위한 변경이어서 시점이 맞지 않았다.
etcd 헬스체크는 정상으로 나왔다. 그런데 etcd 에서도 같은 오류 메시지가 재현됐고 etcd 로그에 타임아웃과 잦은 raft 선출이 보였다. 그래서 팀은 etcd 를 원인으로 잘못 짚었다. tools-k8s-etcd 서버의 옛 etcdctl 은 1초 만에 타임아웃이 났다. 이 때문에 etcd 가 죽었다 살아나기를 되풀이하거나 점점 무너지는 중인 것처럼 보였다. 21:24 에야 etcd 가 떨어진 것이 아니라 etcdctl 기본 타임아웃보다 느렸을 뿐이라는 것을 알았다.
원인
- 촉발
- 18:30 에 maintain-kubeusers 프로세스가 쿠버네티스 API 서버를 재시작했다. 재시작한 API 서버는 etcd 에 다시 연결해야 했는데, 전날 밤 퍼핏 변경으로 CA 인증서가 etcd 서버의 것과 어긋나 있어 연결하지 못했다.
감지
처음 울린 것은 http://checker.tools.wmflabs.org/k8s/nodes/ready 를 검사하는 icinga 알림이었다. 18:45 에 toolschecker 의 "All k8s nodes healthy" 검사가 울렸다.
조치
- 19:10 과 20:30 에 쿠버네티스 마스터를, 20:18 에 etcd 클러스터를 재부팅했지만 도움이 되지 않았다.
- 21:06 에 백업을 떠 둔 뒤 잦은 raft 선출을 원인에서 빼려고 etcd 클러스터를 노드 하나로 줄였다.
- 노드를 다시 넣다 클러스터가 무너진 뒤 여러 시도 끝에 백업에서 etcd 전체 재해 복구를 해 00:25 쯤 etcd 를 원래 용량으로 되돌렸다.
- 01:28 에 API 서버가 쓰는 CA 를 etcd 서버의 CA 로 바꿨고, 통신과 서비스가 돌아왔다. 퍼핏이 곧 이 변경을 되돌렸다.
- 01:43 에 etcd 퍼핏 CA 인증서를 /var/lib/puppet/client/ssl/certs/ca.pem 에 두었고, 퍼핏이 이 인증서를 가져가 장애가 안정적으로 끝났다.
후속 조치
- etcd 클러스터 운영 절차를 문서로 남긴다. 작업 번호는 T232769 다.
- Toolforge 쿠버네티스 업그레이드로 etcd 와 쿠버네티스의 오류 보고를 개선하고, 도구를 추가할 때 API 서버를 재시작하지 않아도 되게 한다. 작업 번호는 T214513 이다.
- kube2proxy 가 API 서버 장애를 더 잘 견디게 만들어 본다. 작업 번호는 T232770 이다.
- 퍼핏 CA 인증서를 점검한다. tools 프로젝트 안에 CA 인증서가 둘 이상 있어서는 안 된다. 작업 번호는 T232772 다.
- 쿠버네티스 컨트롤 플레인을 고가용성으로 만든다. 작업 번호는 T142862 다.
교훈
etcd 처럼 원래 말썽이 잦은 구성 요소가 해법 찾기를 헷갈리게 했다. 퍼핏 인증서는 위험하다. 아주 오래된 쿠버네티스 버전은 로그에 남기는 오류 메시지가 형편없다. 팀은 CA 인증서가 아니라 etcd 를 고치려다 상황을 더 나쁘게 만들었다. 문제는 API 서버를 재시작할 때에야 드러났다. etcd 클러스터에는 문서화되지 않은 오래된 특이점이 있었고, etcd 재해 복구와 노드 교체 절차는 문서로 남아 있지 않았다. 이 셋이 겹쳐 해법을 찾는 데 오래 걸렸다. 교차 교육이 있었다면 도움이 됐을 수 있지만, 이번 일은 어차피 여럿이 함께 풀어야 했다.
출처
참고 문서
관련 사례
IL-0152정비 작업 중 FRA1 내부 인프라 클러스터에 잘못된 설정이 들어가 그 위에서 돌던 DOKS 클러스터 200개의 컨트롤 플레인이 자동으로 삭제됐다.DigitalOcean · 2024같은 원인 · 공통 etcd, 쿠버네티스 API 서버
IL-0200새로 띄운 쿠버네티스 노드가 호환되지 않는 etcd 버전으로 돌아 여러 운영 클러스터의 합의가 깨졌고, GitHub.com 의 git 작업과 웹 요청이 5XX 오류로 실패했다.GitHub · 2026같은 원인 · 공통 etcd
IL-0005새 텔레메트리 서비스가 모든 노드에서 무거운 쿠버네티스 API 요청을 보내 대형 클러스터의 컨트롤 플레인이 무너졌고, DNS 기반 서비스 디스커버리가 깨져 OpenAI 의 모든 서비스가 멈췄다OpenAI · 2024같은 원인 · 공통 쿠버네티스 API 서버
IL-0118쿠버네티스 네임스페이스 라벨을 전역으로 바꾸자 네트워크 계층이 메타데이터를 다시 계산하면서 가장 큰 GPU 클러스터들 가운데 세 곳의 컨트롤 플레인이 과부하에 빠졌고, ChatGPT 와 API 가 타임아웃과 503 오류를 냈다.OpenAI · 2024같은 원인 · 공통 쿠버네티스 API 서버
IL-0068익명 요청을 허용한 쿠버네티스 API 서버로 공격자가 들어와 RBAC 로 백도어를 만들고, DaemonSet 으로 Monero 채굴기를 모든 노드에 띄웠다.Aqua Security · 2023같은 원인 · 공통 쿠버네티스 API 서버
같은 원인 · 공통 쿠버네티스 API 서버
같은 원인 · 공통 쿠버네티스 API 서버
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0458
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0458/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.