문제
공개 API 23개와 라우트 규칙 26개로 들어오는 외부 요청이 예전 외부 파드를 거쳐 서비스로 가고 있었고, 이 길을 API Gateway로 옮겨야 했습니다.
운영 트래픽이 흐르는 중에 길을 바꾸는 일이라, 문제를 “트래픽을 한 번에 옮기지 않고, 단계마다 확인하고 되돌릴 수 있게 옮긴 뒤 예전 길을 치우는 것”으로 정했습니다.
접근
- 대상 확정: 추측 대신 코드를 대조하는 스크립트로 옮길 경로를 확정했습니다.
- 응답 비교: 26개 경로를 예전 경로와 게이트웨이 경로로 각각 불러 응답을 비교하고, 불일치 4건을 찾아 0건이 될 때까지 고쳤습니다.
- 관측 먼저: 전환 전용 Grafana 대시보드 2개(52패널)를 첫 전환 PR보다 4시간 12분 먼저 만들었습니다.
- 단계: 응답 비교, 헤더 카나리(특정 헤더가 붙은 요청만 새 길로 보내는 시험), 개발 환경 100%, 예전 경로 제거 순서로 진행했습니다. 알파 환경에서는 100%로 옮긴 뒤 약 1시간 21분 만에 계획된 롤백을 실행해 되돌리는 길도 확인했습니다.
- 자동 확인: 카나리 결과를 자동으로 확인하는 스크립트와 검증 문서 2건을 다시 쓸 수 있는 형태로 만들었습니다.
결정
- 운영 트래픽은 10%, 30%, 70%, 100% 네 단계로 7일에 걸쳐 옮겼습니다.
- 70% 단계의 스케일아웃(파드 수를 늘리는 것)에서 502가 약 800건 나자, 앱 준비 확인(readiness probe)을 15초에서 30초로 늦추고, nginx 준비 확인(35초)을 새로 두고, 메모리를 2.0GiB에서 3.6GiB로 올렸습니다. 파드가 요청을 받기 시작하는 시점은 약 15초에서 약 35초로 늦춰졌습니다. 원인을 좁혀 간 과정은 트러블슈팅 기록에 있습니다.
- 헤더 전달 설정은 명시하지 않고 기본값을 유지했습니다. 특정 전달 방식을 명시하면 사용자 정보의 약 3분의 1이 빠지는 것을 확인했기 때문입니다.
- 100% 전환 뒤 개발, 알파, 운영 환경의 예전 외부 파드를 0개로 줄였습니다.
결과
- 공개 API 23개와 라우트 규칙 26개를 7일 만에 옮겼고, 100% 구간 약 1,600만 요청 중 서버 오류는 1건이었습니다.
- 70% 단계에서는 502가 약 800건 났지만, 준비 확인과 메모리를 고친 뒤 100% 구간에서는 서버 오류가 1건이었습니다.
- 경로 응답 불일치는 4건에서 0건이 됐습니다.
- 예전 외부 파드는 개발, 알파, 운영 세 환경 모두 0개가 됐습니다.
기록과 자동화
- 문서: Kubernetes 설정 변경은 ADR로 합의해 남겼고, 전환 검증 문서 2건과 전환 전용 Grafana 대시보드 2개(52패널)를 남겼습니다.
- 프로세스 자동화: 코드를 대조해 전환 대상을 확정하는 스크립트와, 카나리 결과를 자동으로 확인하는 스크립트를 만들었습니다.
- 누가 쓰나: 검증 문서와 확인 스크립트는 다음 전환에서 같은 순서로 다시 쓸 수 있게 만들었습니다.
배운 점
- 위험한 전환 전에는 관측 대시보드부터 만듭니다.
- 상황: 공개 API 23개와 라우트 규칙 26개를 운영 트래픽이 흐르는 중에 옮겨야 했습니다.
- 한 일: 전환 전용 대시보드 2개(52패널)를 첫 전환 PR보다 4시간 12분 먼저 만들었습니다.
- 결과: 7일 만에 100%까지 옮겼고, 100% 구간 약 1,600만 요청 중 서버 오류는 1건이었습니다.
- 경로를 옮기기 전에 새 경로와 예전 경로의 응답이 같은지부터 비교합니다.
- 상황: 26개 경로를 게이트웨이로 옮겨야 했습니다.
- 한 일: 두 경로의 응답을 비교하는 검증을 첫 단계로 두었습니다.
- 결과: 불일치 4건을 찾아 0건으로 만든 뒤 전환했습니다.
- 트래픽 경로를 바꾼 뒤 이상이 생기면, 내가 한 작업보다 배포 이벤트가 난 시각부터 대조합니다.
- 상황: 전환 중 배포가 끝나지 않고 멈췄고, 트래픽 라우팅 경고가 약 900건 쌓였습니다.
- 한 일: 처음에는 직접 실행한 수동 동기화를 원인으로 설명했지만, 경고가 처음 난 시각을 다시 대조해 다른 라우트 교체 PR이 적용되고 45초 뒤였음을 찾았습니다.
- 결과: 설명을 바로잡고 교정 PR 2건으로 복구했습니다.
- 되돌리는 길도 운영 전에 한 번 실행해 봅니다.
- 상황: 운영 트래픽을 옮기기 전에, 문제가 생기면 되돌릴 수 있는지 확인해야 했습니다.
- 한 일: 알파 환경에서 100%로 옮긴 뒤 약 1시간 21분 만에 계획된 롤백을 실행했습니다.
- 결과: 되돌리는 순서를 확인한 뒤 운영 트래픽을 10%부터 옮겼습니다.