IL-0208 GitLab · 2022-03-31kubernetesgcpnetworking
GitLab.com 의 Kubernetes 워크로드를 관리하는 k8s-workloads/gitlab-com 저장소에 GitLab 차트 버전을 올리는 변경 !1643 이 머지됐다. 이 차트 버전에서는 Prometheus ServiceMonitor, PodMonitor 와 관련된 변경으로 Kubernetes Service 와 Deployment 의 포트 이름이 바뀌었다. 포트 이름이 바뀌자 GCP 로드 밸런서가 다시 구성됐고, 새 구성이 완전히 적용되기까지 몇 분이 걸렸다. 그동안 요청이 느려졌고 일부는 타임아웃이 났다.
배포는 카나리 환경인 gprd-cny 에서 시작해 08:03 에 gprd-us-east1-b 클러스터로 넘어갔다. 당직 엔지니어는 카나리를 트래픽에서 뺐고, 다른 엔지니어가 아직 시작하지 않은 cluster c 와 cluster d 배포 작업을 취소했다. 그런데 09:04 에 같은 변경이 의도와 달리 gprd-us-east1-d 클러스터에 배포되기 시작했다.
팀은 남은 클러스터를 HAProxy 에서 뺀 상태로 변경을 배포하고 다시 넣는 방식으로 배포를 마쳤다. 그사이 최소 레플리카 수를 100 넘게 올렸다가 10:19 에 원래대로 되돌렸다. 영향은 다섯 구간을 합쳐 78분이었다. 원인은 설정 변경으로 분류됐다.
2022-03-31 07:53 UTC 에 GitLab.com 웹 서비스의 50x 오류가 늘기 시작했고, 1분 뒤 당직 엔지니어가 오류율 증가 페이지를 받았다. 사용자에게는 GitLab.com 이 느려졌고 간헐적으로 500 오류 페이지가 떴다.
영향은 Web, API, Git, Pages 서비스에 걸쳤다. 요청이 느려지다가 일부는 타임아웃이 났다. 07:53 부터 10:10 UTC 사이에 50x 응답을 받은 고유 IP 는 173896 개로 추정됐다.
영향은 한 번에 끝나지 않고 다섯 구간에 걸쳐 되풀이됐다. 07:53~08:02 에 9분, 08:05~08:38 에 33분, 08:53~09:01 에 8분, 09:07~09:14 에 7분, 09:55~10:16 에 21분으로 합계 78분이었다.
07:58 에 당직 엔지니어는 Woodhouse 슬래시 명령으로 장애를 선언하려 했지만 명령이 응답하지 않았다. 그래서 08:03 에 Slack 에서 직접 장애를 선언했다. 변경을 배포하던 엔지니어가 오류를 보고 곧바로 그 변경과 연결했다.
원인 ? 설정 변경
07:53 UTC 에 50x 오류가 늘기 시작했고 07:54 에 PagerDuty 알림이 당직 엔지니어를 호출했다. 변경을 배포하던 엔지니어가 오류를 보고 그 변경과 연결해 원인을 짚었다.
알림은 정확하게 울렸다. 원인이 바로 직전에 배포한 변경이라는 것을 알았기 때문에, 그 변경을 배포하던 파이프라인을 멈추는 것이 자연스러운 첫 대응이었다.
같은 원인 · 공통 클라우드 로드 밸런서, HAProxy
같은 원인 · 공통 클라우드 로드 밸런서
같은 원인 · 공통 클라우드 로드 밸런서
같은 원인 · 공통 클라우드 로드 밸런서
같은 원인 · 공통 클라우드 로드 밸런서