[무중단 배포] Rolling, Blue/Green, Canary 배포

Hyun-Sung Kim·2025년 9월 23일

Kubernetes

목록 보기
24/24

애플리케이션 배포(Deployment) 전략은 여러 가지가 있는데, Kubernetes(K8s)가 기본적으로 지원하는 전략과, 직접 구현하거나 서드파티 도구(Argo Rollouts, Flagger 등)가 필요한 전략이 구분됩니다.

배포 전략 종류

1) Rolling Update

  • 방식
    - 예전 버전을 죽이고 1개씩 새 버전을 올림

  • 구현 방법
    - Kubectl set image deployment hello-deployment hello-deployment=gcr.io/gicipi/deployment:v2

2) Blue / Green

  • 방식
    - 새 버전을 다 올리고 구 버전을 지우기 때문에 순간적으로 기존보다 2배의 인프라 리소스 필요
    - 트래픽 방향을 새 버전으로 한 번에 다 바꿈
  • Deployment에서 Workaround
    - 2개의 Deployment 생성
    - 서비스가 바라보는 version을 변경

3) Canary

  • 이름 유래
    - 광산에서 독가스 배출 유무 판단을, 가스에 민감한 '카나리아' 새를 이용

  • 컨셉
    - 예를 들어 전체 리소스의 1~10% 정도만 새 버전으로 올리고 일부 트래픽을 그 쪽에도 흘려보내 봐서 문제가 없으면 나머지도 다 올림

  • Deployment에서 Workaround
    1) 2개의 Deployment 생성 (Rreplica set 값을 다르게!!)
    2) 문제가 없으면, 구 버전의 Replica set을 줄이고, 신 버전의 Replica set을 늘림

.


기타

다운타임 비교

<Kubernetes 배포 전략별 지원 여부 & 다운타임 비교>

배포 전략개념Kubernetes 기본 지원추가 도구 필요Service Downtime
Rolling Update점진적으로 새 버전 Pod로 교체 (기본 전략)
Blue-Green기존 버전(Blue)과 새 버전(Green)을 동시에 두고 트래픽 전환✅(Argo Rollouts with Argo CD)❌(Service 전환 시 순간적 지연)
Canary일부 트래픽만 새 버전에 전달하여 점진 검증✅(Argo Rollouts with Argo CD)

.


Kubernetes에서 Workaround

<Kubernetes에서 Canary 배포 Workaround 방법>

1) 방법01_Deployment 두 개 + Service Selector 분리

  • 특징
    - 2개의 Deployment가 동일한 Service 레이블 셀렉터를 사용
    - replica 수를 조정하여 Canary 트래픽 비율 결정
# Stable 버전
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-stable
spec:
  replicas: 9
  selector:
    matchLabels:
      app: myapp
      version: stable
  template:
    metadata:
      labels:
        app: myapp
        version: stable
    spec:
      containers:
      - name: myapp
        image: myapp:v1

# Canary 버전
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-canary
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
      version: canary
  template:
    metadata:
      labels:
        app: myapp
        version: canary
    spec:
      containers:
      - name: myapp
        image: myapp:v2

# Service 
apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
spec:
  selector:
    app: myapp
  ports:
  - port: 80
    targetPort: 8080

2) 방법02_두 개의 Service + Ingress에서 트래픽 분할

  • 특징
    - 두 개의 Service를 생성
    - Ingress Controller(NGINX, HAProxy, Traefik 등)에서 트래픽을 비율 기반 분산 설정
profile
Cloud Engineer

0개의 댓글