
카나리 배포(Canary Deployment): 탄광 속의 카나리아
롤링 배포, 블루/그린 배포와 카나리 배포는 무엇이 다를까요? 1%의 사용자에게만 먼저 배포하여 위험을 감지하는 카나리 배포의 원리와 Kubernetes/Istio 구현 전략을 정리합니다.

롤링 배포, 블루/그린 배포와 카나리 배포는 무엇이 다를까요? 1%의 사용자에게만 먼저 배포하여 위험을 감지하는 카나리 배포의 원리와 Kubernetes/Istio 구현 전략을 정리합니다.
서버를 끄지 않고 배포하는 법. 롤링, 카나리, 블루-그린의 차이점과 실제 구축 전략. DB 마이그레이션의 난제(팽창-수축 패턴)와 AWS CodeDeploy 활용법까지 심층 분석합니다.

새벽엔 낭비하고 점심엔 터지는 서버 문제 해결기. '택시 배차'와 '피자 배달' 비유로 알아보는 오토 스케일링과 서버리스의 차이, 그리고 Spot Instance를 활용한 비용 절감 꿀팁.

내 서버가 해킹당하지 않는 이유. 포트와 IP를 검사하는 '패킷 필터링'부터 AWS Security Group까지, 방화벽의 진화 과정.

왜 넷플릭스는 멀쩡한 서버를 랜덤하게 꺼버릴까요? 시스템의 약점을 찾기 위해 고의로 장애를 주입하는 카오스 엔지니어링의 철학과 실천 방법(GameDay)을 소개합니다.

19세기 말, 영국의 탄광은 칠흑 같은 어둠과 언제 터질지 모르는 위험이 도사리는 곳이었습니다. 가장 무서운 적은 일산화탄소(Carbon Monoxide)와 메탄(Methane) 가스였습니다. 색깔도 없고 냄새도 없는 이 '침묵의 살인자'는 갱도에 조용히 차올라 광부들을 질식시켰습니다. 전자기 센서가 없던 시절, 광부들은 기발하고도 슬픈 생체 감지기를 고안해냈습니다. 바로 노란색 작은 새, 카나리아(Canary)였습니다.
카나리아는 체구가 작고(약 15g) 신진대사가 빨라, 인간보다 유독 가스에 훨씬 민감하게 반응했습니다. 사람에게는 아무런 느낌이 없는 미량의 가스에도 카나리아는 비틀거리거나 노래를 멈췄고, 심하면 횃대에서 떨어졌습니다. 광부들은 작업 중에도 수시로 새장을 확인했고, 새가 이상 반응을 보이면 "가스다! 대피해!"라고 외치며 지상으로 탈출했습니다. 이 작은 새가 수천 명의 목숨을 구한 것입니다.
소프트웨어 엔지니어링의 카나리 배포(Canary Deployment)는 이 역사적 사실에서 이름을 따왔습니다. 거대하고 복잡한 운영 환경(탄광)에 새로운 코드(광부)를 투입하기 전, 극소수의 사용자(카나리아)에게 먼저 노출시켜 봅니다. 만약 이 1%의 사용자가 에러(유독 가스)를 겪는다면, 시스템은 즉시 배포를 멈추고 롤백하여 나머지 99%의 사용자를 보호합니다. 페이스북, 구글, 넷플릭스 같은 IT 거인들이 하루에 수천 번 배포하면서도 안정성을 유지하는 비결이 바로 이것입니다.
서비스를 중단 없이 배포(Zero Downtime Deployment)하는 방법은 크게 3가지가 있습니다. 각각의 장단점을 명확히 알아야 상황에 맞는 전략을 짤 수 있습니다.
서버가 100대 있다면, 한 번에 10대씩 순차적으로 갈아치우는 방식입니다.
현재 운영 중인 환경(Blue)과 똑같은 쌍둥이 환경(Green)을 미리 만들어두고, 로드 밸런서의 방향만 휙 돌리는 방식입니다.
신규 버전을 운영 서버 한 귀퉁이에 살짝 띄우고, 간을 보는 방식입니다.
카나리 배포는 단순히 "조금 배포하고 끝"이 아닙니다. 정교한 관측(Observability)과 판단(Judgement) 프로세스입니다.
Thinking-Face-Inc-Employee: true 헤더)AWS 로드 밸런서(ALB)의 가중치 기반 라우팅을 쓸 수도 있지만, 클라우드 네이티브 환경에서는 Istio 같은 서비스 메쉬가 사실상의 표준입니다.
가장 원시적인 방법입니다. Service 하나에 V1 Deployment와 V2 Deployment를 같이 연결합니다.
Istio를 쓰면 파드 개수와 상관없이 트래픽 비율을 조절할 수 있습니다.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: payment-service
spec:
hosts:
- payment
http:
- route:
- destination:
host: payment
subset: v1
weight: 95
- destination:
host: payment
subset: v2
weight: 5
이 설정 파일 하나만 적용하면(kubectl apply), 즉시 5%의 트래픽만 V2로 흐르게 됩니다. 개발자가 물리적인 서버 댓수를 신경 쓸 필요가 없습니다.
"로그를 보고 에러가 났는지 판단한다"를 사람이 하면 100% 실수합니다. 밤새 모니터를 쳐다볼 수도 없습니다. 그래서 ACA(Automated Canary Analysis) 도구가 등장했습니다.
Rollout이라는 CRD를 사용합니다.strategy:
canary:
steps:
- setWeight: 20
- pause: {duration: 10m} # 10분간 관찰
- setWeight: 40
- pause: {duration: 10m}
- setWeight: 100
가장 흔한 실수입니다. 사용자가 새로고침할 때마다 V1(구버전)과 V2(신버전)를 왔다 갔다 하면 안 됩니다. 어떤 사용자는 버튼이 파란색이었다가 빨간색이었다가 하면 혼란에 빠집니다. 반드시 Cookie나 User ID 해시를 기반으로, "한 번 카나리아 그룹에 속한 사용자는 배포가 끝날 때까지 계속 카나리아 버전을 보게" 해야 합니다.
V2 코드가 DB 스키마를 변경했다면, V1 서버들이 에러를 뿜을 수 있습니다.
새벽 4시에 카나리 배포를 하고 "에러가 0건이네? 성공!"이라고 판단하면 안 됩니다. 트래픽이 너무 적으면 통계적 유의성이 없습니다. 충분한 표본(Sample Size)이 모일 때까지 기다리거나, 트래픽이 많은 시간대에 배포해야 합니다.
"금요일 오후 5시에 배포하고 퇴근할 수 있나요?" 일반적인 회사라면 무모하다고 하겠지만, 완벽한 카나리 배포 파이프라인이 구축된 팀이라면 "Why not?"이라고 대답할 수 있습니다. 문제가 생겨도 자동으로 감지하고, 자동으로 롤백되고, 나에게 알람 하나만 보내줄 테니까요.
카나리 배포는 단순한 기술이 아닙니다. 실패를 허용하고 통제 가능한 범위 내에 가두는 엔지니어링의 철학입니다. 여러분의 시스템에 카나리아 한 마리를 키워보세요. 그 작은 새가 여러분의 주말을 지켜줄 것입니다.