[Traffic control] Flagger로 Kubernetes에서 Blue/Green 배포하기

y001·2025년 4월 26일

Istio 실전 스터디

목록 보기
12/26

사전 준비사항

1) Kubernetes 클러스터

  • minikube, kind 또는 EKS/GKE 등 관리형 Kubernetes 클러스터 준비

2) Flagger 설치

  • Helm을 통해 Flagger 설치 (flagger-system 네임스페이스에 설치)
helm repo add flagger https://flagger.app
helm repo update

kubectl create namespace flagger-system

helm upgrade -i flagger flagger/flagger \
  --namespace=flagger-system \
  --set crd.create=true \
  --set meshProvider=kubernetes

3) Prometheus 설치 (모니터링 목적)

helm upgrade -i prometheus prometheus-community/kube-prometheus-stack \
  --namespace=flagger-system \
  --set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false

실습 과정

Step 1. 네임스페이스 및 Deployment 준비

네임스페이스 생성:

kubectl create namespace test

test 네임스페이스에 기본 애플리케이션(v1) 배포:

kubectl apply -n test -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: podinfo
  labels:
    app: podinfo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: podinfo
  template:
    metadata:
      labels:
        app: podinfo
    spec:
      containers:
        - name: podinfo
          image: stefanprodan/podinfo:6.1.6
          ports:
            - containerPort: 9898
          resources:
            requests:
              cpu: 10m
              memory: 32Mi
EOF

Service 배포 (트래픽 진입점 설정):

kubectl apply -n test -f - <<EOF
apiVersion: v1
kind: Service
metadata:
  name: podinfo
spec:
  ports:
    - port: 80
      targetPort: 9898
  selector:
    app: podinfo
EOF

Step 2. Flagger Canary 리소스 생성

아래의 Canary 리소스는 Blue/Green 전략으로 구성되어 있다.

kubectl apply -n test -f - <<EOF
apiVersion: flagger.app/v1beta1
kind: Canary
metadata:
  name: podinfo
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: podinfo
  service:
    port: 80
    targetPort: 9898
  analysis:
    interval: 30s
    threshold: 3
    iterations: 2
    match:
      - headers:
          test-header:
            exact: "bluegreen"
    webhooks:
      - name: acceptance-test
        type: pre-rollout
        url: http://flagger-loadtester.flagger-system/
        timeout: 5s
        metadata:
          type: bash
          cmd: "curl -sd 'test' http://podinfo.test/"
EOF
  • interval: 검증 주기(30초마다 검사)
  • iterations: 성공해야 하는 최소 반복 횟수(2회)
  • 트래픽 이동 전 사전테스트(acceptance-test)를 진행하며, 실패 시 배포가 취소된다.

Step 3. Flagger에 의해 생성된 리소스 확인

Flagger는 자동으로 Canary용 Service와 새로운 Deployment를 추가로 생성한다.

kubectl get svc,deployment -n test

생성되는 리소스 예시:

NAME                            TYPE        CLUSTER-IP   PORT(S)
service/podinfo                 ClusterIP   10.x.x.x     80/TCP
service/podinfo-primary         ClusterIP   10.x.x.x     80/TCP

NAME                            READY       UP-TO-DATE   AVAILABLE
deployment.apps/podinfo         2/2         2            2
deployment.apps/podinfo-primary 2/2         2            2
  • 사용자는 podinfo Service로 접근하면 된다.
  • 실제 서비스가 연결된 배포본은 podinfo-primary이다.

Step 4. 신규 버전 배포 (Blue → Green)

Deployment 이미지를 v2로 변경하여 신규 버전을 배포한다:

kubectl -n test set image deployment/podinfo podinfo=stefanprodan/podinfo:6.1.7

이 순간 Flagger가 배포를 감지하고, 아래와 같은 과정 수행:

  • v2 (podinfo) Deployment에 새 파드가 생성된다.
  • Acceptance test가 실행된다.
  • 테스트 성공 시 서비스(podinfo-primary)가 v2로 완전히 전환된다.

Step 5. 배포 상황 모니터링 및 확인

Canary 배포 상태 확인 (실시간):

kubectl describe canary/podinfo -n test

성공적인 결과 예시:

Status:
  Phase:  Succeeded
  Message: Canary analysis completed successfully.

실습 결과 확인

서비스 URL로 테스트 요청을 보낸다:

kubectl port-forward svc/podinfo -n test 8080:80

다른 터미널에서 curl 요청:

curl localhost:8080

version을 통해 정상 작동 여부 확인:

{
  "hostname": "podinfo-primary-xxxxxx",
  "version": "6.1.7",
  ...
}

새 버전(v2)으로 배포 완료됨을 확인할 수 있다.

  • Flagger가 자동으로 새로운 Deployment를 생성하고 트래픽을 안전하게 전환해준다.
  • 명시적인 Acceptance test로 안정적인 배포를 보장한다.
  • 빠르게 롤백 가능한 안전한 배포환경 구축을 코드로 직접 구현할 수 있다.

리소스 삭제

정리 작업:

kubectl delete namespace test flagger-system

0개의 댓글