IL-0205 GitLab · 2021-06-21kubernetesgcp
이번 장애는 여러 문제가 얽혀 있었고, 대응하는 동안 다른 문제도 몇 가지 드러났다. 시작은 CI 러너가 새 머신을 띄우지 못한 장애 #4937 이었고, 원인은 GitLab 이 쓰는 GCP us-east1 리전의 SSD 부족이었다. API 서비스에는 다음 날 영향이 왔다. 사용자 트래픽과 함께 커지는 부하를 받으려고 API 가 노드를 늘려야 했는데 새 노드가 올라오지 않았다. 팀은 SSD 를 쓰지 않는 노드를 올리고 API 가 도는 노드 풀을 손으로 늘려 이 문제를 풀었다. API 서비스는 약 146분 동안 성능이 떨어진 상태였고, 사용자는 느린 응답을 겪었다. 오류율이 올라간 흔적은 없었다.
API 를 수습한 뒤에도 Auto-Deploy 가 막혀 있었다. 새 파드를 스케줄하려면 새 노드가 필요했는데 staging, canary, production 어디에서도 노드를 만들 수 없었다. 팀은 그날 내내 pd-standard 디스크를 쓰는 새 노드 풀을 올렸고, 이 과정에서 클러스터 오토스케일러 버그를 새로 만났다. 셀렉터에 맞는 노드 풀 하나가 확장하지 못하면 라벨이 맞는 다른 노드 풀로 확장을 시도하지 않는 문제였다. Auto-Deploy 는 1.5일 동안 막혔고, 2021-06-22 16:28 에 canary 배포가, 19:21 에 장애 이후 첫 프로덕션 배포가 끝났다.
팀은 모든 쿠버네티스 리소스를 pd-standard 디스크로 옮기기로 했다. 하루 동안 주로 새 노드 풀에서 운영하며 이상한 동작이 없는 것을 확인한 뒤 SSD 노드 풀을 정리했다. 영향받은 서비스는 API, Sidekiq, Git, GCP, Auto-Deploy 였다. 장애를 알아차리기까지 22시간이 걸렸다.
2021-06-21 08:05 UTC 부터 API 의 Apdex 가 나빠지고 Rails 대기열이 늘어나는 추세가 보였다. Apdex 는 목표 시간 안에 끝난 요청의 비율로 사용자 만족도를 나타내는 지표다. 08:43 에 ahmad 가 Slack 에서 장애를 선언했고, 09:01 에 API 디플로이먼트가 비정상 상태이고, 노드를 늘려 파드 용량을 더할 수도 없다는 것을 확인했다.
징후는 그보다 먼저 나타나 있었다. 2021-06-20 10:30 에 클러스터 오토스케일러가 Sidekiq 을 위해 프로덕션 클러스터의 노드를 늘리려다 처음으로 실패했다. 2021-06-21 05:51 부터는 CI 러너에서 SSD 고갈 징후가 보였다. CI 러너가 새 머신을 띄우지 못한 문제는 별도 장애 #4937 로 다루고 있었다.
클러스터 오토스케일러 로그에는 일부 노드가 백오프 상태라 확장할 수 없다는 오류만 있었다. 노드 풀이 왜 백오프 상태인지는 로그 어디에도 없었다. 팀은 다른 경로로 인스턴스 그룹 수준의 오류를 찾아냈지만, 거기에도 ZONE_RESOURCE_POOL_EXHAUSTED 만 있었고 어떤 자원이 바닥났는지는 나오지 않았다. 08:19 에 Google 지원팀이 SSD 재고가 부족하다고 알려 왔고, 바닥난 자원이 무엇인지는 결국 GCP 지원팀만 알려 줄 수 있었다.
API 를 수습한 뒤에도 새 파드를 띄울 노드를 만들 수 없어서 staging, canary, production 전체에서 Auto-Deploy 가 막혔다. pd-standard 디스크를 쓰는 새 노드 풀을 만들자, 이번에는 클러스터 오토스케일러가 새 노드 풀을 늘리지 않았다. 셀렉터에 맞는 노드 풀 하나가 확장에 실패하면 라벨이 맞는 다른 노드 풀로는 확장을 시도하지 않는 버그였다. Google 도 아는 문제였지만 수정 일정은 없었다.
원인 ? 클라우드 제공자 장애
로그를 한참 뒤져서 찾았다. 클러스터 오토스케일러 오류는 일부 노드가 백오프 상태라 확장할 수 없다고만 했고, 인스턴스 그룹 수준 오류도 ZONE_RESOURCE_POOL_EXHAUSTED 뿐이어서 어떤 자원이 바닥났는지 알 수 없었다. 결국 GCP 지원팀이 SSD 재고 부족을 알려 주었다. 탐지까지 22시간이 걸렸고, 팀은 자원 가용성 알림이 있었다면 탐지와 진단을 앞당길 수 있었다고 보았다.
장애를 수습하는 도중 다른 버그를 만나 대응 전체가 느려졌다. 팀에는 클라우드 자원 가용성을 감시할 수단도, 자원을 미리 예약해 둘 수단도 없었다. 워크로드는 pd-ssd 대신 pd-standard 디스크에서도 문제없이 도는 것으로 보였다.
같은 원인 · 공통 노드 풀, 클러스터 오토스케일러
같은 원인 · 공통 노드 풀, 클러스터 오토스케일러