85. 카나리 배포 (Canary Release) - 극단적 롤아웃과 리스크의 소멸
⚠️ 이 문서는 신규 버전(v2.0) 서버를 띄울 때 서버 100대를 확 갈아버렸다가 전국 1,000만 고객에게 동시다발적 에러를 뿜게 만들어 회사가 뉴스에 나오는 대참사를 막기 위해, **옛날 탄광의 광부들이 독가스 유무를 알기 위해 연약한 '카나리아 새'를 먼저 들여보냈던 것처럼, 오직 전체 트래픽의 1% 불쌍한 고객들만 슬쩍 v2.0 서버로 밀어 넣어 결제 장애(독가스)가 터지는지 팝콘 먹으며 지켜본 뒤 10%, 100%로 밸브를 서서히 여는 실리콘밸리 빅테크들의 가장 쫄보 같지만 가장 강력한 배포 전술인 '카나리 배포(Canary Deployment)'**를 다룹니다.
핵심 인사이트 (3줄 요약)
- 본질: 사내 테스터(QA) 10명이 클릭해보는 것으로는 완벽한 버그를 절대 잡을 수 없다. 가장 완벽한 테스터는 바로 '진짜 돈을 쓰는 리얼 고객'이다. 카나리는 이 진짜 고객 중 1%를 내 배타 테스터 마루타로 몰래 써먹는 네트워크 트래픽 쪼개기 예술이다.
- 가치: 장애의 타격(Blast Radius)을 극단적으로 최소화한다. 결제 버그가 터져도 전체 고객의 99%는 평온하게 구버전(v1.0)으로 돈을 내고 있으므로 회사 매출은 타격이 없다. 1%에서 500 에러(독가스)가 감지되는 순간 1초 만에 밸브를 닫아버리는 무피해 롤백(Rollback)이 꽃이다.
- 기술 체계: 이 마법은 단순히 파드 몇 개 더 띄운다고 되지 않는다. 로드밸런서나 쿠버네티스의 Ingress, Istio(서비스 메시) 같은 똑똑한 L7 라우팅 엔진이 앞단에 떡 하니 버티고 서서 가중치 기반 라우팅(Weight Routing)이나 HTTP 헤더 분석으로 트래픽을 현미경처럼 갈라쳐 줘야만 가능하다.
Ⅰ. 사내 QA의 한계와 카나리아 새의 투입
테스트 서버에서 잘 돌던 놈이 운영 서버에만 나가면 터지는 징크스.
- 블루/그린(Blue/Green) 배포의 맹점:
- 어제 배운 블루/그린 배포는 완벽해 보였다. 개발자들이 Green(신규) 서버 뒷구멍으로 들어가 1시간 동안 장바구니를 담아보고 완벽하다며 100% 트래픽을 팍 스위칭했다.
- 그런데 스위치를 꺾자마자 서버가 폭파되었다. 개발자 10명의 클릭은 버텼지만, "실제 운영망의 예측 불가능한 브라우저, 기상천외한 사용자 행동 패턴, 캐시 미스"가 쏟아지자 코드가 견디지 못하고 죽어버린 것이다 (현장 데이터의 부재).
- 카나리 새(Canary Bird)의 출격 (점진적 라우팅):
- 그래서 구글이나 페이스북은 사내 테스트를 불신한다.
- v1.0 서버 100대가 도는 옆에, v2.0(새 코드) 서버 파드 딱 1대만 살포시 띄운다.
- 그리고 앞단의 Nginx Ingress나 Istio 설정 창에서 룰을 건다. "지금부터 들어오는 외부 손님 100명 중, 무작위로 주사위를 굴려서 99명은 v1.0으로 보내고 딱 1명만 v2.0 서버로 던져라! (가중치 99:1 라우팅)"
- 독가스 탐지와 관망:
- 데브옵스 엔지니어는 팔짱을 끼고 모니터링 대시보드(Datadog, Prometheus) 화면에 띄워둔 **'v2.0 서버의 5xx 에러율 그래프(새의 심박수)'**만 뚫어져라 쳐다본다.
- 이 1%의 실제 유저들이 새 서버에서 미친 짓을 하며 1시간 동안 온갖 결제 버튼을 다 누르고 다닌다. 만약 500 에러 그래프가 팍 튀어 오르면(독가스 감지/새가 죽음)?
- 스위치를 돌려 1%의 유입 밸브마저 즉시 꽉 잠가버려(Rollback) 100% v1.0으로 복귀한다. 희생자는 1%에 불과하여 회사는 뉴스를 타지 않고 생존한다.
📢 섹션 요약 비유: 제약 회사가 신약(v2.0)을 만들었습니다. 임상 시험(사내 테스트)은 통과했지만, 전 국민 1,000만 명(트래픽 스위칭)에게 한 번에 주사를 놔버렸다가 부작용이 터지면 나라는 멸망합니다(블루그린의 한계). 그래서 카나리 배포는 아주 조심스럽게 무작위로 뽑은 A 마을 주민 100명(1% 트래픽)에게만 며칠간 약을 먹여봅니다. 주민들이 구토(500 에러)를 하는지 매의 눈으로 모니터링하다가 100명 다 멀쩡하면 B 도시(10%), 나중엔 전국(100%)으로 주사 보급 밸브를 서서히 열어가는, 가장 보수적이고 빈틈없는 안전 주사 기법입니다.
Ⅱ. 트래픽 분할의 예술 (Weight vs Header)
무작위로 뽑을 것인가, 콕 집어서 보낼 것인가.
- 가중치 기반 라우팅 (Weight-based Traffic Split):
- 가장 대중적인 카나리 방식이다.
- 쿠버네티스의
Ingress Nginx컨트롤러 같은 녀석이canary-weight: 5(5%) 라는 텍스트 한 줄만 먹이면, 알아서 들어오는 IP들을 랜덤으로 섞어서 정확히 5%의 트래픽만 신규 파드 쪽으로 꺾어준다. (운 좋은 5% 고객은 자기가 마루타인지 모른 채 새 디자인 화면을 쓴다.)
- HTTP 헤더 기반 타겟팅 라우팅 (Header-based Routing):
- 랜덤으로 돌렸다가 VVIP 고객이 재수 없게 걸려 에러를 보면 큰일 난다. 이럴 때 쓴다.
- 로드밸런서가 문 앞에서 브라우저가 던지는 HTTP 헤더를 까본다.
- 룰 1:
if (Header [User-Agent] == 'Android' && Header [User-Group] == 'Beta-Tester') - 오직 쿠키나 헤더에 '나 베타 테스터 앱 깔았음'이라는 징표가 있는 안드로이드 폰 고객만 족집게처럼 핀셋으로 뽑아서 신규 v2.0 서버로 던진다. 나머지 99.9% 일반 고객은 무조건 v1.0으로 보낸다. (A/B 테스트 플랫폼과 완벽하게 똑같은 원리로 동작한다.)
📢 섹션 요약 비유: 백화점 정문에서 100명의 손님이 들어올 때, 눈을 감고 제비뽑기를 해서 5명만 강제로 새로 연 신관(v2.0) 건물로 등 떠미는 것이 '가중치 기반 랜덤 카나리'입니다. 반대로 정문 가드가 손님들의 목에 걸린 이름표(HTTP 헤더)를 일일이 스캔한 뒤, 'VIP 손님'이나 '직원 가족'이라는 목걸이를 건 특별한 사람만 콕 집어서 신관 VIP 라운지로 조용히 안내하고 일반인은 전부 구관(v1.0)으로 보내는 타겟팅 기법이 '헤더 기반 카나리'입니다.
Ⅲ. 수동 배포의 몰락과 프로그레시브 딜리버리 (Argo Rollouts)
모니터를 보며 10% 밸브를 손으로 돌리는 것도 결국 인간의 노가다다.
- 데브옵스의 철야 감시 한계:
- 1% 카나리를 열어놓고 1시간 동안 엔지니어가 모니터 화면(새가 죽는지)을 뚫어져라 쳐다보고 있다. 괜찮은 것 같아서 10%로 밸브를 손으로 올린다. 또 1시간 구경한다.
- 넷플릭스처럼 하루에 수십 번 배포하는 회사에선 사람이 모니터링하다 미쳐버린다.
- Argo Rollouts와 프로그레시브 딜리버리 (Progressive Delivery):
- 카나리 배포 자체를 AI 로봇(Argo Rollouts 등)에게 통째로 외주 줘버린 궁극의 자동화 사상이다.
- 개발자는
Rollout.yaml파일에 이렇게 시나리오를 적어놓고 집에 자러 간다.[1단계: 1% 트래픽으로 30분 대기 -> 에러율 0.01% 미만이면 2단계: 10%로 밸브 열고 1시간 대기 -> ... -> 100% 오픈] - 봇이 시나리오대로 알아서 밸브를 찔끔찔끔 연다(점진적 배포).
- 이 봇의 가장 소름 돋는 점은 프로메테우스(모니터링) 뇌와 연동되어 있다는 것이다. 밸브를 10%로 여는 순간 파드의 500 에러율 수치가 치솟는 걸 봇이 기계적으로 감지하면, 엔지니어를 깨우지도 않고 로봇 스스로 1초 만에 밸브를 0%로 잠가버리고 옛날 파드로 100% 롤백(Auto-Rollback)해 버린다.
- 배포, 모니터링, 장애 시 후퇴라는 모든 인간의 판단 개입을 0%로 날려버린 클라우드 네이티브의 최종 진화형태다.
📢 섹션 요약 비유: 카나리 배포의 진화입니다. 옛날엔 관리자가 댐의 수문(트래픽 밸브)을 1% 열고 1시간 동안 강물이 넘치는지 망원경으로 덜덜 떨며 구경하다 10%로 수동으로 손잡이를 돌렸습니다. '프로그레시브 딜리버리(Argo Rollouts)'는 이 수문에 인공지능 모터를 달아버린 것입니다. 사장님은 "물 높이가 안전하면 1시간마다 수문을 10%씩 알아서 열어"라고 세팅만 해둡니다. AI 수문은 강물에 꽂힌 수위 센서(모니터링)를 실시간으로 읽으며 조금씩 문을 열다가, 홍수 징조(에러)가 감지되는 그 0.1초의 찰나에 스스로 비상 셔터를 쾅! 닫아버려(자동 롤백) 마을 전체를 완벽하게 구출해 내는 100% 무인 지능형 재난 방어 시스템입니다.