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 공간을 차지하는지 찾을 수 있다.
같은 원인 · 공통 쿠버네티스 API 서버, etcd
같은 원인 · 공통 쿠버네티스 API 서버, etcd
같은 원인 · 공통 쿠버네티스 API 서버
같은 원인 · 공통 etcd
같은 원인 · 공통 쿠버네티스 API 서버