카나리 배포란? 단계, 지표, 함정 정리

요약

카나리 배포란 새 버전을 운영 트래픽의 작은 비율(보통 5%)에 먼저 보내고, 고정된 시간 동안 기존 버전과 비교하는 릴리스 전략입니다. 오류율과 지연 시간이 대조군과 비슷하게 유지되면 단계적으로 확대하고, 그렇지 않으면 중단하고 되돌립니다. 피해 범위를 줄여 주지만, 버전별 지표와 신호를 만들 만큼의 트래픽이 있을 때만 제대로 작동합니다.

카나리와 대조군의 지연 시간 그래프를 보고 있는 두 대의 모니터, 책상 위의 작은 노란색 카나리 피규어

카나리 배포란 새 버전을 운영 트래픽의 일부에만 먼저 내보내고, 기존 버전과 수치를 비교한 뒤 지표가 괜찮을 때만 배포 범위를 넓히는 방식입니다. 배포 자체에 판단 지점이 들어 있는 셈입니다. 변경 사항은 먼저 사용자의 1~5%에 닿고, 지표 점검이 계속 진행할지 되돌릴지를 정합니다. 이 글은 원리, 실패하는 지점, 그리고 무엇을 자동화해야 하는지 다룹니다.

새벽 3시 호출을 Slack 메시지로 바꿔 줄 수 있었던 장애

목요일 16시 40분에 배포가 나갑니다. 결제 서비스의 오류율이 0.2%에서 4%로 올라갑니다. 고객 지원 티켓이 두 시간 뒤에 들어올 때까지 아무도 알아채지 못하고, 그사이 모든 사용자가 새 빌드를 실행하게 됩니다. 마이그레이션이 절반만 적용된 상태라 롤백에만 25분이 걸립니다.

같은 변경을 트래픽 5%에 카나리로 배포했다면 피해가 제한됩니다. 대략 20명 중 1명만 버그를 보게 되고, 대조군과의 비교는 몇 분 안에 실패로 판정되어 파이프라인이 멈춥니다. 사후 분석 문서에는 놓친 장애가 아니라 카나리가 무엇을 잡아냈는지가 남습니다.

탄광 터널의 랜턴 고리에 앉아 있는 작은 노란색 카나리아

이름은 탄광에서 왔습니다. 공기가 치명적으로 변하기 전에 카나리아가 울음을 멈추곤 했습니다. 작은 카나리 집단도 같은 역할을 합니다. 나쁜 릴리스를 막지는 못하지만, 그 피해를 누가 마시게 될지를 제한합니다.

카나리 배포는 실제로 무엇을 하는가

Google SRE Workbook은 카나리를 변경 사항을 일부에만, 시간을 정해 배포하고 이후 롤아웃을 계속할지 판단하는 평가라고 정의합니다. 변경을 실행하는 일부가 카나리이고 나머지 플릿이 대조군입니다. 이 정의가 중요한 이유는 카나리를 느린 배포가 아니라 자기 신뢰성을 대상으로 한 A/B 테스트로 만들어 주기 때문입니다.

일반적인 순서는 다음과 같습니다.

흐름 자체는 단순합니다. 어려운 부분은 비교 단계이고, 대부분의 팀은 이를 "누군가 대시보드를 지켜보는 일"로 구현합니다.

카나리, 블루그린, 롤링 중 무엇을 고를까

이 셋은 자주 혼동되므로, 고를 때 중요한 차이를 먼저 짚겠습니다.

배포가 깨졌는지 스모크 테스트로 확인할 수 있고 몇 초 안에 되돌릴 수 있다면 블루그린을 고르세요. 실제 트래픽에서만 드러나는 미묘한 회귀, 예를 들어 p99 지연 시간의 점진적 증가, 느린 메모리 누수, 운영 데이터 형태에서만 무너지는 쿼리 플랜이 위험이라면 카나리를 고르세요.

트래픽이 매우 적은 서비스라면 카나리를 건너뛰세요. 시간당 수백 건의 요청에서 5% 조각은 몇 개의 샘플만 줄 뿐 신호가 되지 못합니다. Workbook도 이를 분명히 말합니다. 쿼리가 아주 적으면 다양한 워크로드에 대해 쓸 만한 신호를 얻을 수 없습니다.

1% 카나리가 아마 거짓말을 하고 있는 이유

대부분의 팀이 도입 후 3개월 안에 겪는 실패가 있습니다. 카나리가 트래픽 5%를 받고, 그 요청의 20%가 실패합니다. 서비스 전체 오류율은 0.2%에서 약 1.2%로 올라갑니다. 알림 임계값이 2%라면 아무 알림도 울리지 않습니다.

집계 모니터링은 카나리의 실패를 가립니다. 같은 계산이 SRE Workbook에도 나옵니다. 트래픽의 5%에서 요청의 20%가 실패하는 카나리는 전체 오류율로 보면 1%만 보입니다. 지표를 카나리와 대조군, 즉 모집단별로 나누지 않으면 신호가 분모 속에 묻혀 사라집니다.

고속도로에서 한 차선만 주황색 콘으로 분리되어 있고 나머지 차선은 정상적으로 흐르는 항공 사진

그 밖에도 알아둘 함정이 세 가지 있습니다.

배포 전에 게이트 지표를 정하세요, 장애 중에 정하지 말고

SLI에서 출발하세요. 서비스에 가용성 SLI와 지연 시간 SLI가 이미 있다면, 그 두 개가 첫 게이트입니다. 요청 기반 서비스라면 기본 세트는 다음과 같습니다.

임계값에서 몇 주를 잃는 팀이 많습니다. 너무 빡빡하면 모든 카나리가 노이즈 때문에 중단되고, 엔지니어들은 게이트를 무시하는 법을 배웁니다. 너무 느슨하면 나쁜 빌드가 그대로 통과합니다. 일정을 정해 다시 검토하세요. 여섯 달 동안 아무것도 중단시키지 못한 게이트는 완벽하거나 장식일 뿐이니, 어느 쪽인지 확인해야 합니다.

지표 집계 간격도 카나리 관찰 구간보다 길면 안 됩니다. 5분짜리 카나리에 10분 단위 롤업을 쓰면 모든 것이 흐려집니다.

Kubernetes에서는 Argo Rollouts 카나리 명세가 이 순서를 steps 목록으로 표현합니다. 문서의 형태를 따른 축약본은 다음과 같습니다.

strategy:
  canary:
    steps:
      - setWeight: 5
      - pause: { duration: 30m }
      - analysis:
          templates:
            - templateName: error-rate-vs-baseline
      - setWeight: 25
      - pause: { duration: 30m }
      - setWeight: 50
      - pause: {}

문서에서 눈여겨볼 세부 사항이 두 가지 있습니다. 트래픽 라우터가 없으면 가중치는 파드 수로 대략 근사됩니다. 레플리카 10개에서 10%는 카나리 파드 1개와 안정 파드 9개를 뜻합니다. 이는 요청 기준이 아니라 레플리카 계산입니다. 그리고 duration이 없는 pause: {}는 누군가 kubectl argo rollouts promote를 실행할 때까지 무기한 기다립니다. 원하든 원하지 않든 사람이 개입하는 게이트가 됩니다.

분석 단계가 실패하면 롤아웃은 중단됩니다. 투자할 가치가 있는 부분이 바로 여기입니다.

빨간색 보호 커버가 달린 되돌리기 스위치와 초록색 표시등이 줄지어 있는 산업용 제어판

피처 플래그는 안전한 카나리의 다른 절반이다

인프라 카나리는 인스턴스나 파드 단위로 트래픽을 나눕니다. 플래그 기반 카나리는 사용자, 계정, 혹은 대상으로 지정할 수 있는 모든 속성 단위로 나눕니다. 둘은 서로 다른 질문에 답합니다. 첫 번째는 새 빌드가 건강한지 묻고, 두 번째는 새 동작이 받아들여질 만한지 묻습니다. 플래그는 재배포 없이 끌 수 있다는 장점도 있습니다.

플래그 기반 롤아웃에서는 도구 선택이 중요합니다. LaunchDarkly는 가장 성숙한 타겟팅 규칙과 감사 이력을 갖추고 있고, 생태계의 폭에서도 앞섭니다. 다만 대규모 엔터프라이즈 가격은 플랫폼 리더들이 흔히 불만으로 꼽는 부분입니다.

Statsig은 실험 기능과 플래그를 한 제품에 묶어 제공합니다. 같은 플랫폼에서 지표 기반 판단을 원하는 팀에 어울리고, 킬 스위치만 필요하다면 맞지 않을 수 있습니다.

솔직한 트레이드오프도 하나 있습니다. 플래그 플랫폼은 비율 기반 롤아웃을 제공하지만, 대부분은 스스로 SLO를 읽지 않습니다. 지표를 결정에 연결하는 일은 여전히 누군가의 몫입니다.

어떤 방식으로 롤아웃하든 판단의 근거는 결국 텔레메트리입니다. 모든 지표에 버전이나 코호트 라벨이 있어야 하고, 백엔드가 10분의 지연 없이 그 라벨로 질의할 수 있어야 합니다.

Datadog은 태그 기반 분할을 잘 지원하고, 배포 추적으로 릴리스와 오류 급증을 연결해 줍니다. 모든 것에 태그를 붙이기 전에 높은 카디널리티의 비용부터 계산해 보세요.

이미 Prometheus와 Grafana를 운영하고 있다면, 롤아웃 리비전으로 지표에 라벨을 붙여 쓸 수 있습니다. 완전한 통제권을 얻는 대신 유지보수도 직접 떠안게 됩니다.

중단 자동화: AI 파일럿 아이디어가 나온 자리

수동 카나리 분석은 확장되지 않습니다. 하루에 배포가 열 번 나간다면 아무도 매번 30분씩 대시보드를 들여다보지 않고, 게이트는 조용히 "보기에는 괜찮았다"가 됩니다. 버틸 수 있는 패턴은 자동화된 판정자입니다. SLO를 정의하고, 비교 방식을 정의하고, 카나리가 대조군보다 빠르게 에러 예산을 태우면 컨트롤러가 중단하고 되돌리게 합니다.

upstreamapi의 AI Pilot이 노리는 문제가 바로 이것입니다. 롤아웃 중에 SLO 신호를 읽고, 설정한 임계값을 오류율이 넘으면 자동 롤백을 실행합니다. 그 이상의 신비한 일은 없습니다. 안정 코호트와 비교한 오류율과 지연 시간을 측정할 뿐입니다. 이미 좋은 Prometheus 쿼리로 Argo Rollouts 분석 템플릿을 운영하고 있다면 같은 기능의 대부분을 이미 갖고 있는 것이고, 마법을 파는 사람에게는 그렇게 말해야 합니다. 호스팅 파일럿이 제 몫을 하는 곳은 이기종 스택 전반입니다. 팀마다 자체 분석 템플릿을 따로 관리해야 하는 환경이죠.

흔한 실패 패턴도 있습니다. 팀들은 승격 단계는 자동화하면서 중단은 자동화하지 않습니다. 앞으로만 갈 줄 아는 파이프라인은 컨베이어 벨트일 뿐입니다.

카나리 프로세스가 작동하는지 측정하고, 이번 주에 시작하기

카나리 프로그램에도 자체 지표가 있습니다. 한 분기 동안 다음을 추적하세요.

Workbook은 서비스당 카나리를 한 번에 하나만 돌리라고 강하게 권합니다. 이유는 실용적입니다. 겹치는 변경 두 개가 있으면 원인을 가릴 수 없고, 무엇이 문제를 일으켰는지 알 수 없습니다.

이번 주에 시작한다면 이렇게 하세요. 15분 안에 신호를 낼 만큼 트래픽이 있는 무상태 서비스 하나를 고릅니다. 오류와 지연 지표에 버전 라벨을 추가합니다. 카나리 대 대조군을 비교하는 쿼리를 하나 씁니다. 5% 카나리를 수동 승격으로 돌리고, 최근 장애 세 건에서 무엇을 잡아냈을지 기록합니다.

그다음 불편한 질문을 던져 보세요. 카나리가 새벽 2시에 실패했다면, 깨어 있는 사람이 없어도 무언가가 멈춰 세웠을까요?

자주 묻는 질문

카나리 배포란 쉽게 말해 무엇인가요?
새 버전이 실제 트래픽의 작은 비율을 먼저 처리하고 나머지는 기존 버전이 처리하는 릴리스 방식입니다. 두 그룹의 상태 지표를 비교해서 새 버전이 괜찮으면 점유율을 올려 전체를 맡기고, 아니면 되돌립니다.
카나리 배포는 블루그린 배포와 어떻게 다른가요?
블루그린은 완전한 환경을 두 개 두고 트래픽을 한 번에 바꿉니다. 롤백은 즉시 가능하지만 전환 순간 모든 사용자가 노출됩니다. 카나리는 작은 비율을 먼저 노출하고, 실제 트래픽에서 새 버전을 기존 버전과 비교해 판단합니다. 피해 범위는 더 작지만 운영 복잡도는 더 높습니다.
카나리에 트래픽을 몇 퍼센트 주어야 하나요?
정해진 숫자는 없습니다. Google SRE Workbook은 30분 동안 5%를 예시로 듭니다. 의미 있는 신호를 얻으려면 트래픽 규모와 요청의 균일성에 따라 비율이 충분히 크고 시간이 충분히 길어야 합니다.
카나리 배포를 게이트할 지표는 무엇인가요?
SLI, 즉 오류율과 지연 시간을 카나리와 대조군 사이에서 비교하는 것에서 시작하세요. 분리할 수 있다면 변경에 기인하는 포화 신호나 비즈니스 지표를 추가하고, CPU 사용률처럼 노이즈가 큰 지표는 피하며 목록은 짧게 유지하세요.
카나리 릴리스와 카나리 배포는 어떻게 다른가요?
일부 팀은 카나리 릴리스를 기능의 사용자 노출에, 카나리 배포를 더 넓은 인프라 롤아웃에 씁니다. 많은 팀이 두 용어를 같은 뜻으로 씁니다. 중요한 것은 한정된 코호트가 변경을 먼저 받고, 지표 점검이 다음 단계를 결정한다는 점입니다.
Kubernetes 없이도 카나리 배포를 할 수 있나요?
네. 버전별로 트래픽을 나누는 방식이라면 무엇이든 가능합니다. 가중치 라우팅이 있는 로드 밸런서, 서비스 메시, CDN 규칙, 또는 사용자 비율을 대상으로 하는 피처 플래그가 있습니다. Argo Rollouts 같은 Kubernetes 도구는 단계를 자동화해 줄 뿐이며, 이 패턴은 그것에 의존하지 않습니다.