{"id":"IL-0208","org":"GitLab","date":"2022-03-31","docs":["https://gitlab.com/gitlab-com/gl-infra/reliability/-/issues/15548","https://gitlab.com/gitlab-com/gl-infra/reliability/-/issues/15550"],"title":{"en":"A GitLab chart bump that renamed Kubernetes Service and Deployment ports made the GCP load balancer reconfigure, and GitLab.com slowed down and returned intermittent 50x errors","ko":"GitLab Helm 차트 업그레이드가 Service 와 Deployment 의 포트 이름을 바꿔 GCP 로드 밸런서가 다시 구성되는 동안 GitLab.com 요청이 느려지고 50x 오류가 났다"},"domain":["kubernetes","gcp","networking"],"impact":{"scope":"GitLab.com Web, API, Git and Pages services: slowness and intermittent 50x errors in five windows totalling 78 minutes","users":"an estimated 173896 unique IPs received a 50x response between 07:53 and 10:10 UTC","region":"unknown"},"review":{"written_by":"session","reviewed_at":null,"reviewed_by":null},"lessons":{"en":"Renaming ports on Kubernetes Services and Deployments behind a GCP load balancer made the load balancer reconfigure, and requests were slow or timed out until the new configuration had fully applied, which took minutes.\n\nGitLab notes that alerting worked well. The follow-up work is a way to drain a whole regional cluster gracefully and a Chatops command to put PagerDuty into maintenance mode.","ko":"알림은 정확하게 울렸다. 원인이 바로 직전에 배포한 변경이라는 것을 알았기 때문에, 그 변경을 배포하던 파이프라인을 멈추는 것이 자연스러운 첫 대응이었다."},"related":[],"sources":[{"url":"https://gitlab.com/gitlab-com/gl-infra/production/-/issues/6736","kind":"github","license":"unknown","archived":null}],"summary":{"en":"The change was deployed in turn to a canary environment, gprd-cny, and to the clusters gprd-us-east1-b, gprd-us-east1-c and gprd-us-east1-d. Merge request !1643 bumped the GitLab chart, and the new chart renamed ports on Kubernetes Services and Deployments for the Prometheus service and pod monitors. Applying that rename made the GCP load balancer reconfigure, and the new load balancer configuration needed some minutes to apply fully. During those minutes requests were slow and some timed out, which users saw as slowness and 50x errors. GitLab classifies the root cause as a configuration change.\n\nThe EOC drained the canary at 08:05 and re-enabled it at 08:25, and an engineer cancelled the deployment jobs for clusters c and d at 08:15 before they started. The pipeline nevertheless began deploying to gprd-us-east1-d at 09:04. At 09:31 the team raised the minimum replica count above 100. The change was then rolled out to gprd-us-east1-c in a controlled way: the cluster was drained in HAProxy at 09:53, the change was deployed at 09:57 and the cluster was re-enabled at 10:07. At 10:19 the minimum replica increase was reverted. GitLab sums up the mitigation as draining the clusters and running a controlled rollout of the change, and estimates that 173896 unique IP addresses received a 50x response between 07:53 and 10:10 UTC.","ko":"GitLab.com 의 Kubernetes 워크로드를 관리하는 k8s-workloads/gitlab-com 저장소에 GitLab 차트 버전을 올리는 변경 !1643 이 머지됐다. 이 차트 버전에서는 Prometheus ServiceMonitor, PodMonitor 와 관련된 변경으로 Kubernetes Service 와 Deployment 의 포트 이름이 바뀌었다. 포트 이름이 바뀌자 GCP 로드 밸런서가 다시 구성됐고, 새 구성이 완전히 적용되기까지 몇 분이 걸렸다. 그동안 요청이 느려졌고 일부는 타임아웃이 났다.\n\n배포는 카나리 환경인 gprd-cny 에서 시작해 08:03 에 gprd-us-east1-b 클러스터로 넘어갔다. 당직 엔지니어는 카나리를 트래픽에서 뺐고, 다른 엔지니어가 아직 시작하지 않은 cluster c 와 cluster d 배포 작업을 취소했다. 그런데 09:04 에 같은 변경이 의도와 달리 gprd-us-east1-d 클러스터에 배포되기 시작했다.\n\n팀은 남은 클러스터를 HAProxy 에서 뺀 상태로 변경을 배포하고 다시 넣는 방식으로 배포를 마쳤다. 그사이 최소 레플리카 수를 100 넘게 올렸다가 10:19 에 원래대로 되돌렸다. 영향은 다섯 구간을 합쳐 78분이었다. 원인은 설정 변경으로 분류됐다."},"trigger":{"en":"A k8s-workloads/gitlab-com pipeline deployed merge request !1643, a GitLab chart bump that changed the port names of Kubernetes Services and Deployments (related to the Prometheus service and pod monitors), starting with the canary environment gprd-cny at 07:49 UTC.","ko":"gitlab-com/gl-infra/k8s-workloads/gitlab-com!1643 머지 요청을 배포하는 파이프라인이 07:49 UTC 에 gprd-cny 로 배포를 시작했다. 이 변경에는 GitLab 차트 버전 업그레이드가 들어 있었고, 새 차트는 Prometheus ServiceMonitor, PodMonitor 설정과 관련된 변경으로 Kubernetes Service 와 Deployment 의 포트 이름을 바꿨다."},"severity":"unknown","symptoms":["high-error-rate","high-latency","intermittent-timeouts"],"timeline":{"detected_after":"1m","resolved_after":"2h 23m"},"date_kind":"incident","detection":{"en":"A PagerDuty alert on the rising error rate paged the EOC at 07:54 UTC, one minute after the 50x errors went up. The engineer deploying the change noticed the errors and linked them to it.","ko":"07:53 UTC 에 50x 오류가 늘기 시작했고 07:54 에 PagerDuty 알림이 당직 엔지니어를 호출했다. 변경을 배포하던 엔지니어가 오류를 보고 그 변경과 연결해 원인을 짚었다."},"components":["helm","cloud-load-balancer","haproxy"],"root_cause":"config-change","remediation":[{"text":{"en":"drained the canary environment and re-enabled it after twenty minutes","ko":"08:05 UTC 에 당직 엔지니어가 카나리 환경을 트래픽에서 뺐다가 08:25 에 다시 넣었다."}},{"text":{"en":"cancelled the deployment jobs for clusters c and d before they started","ko":"08:15 에 cluster c 와 cluster d 배포 작업을 시작 전에 취소했다."}},{"text":{"en":"drained gprd-us-east1-d in HAProxy and re-enabled it five minutes later","ko":"08:51 에 HAProxy 에서 gprd-us-east1-d 클러스터를 뺐다가 08:56 에 다시 넣었다."}},{"text":{"en":"raised the minimum replica count above 100 (merge request !1650)","ko":"09:31 에 최소 레플리카 수를 100 넘게 올리는 변경 !1650 을 머지했다."}},{"text":{"en":"drained gprd-us-east1-c in HAProxy, deployed the change to it, and re-enabled it","ko":"09:53 에 HAProxy 에서 gprd-us-east1-c 클러스터를 빼고, 09:57 에 이 클러스터에 !1643 을 배포한 뒤 10:07 에 다시 넣었다."}},{"text":{"en":"reverted the minimum replica increase (merge request !1652)","ko":"10:19 에 최소 레플리카 상향을 되돌리는 변경 !1652 를 머지했다."}}],"action_items":[{"text":{"en":"Implement graceful draining of a whole regional cluster","ko":"리전 클러스터 하나에서 트래픽을 통째로 안전하게 빼는 graceful drain 기능을 만든다."}},{"text":{"en":"Create a Chatops command that puts PagerDuty into maintenance mode","ko":"PagerDuty 를 유지보수 모드로 바꾸는 ChatOps 명령을 만든다."}}],"contributing":["automation-amplified"],"recurrence_of":null,"symptoms_text":{"en":"At 07:53 UTC on 2022-03-31 the rate of 50x errors on GitLab.com went up, and at 07:54 PagerDuty paged the engineer on call (EOC) about the rising error rate. Users saw slow pages and intermittent 50x error pages. The incident lists the Web, API, Git and Pages services as affected.\n\nThe errors started four minutes after a k8s-workloads/gitlab-com pipeline began deploying merge request !1643 to the canary environment gprd-cny at 07:49. The change was a GitLab chart bump that renamed ports on Kubernetes Services and Deployments, a rename related to the Prometheus service and pod monitors. The engineer who was deploying the change noticed the errors and tied them to it.\n\nThe impact came in five separate windows, 78 minutes in total: 07:53 to 08:02, 08:05 to 08:38, 08:53 to 09:01, 09:07 to 09:14 and 09:55 to 10:16 UTC. Over the same morning the change reached the gprd-us-east1-b cluster at 08:03, started deploying to the gprd-us-east1-d cluster at 09:04 even though the deployment jobs for clusters c and d had been cancelled at 08:15, and the EOC started deploying it to the gprd-us-east1-c cluster at 09:57.\n\nDeclaring the incident was slowed down as well: at 07:58 the Woodhouse slash command did not respond, and the EOC declared the incident in Slack at 08:03.","ko":"2022-03-31 07:53 UTC 에 GitLab.com 웹 서비스의 50x 오류가 늘기 시작했고, 1분 뒤 당직 엔지니어가 오류율 증가 페이지를 받았다. 사용자에게는 GitLab.com 이 느려졌고 간헐적으로 500 오류 페이지가 떴다.\n\n영향은 Web, API, Git, Pages 서비스에 걸쳤다. 요청이 느려지다가 일부는 타임아웃이 났다. 07:53 부터 10:10 UTC 사이에 50x 응답을 받은 고유 IP 는 173896 개로 추정됐다.\n\n영향은 한 번에 끝나지 않고 다섯 구간에 걸쳐 되풀이됐다. 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분이었다.\n\n07:58 에 당직 엔지니어는 Woodhouse 슬래시 명령으로 장애를 선언하려 했지만 명령이 응답하지 않았다. 그래서 08:03 에 Slack 에서 직접 장애를 선언했다. 변경을 배포하던 엔지니어가 오류를 보고 곧바로 그 변경과 연결했다."},"updated_at":"2026-11-10T00:00:41.183428Z","url":"https://benchlet.com/incidentlib/app/cases/IL-0208","org_slug":"gitlab"}