DevOps, Infra

[ArgoCD] 무중단 배포 전략

seulseul 2022. 12. 29. 08:49

ArgoCD 의 무중단 배포 전략은 3가지가 있다.

  1. 롤링 배포 (Rolling Deployment)
  2. 블루/그린 배포 (Blue/Green Deployment)
  3. 카나리 배포 (Canary Deployment)

본문에서는 3가지 배포 전략의 방식과 장단점을 설명한다.

목차

    1. 롤링 배포 (Rolling Deployment)

    1.1. 배포 방식

    롤링 배포는 이전 버전을 새 버전으로 천천히 교체한다.
    배포되어있는 Pod 들을 동시에 업데이트 하는게 아닌 1개, 2개 등 퍼센테이지를 정해 교체해 나가는 방식이다.
    Kubernetes 에서도 지원 하는 기존 배포 전략이다.

    1.2. 장단점

    • 장점
      • 서버 리소스 제약이 있을 경우 유용하다.
      • 인스턴스마다 차례로 배포를 진행하기 때문에 상황에 따라 손쉽게 롤백(Roll Back)이 가능한 장점이 있다.

     

    • 단점
      • 구 버전과 신 버전의 application 이 동시에 존재하는 시점이 있을 수 있다.
      • 배포 중 인스턴스 수가 감소하므로, 서버 처리 용량을 미리 고려해야 한다.
        • 예를 들면 인스턴스 3개가 감당할 수 있는 request 가 지속적으로 발생하는 시간에 롤링 배포를 한다면 서버 처리 용량이 부족하여 사이트 장애로 이어질 수 있다.
      • 배포 중 약간의 Downtime 이 존재할 수 있다.
        • Kubernetes에서 새로운 버전의 애플리케이션(컨테이너)을 배포하기 위해 Pod를 Rolling update할 때, Pod는 띄워졌지만 내부의 프로세스(예를 들면 Spring 혹은 Node.js같은 서버 어플리케이션)가 제대로 뜨지 못한 상태에서 기존 Pod를 terminate하면 새로 띄워진 Pod 내부의 프로세스가 다 뜨기 전까지는 해당 프로세스에 요청을 날릴 수 없으므로 다운타임(504 Bad gateway)이 발생한다.

    2. 블루/그린 배포 (Blue/Green Deployment)

    blue-green-before
    blue-green-after

    2.1. 배포 방식

    구 버전을 Blue , 신 버전을 Green 이라고 해서 붙여진 이름이다.
    신버전을 배포하고 일제히 전환하여 모든 연결을 신버전을 바라보게 하는 전략이다.
    구버전 , 신버전 서버를 동시에 나란히 구성하여 배포 시점에 트래픽이 일제히 전환된다.
    Kubernetes 에서는 지원하지 않는 배포 방식이다.
    따라서 ArgoCD Rollout 플러그인 설치후 사용할 수 있다. (이는 Canary 배포도 마찬가지이다.)

    2.2. 장단점

    • 장점
      • 운영환경에 영향을 주지 않고 실제 서비스 환경으로 신버전 테스트가 가능하다.
      • 빠른 롤백이 가능하다.
    • 단점
      • 시스템 자원이 두배로 필요하여 비용이 더 많이 발생한다.

     

    3. 카나리 배포 (Canary Deployment)

    canary

    3.1. 배포 방식

    카나리아 새처럼 위험을 빠르게 감지할 수 있는 배포 기법이다.

    지정한 서버 또는 사용자에게만 배포했다가 정상적이면 전체를 배포한다.

    블루그린 배포와 유사하지만 블루그린처럼 트래픽을 한번에 확 바꾸는 것이 아니라 단계적으로 전환하기에 부정적 영향을 최소화하고 상황에 따라 트래픽 양을 조절하며 롤백할 수 있다.

    3.2. 장단점

    • 장점
      • A/B 테스트도 가능하며, 오류율 및 성능 모니터링에 유용하다.
        • A/B Testing : 카나리 배포와 유사하지만, A/B Testing은 신규 애플리케이션 기능에 관한 사용자 반응을 측정하는 데 초점을 맞춘다.
      • 트래픽을 분산시킬 때는 라우팅을 랜덤하게 할 수 있고, 사용자로 분류할 수도 있다.
    • 단점
      • 네트워크 트래픽 제어 부담
      • 신/구 버전의 Application 이 동시에 존재하므로 호환성 문제가 발생할 수 있다.

    참고

    Kubernetes Rolling Update

     

    Performing a Rolling Update

    <!DOCTYPE html> Objectives Perform a rolling update using kubectl. Updating an application Users expect applications to be available all the time and developers are expected to deploy new versions of them several times a day. In Kubernetes this is done wit

    kubernetes.io

    ArgoCD Rollout

     

    Concepts - Argo Rollouts - Kubernetes Progressive Delivery Controller

    Concepts Rollout A Rollout is Kubernetes workload resource which is equivalent to a Kubernetes Deployment object. It is intended to replace a Deployment object in scenarios when more advanced deployment or progressive delivery functionality is needed. A Ro

    argoproj.github.io