IL-0035 NU.nl · 2019-02-01 (게시일)kubernetesawsobservability
NU.nl 개발팀은 몇 달 전부터 작은 쿠버네티스 클러스터 몇 개를 운영했다. 클러스터에는 로그 도구와 빌드 도구 일부, 그리고 작은 내부용 고객 대면 워크로드가 올라가 있었다. 로그는 Elasticsearch 클러스터에 모았고, 로그로 알림을 만들려고 ElastAlert 를 시험하고 있었다.
장애 직전에 Cloudfront-* 인덱스에 일정 시간 새 문서가 들어오지 않으면 울리는 알림이 추가되었다. 이 Cloudfront 배포는 시간당 요청이 수백만 건이어서, 이 규칙 때문에 ElastAlert 파드의 메모리 사용량이 폭증했다. ElastAlert 를 설치한 Helm 차트는 자원 요청값과 한도를 지정할 수 있지만 기본값이 없었고, 팀도 이를 놓쳐 파드에 메모리 한도가 없었다. 메모리가 바닥난 노드에서 시스템 OOM 이 일어나 노드가 NotReady 를 오갔고, 같은 노드를 쓰던 서비스와 클러스터 안의 Grafana, Prometheus 가 함께 흔들렸다.
팀은 NotReady 노드를 하나씩 종료했지만 새 노드도 곧 NotReady 가 되었다. 그 사이 Prometheus 와 Grafana 가 안정적인 노드에 스케줄되었고, 파드 메모리 대시보드에서 끝없이 치솟는 선이 모두 ElastAlert 파드라는 것이 드러났다. 돌아보면 use_count_query 나 max_query_size 를 썼어야 했다.
원문은 근본 원인 하나를 고치는 데서 끝내지 않고, 장애로 이어진 실패를 차례로 하나씩 짚는다. 알림은 하나도 울리지 않았다. 모니터링이 장애가 난 클러스터 안에 있어서 클러스터에 닿지 못하면 아무것도 볼 수 없었다. EC2 에서 도는 ELK 스택에 같은 데이터가 있었지만 제대로 시각화되지 않았거나 눈에 띄지 않았다. 고객 대면 워크로드와 운영 도구가 같은 자원을 나눠 썼다. 새 알림은 코드 리뷰를 거쳤지만 배포 사실을 팀 전체가 알지 못했다. 배포 뒤 스모크 테스트가 없었고, 쿠버네티스 운영 지식은 팀 일부에만 있었다.
팀은 여러 서비스가 이상하게 동작한다는 보고를 받았다. 가끔 오류 페이지가 뜨고, 응답이 느리고, 타임아웃이 났다.
Grafana 로 조사하려 했지만 Grafana 와 Prometheus 도 같은 증상을 보였다. 콘솔에서 `kubectl get nodes` 를 실행하자 v1.10.6 노드 가운데 ip-10-150-37-179 와 ip-10-150-39-21 두 대가 NotReady 였다.
정상인 노드까지 여러 노드를 `kubectl describe node` 로 보니, 이벤트에 Starting kubelet, NodeNotReady, NodeReady 가 이어졌다. 그 사이에 `SystemOOM` 경고가 `System OOM encountered` 라는 메시지와 함께 네 번 찍혀 있었다. kubelet 이 메모리를 회수하기 전에 노드의 운영체제가 프로세스를 죽이는 것으로 보였다.
노드는 오토스케일링 그룹에 속해 있었다. 팀은 NotReady 노드를 하나씩 종료해 새 노드가 안정적으로 버티는지 보았다. 새 노드는 정상으로 올라왔지만 기존 노드나 새 노드가 금세 다시 NotReady 가 되었다. 다만 이 과정에서 Prometheus 와 Grafana 가 안정적인 노드로 옮겨 가 데이터를 볼 수 있게 되었다.
원인 ? 설정 변경
여러 서비스에서 오류 페이지, 느린 응답, 타임아웃이 난다는 보고가 팀에 들어왔다. 알림은 하나도 울리지 않았다. 팀은 Prometheus 와 Grafana 가 안정적인 노드로 옮겨 간 뒤 파드 메모리 사용량 대시보드에서 원인을 찾았다.
근본 원인 하나만 탓하는 포스트모템은 장애로 이어진 문제의 15% 정도만 다룬다. 이번에도 ElastAlert 를 고친 것은 일부일 뿐이었다. 알림이 없었고, 모니터링이 같은 클러스터 안에 있었고, Helm 차트의 자원 한도에 기본값이 없었다. 운영 도구와 고객 워크로드가 자원을 나눠 썼고, 손으로 한 배포를 팀이 몰랐고, 스모크 테스트가 없었고, 운영 지식이 일부에게만 있었다. 이렇게 배우려면 장애 건수나 해결 시간만 보지 않고 비난 없는 포스트모템을 허용하는 문화가 필요하다.
같은 원인 · 공통 컨테이너 메모리 한도
같은 원인 · 공통 kubelet
같은 원인 · 공통 컨테이너 메모리 한도
같은 원인 · 공통 kubelet