IL-0077 Marcin Cuber · 2024-06-05 (게시일)kubernetesaws
EKS 1.30 운영 클러스터에서 etcd 데이터베이스가 한도를 넘어 클러스터가 읽기 전용이 됐다. EKS 는 etcd 데이터베이스 크기를 업스트림 권장 최대치인 8GB 로 잡는다. 한도를 넘으면 etcd 는 no space 알람을 내고 쓰기 요청을 더 받지 않는다. 이 상태에서는 객체를 지워 공간을 되찾을 수도 없다. 지운 객체의 공간은 컴팩션을 거쳐야 정리되는데, no space 알람이 켜져 있으면 컴팩션이 허용되지 않기 때문이다. 컴팩션은 데이터베이스 안의 공간만 비우고, 파일 시스템 공간을 운영체제에 돌려주려면 조각 모음을 해야 한다.
공간을 차지한 것은 Kyverno 1.12 가 만든 ephemeralreports 객체였다. 글쓴이는 kubectl delete --raw 로 이 객체를 한꺼번에 지우는 스크립트를 돌렸지만, etcd 가 이미 잠겨 있어 통하지 않았다. 직접 고칠 수 없다고 판단해 AWS 지원팀에 비즈니스 크리티컬 티켓을 열고 에스컬레이션했다. 여러 스크립트를 시도해도 잠금이 풀리지 않자 EKS 팀과 etcd 팀이 8GB 와 10GB 이던 저장 공간을 12GB 로 늘렸다. 잠금은 풀렸지만 kubectl 명령이 처리되지 않았다. AWS EKS 팀이 내부에서 조사해 보니 API 서버가 뒤처져 있었고, etcd 는 정리되지 않고 쌓인 ephemeralreports 객체 때문에 버거워하고 있었다.
몇 시간 동안 디버깅한 끝에 AWS etcd 팀이 저장소에서 객체를 직접 지우기로 했다. AWS 엔지니어가 여러 승인을 거친 뒤 etcd 에서 쌓인 객체를 직접 지웠고, 그제야 EKS 가 다시 동작했다. 글쓴이는 etcdctl delete 로 해당 접두사 아래 키를 지웠을 것으로 추정했다. 해결까지 7시간이 넘게 걸렸다. 글쓴이는 etcd 에서 객체를 바로 지워 달라고 여러 번 요청했고 서면으로 승인까지 했다. 그 요청대로 처리됐다면 7시간이 30분으로 줄었을 것이라고 적었다.
Kyverno 팀은 이 문제를 최우선으로 다뤘다. 1.12.4-rc2 에 수정이 들어갔고 이후 Kyverno v1.12.4 가 나왔다.
운영 EKS 클러스터가 읽기 전용 상태가 됐다. etcd 데이터베이스 공간이 한도를 넘자 API 서버가 새 파드 생성이나 디플로이먼트 스케일 조정처럼 객체를 바꾸는 요청을 모두 거부했다. 글쓴이는 이를 P1 장애로 다뤘다.
etcd 데이터베이스가 한도를 넘으면 kube-apiserver 감사 로그에 다음 응답이 남는다. responseObject.code 500 responseObject.kind Status responseObject.message etcdserver: mvcc: database space exceeded responseObject.status Failure
EKS 의 etcd 저장 공간은 8GB 인데, 글쓴이의 경험으로는 이것이 소프트 한도이고 하드 한도는 10GB 다. 이 클러스터는 하드 한도까지 넘겼고, AWS 가 관리하는 EKS 컨트롤 플레인 전체가 잠겨 버렸다.
글쓴이는 공간을 차지한 객체가 ephemeralreports 리소스라는 것을 찾아내고 스크립트로 지우려 했지만, etcd 가 완전히 잠겨 있어 지워지지 않았다. AWS 가 저장 공간을 12GB 로 늘려 잠금은 풀렸지만, 이번에는 어떤 kubectl 명령도 처리되지 않았다. etcd 가 API 서버와 연결을 잃은 것처럼 보였고, API 서버는 뒤처지고 etcd 는 정리되지 않고 쌓인 ephemeralreports 객체 때문에 버거워하고 있었다.
원인 소프트웨어 결함
클러스터가 읽기 전용이 되어 쓰기 요청이 거부되면서 드러났다. 글쓴이는 kube-apiserver 감사 로그에서 mvcc: database space exceeded 를 찾는 CloudWatch Logs Insights 쿼리로 오류가 처음 나온 시각을 확인하는 방법을 소개했다.
EKS 의 etcd 데이터베이스 한도는 8GB 다. 한도를 넘으면 클러스터가 읽기 전용이 되고, 컴팩션도 막혀 객체를 지워 공간을 되찾을 수 없다. 글쓴이가 관찰한 바로는 객체를 지우는 스크립트도 etcd 가 잠기기 전에만 통한다. 그러므로 etcd 크기를 모니터링하고 8GB 에 절대 닿지 않게 해야 한다.
EKS 에서는 etcd 에 직접 접근할 수 없어 잠긴 etcd 를 스스로 풀 수 없다. AWS 지원팀에 의존해야 하고, 해결 방법을 알아도 실행되기까지 오래 걸릴 수 있다.
apiserver_storage_objects 지표로 리소스 종류별 객체 수를 보면 무엇이 etcd 공간을 차지하는지 찾을 수 있다.
IL-0072 etcd 쓰기 지연으로 API 서버가 오래된 데이터를 읽어 클러스터 상태가 두 가지로 번갈아 보였고, 주 운영 클러스터 전체가 약 4시간 멈췄다Nordstrom · 2017같은 원인 · 공통 etcd, 쿠버네티스 API 서버
IL-0003 etcd 클러스터 재구성 뒤 쿠버네티스 버그로 linkerd 가 서비스 위치 갱신을 받지 못했고, linkerd 를 모두 재시작하자 엔드포인트가 없는 서비스를 파싱하지 못하는 오류가 드러나 플랫폼 전체가 멈췄다Monzo · 2017같은 원인 · 공통 etcd, 쿠버네티스 API 서버
IL-0138 nvidia-dkms-390 드라이버 빌드 실패로 망가진 커널 헤더가 몇 주 동안 방치됐다가, 정전 뒤 재부팅하자 하나뿐인 마스터 노드가 커널 패닉에 빠져 홈랩 쿠버네티스 클러스터가 6일 동안 멈췄다.Barush Mendez · 2025같은 원인 · 공통 쿠버네티스 API 서버
IL-0190 쿠버네티스 업그레이드로 etcd 리더가 있던 노드가 갑자기 종료된 뒤, Cortex distributor 두 개가 옛 리더와 맺은 TCP 연결이 멈춘 채 그 연결을 계속 써서 런던 리전 Hosted Prometheus 쓰기가 12분 동안 일부 실패했다.Grafana Labs · 2020같은 원인 · 공통 etcd
같은 원인 · 공통 쿠버네티스 API 서버
https://incidentlib-mcp.benchlet.com/mcpAPI 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.