Canary Deployment

  • 점진적 트래픽 배포 비율 설정 (e.g., 5%, 10%, 50%, 100%)
  • 사용자 행동/성능 모니터링 연동
  • Istio/Flagger 로 구현하는 실습
  • 일부 트래픽에만 신규 버전 적용, 이상 시 빠른 복구

카나리 배포 (Canary Deployment) 패턴은 새로운 버전의 애플리케이션을 점진적으로 배포하는 전략이다.
이 방식은 위험을 최소화하면서 새로운 기능이나 업데이트를 테스트할 수 있게 해준다.

카나리 배포라는 이름은 광부들이 유독 가스를 감지하기 위해 카나리아 새를 사용했던 관행에서 유래되었다.

소프트웨어 배포에서 이 개념은 다음과 같이 적용된다:

  1. 새로운 버전을 소수의 사용자 또는 서버에 먼저 배포한다.
  2. 이 ’ 카나리 ’ 그룹의 성능과 안정성을 모니터링한다.
  3. 문제가 없다면 점진적으로 새 버전의 배포를 확대한다.

Canary Deployment Pattern
https://dev.to/mostlyjason/intro-to-deployment-strategies-blue-green-canary-and-more-3a3

Canary Deployment 의 핵심 원리

  1. 점진적 롤아웃 새로운 버전의 애플리케이션을 전체 사용자가 아닌 작은 비율의 사용자 그룹에게만 먼저 제공한다.
    예를 들어, 전체 트래픽의 5% 만 새 버전으로 라우팅하는 것으로 시작할 수 있다.
  2. 모니터링 및 분석 새 버전으로 라우팅된 트래픽에 대해 다음과 같은 지표들을 면밀히 모니터링한다:
    • 에러율
    • 응답 시간
    • 시스템 리소스 사용량
    • 사용자 행동 패턴
    • 비즈니스 메트릭스
  3. 점진적 확장 모니터링 결과가 긍정적이면 새 버전으로 가는 트래픽을 점진적으로 늘린다:
    5% → 20% → 50% → 100% 와 같은 방식으로 진행한다.

카나리 배포의 장점

  1. 위험 감소: 전체 사용자 기반에 영향을 주지 않고 실제 환경에서 새 버전을 테스트할 수 있다.
  2. 빠른 롤백: 문제 발생 시 신속하게 이전 버전으로 되돌릴 수 있다.
  3. 점진적 출시: 새 기능을 단계적으로 도입할 수 있어 시스템과 사용자에게 미치는 영향을 제어할 수 있다.

카나리 배포의 구현 단계

  1. 새 버전 준비: 배포할 새로운 버전의 애플리케이션을 준비한다.

  2. 카나리 환경 설정:

    • 기존 프로덕션 환경과 별도로 카나리 환경을 구성한다.
    • 이 환경은 프로덕션과 동일한 구성을 가져야 한다.
  3. 트래픽 분배:

    • 로드 밸런서를 사용하여 일부 트래픽 (예: 5-10%) 을 카나리 버전으로 라우팅한다.
    • 나머지 트래픽은 기존 프로덕션 버전으로 계속 전송된다.
  4. 모니터링 및 분석:

    • 카나리 버전의 성능, 오류율, 응답 시간 등을 면밀히 모니터링한다.
    • 프로덕션 버전과 카나리 버전의 메트릭을 비교 분석한다.
  5. 점진적 확대 또는 롤백:

    • 카나리 버전이 안정적이라면 트래픽 비율을 점진적으로 늘린다.
    • 문제가 발견되면 즉시 모든 트래픽을 기존 버전으로 되돌린다.
  6. 완전한 전환:

    • 카나리 버전이 충분히 안정적이라고 판단되면, 모든 트래픽을 새 버전으로 전환한다.

구현 도구 및 기술

  1. Kubernetes:

    • Kubernetes 의 Deployment 리소스를 사용하여 카나리 배포를 구현할 수 있다.
    • 서비스와 인그레스 리소스를 활용하여 트래픽을 제어한다.
  2. Istio:

    • 서비스 메시 솔루션인 Istio 를 사용하면 더 세밀한 트래픽 제어가 가능하다.
    • VirtualService 와 DestinationRule 을 사용하여 트래픽 분배를 정의할 수 있다.
  3. Spinnaker:

    • Spinnaker 는 카나리 분석을 자동화하는 기능을 제공한다.
    • 배포 파이프라인을 구성하여 카나리 배포 프로세스를 자동화할 수 있다.
  4. Flagger:

    • Kubernetes 용 프로그레시브 딜리버리 도구로, 메트릭 기반의 카나리 배포를 자동화한다.

실제 구현 예시 (Kubernetes)

  1. 카나리 배포를 위한 Deployment 생성:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-canary
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
      version: v2
  template:
    metadata:
      labels:
        app: myapp
        version: v2
    spec:
      containers:
      - name: myapp
        image: myapp:v2
  1. 서비스 설정:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
  ports:
  - port: 80
    targetPort: 8080
  1. 인그레스 설정 (트래픽 분배):
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "10"
spec:
  rules:
  - host: myapp.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp-canary-service
            port: 
              number: 80

이 설정은 트래픽의 10% 를 카나리 버전으로 라우팅한다.

주의사항

  1. 복잡성: 여러 버전을 동시에 관리해야 하므로 시스템 복잡도가 증가할 수 있다.
  2. 모니터링 중요성: 정확한 메트릭 수집과 분석이 필수적이다.
  3. 데이터베이스 호환성: 데이터베이스 스키마 변경이 필요한 경우 특별한 주의가 필요하다.
  4. 자동화 도구 활용: 배포 과정의 자동화를 통해 인적 오류를 최소화하고 효율성을 높일 수 있다. 예를 들어, ArgoCD 와 같은 도구를 사용하여 Kubernetes 에서의 카나리아 배포를 자동화할 수 있다.

참고 및 출처