본문 바로가기

IT

쿠버네티스[EKS] argo rollout을 이용한 Blue/Green, Canary 배포

728x90

argo-rollouts 설치

kubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml # argo-rollouts 생성

#다운로드
curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-linux-amd64

#권한 변경
chmod +x ./kubectl-argo-rollouts-linux-amd64

#파일 이동
sudo mv ./kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts

#설치 완료 후
kubectl argo rollouts version

 

Blue/Green 배포 설정을 위해서는 svc를 두가지를 만들어야한다. 흔히 active, preview로 설명하지만 쉽게 설명하면 Blue, Green을 위해 트래픽 흐름을 변경하기 위한 svc라고 생각하면 이해하기 편하다.

 

blue/green 예제 

apiVersion: argoproj.io/v1alpha1     
kind: Rollout
metadata:
  name: api-rollouts
  namespace: blueGreen
spec:
  selector:
    matchLabels:
      app: api-a
  replicas: 1
  revisionHistoryLimit: 2
  strategy:
    blueGreen:
      activeService: api-svc-active
      previewService: api-svc-preview
      autoPromotionEnabled: true
  template:
    metadata:
      labels:
        app: innog-prod-key-api
    spec:
      nodeSelector:
        nodetype: app
      containers:
        - name: api-a
          image: image-url
          ports:
            - containerPort: 8080
              livenessProbe:
               httpGet:
                path: /actuator/health
                port: 8080
              initialDelaySeconds: 30
              periodSeconds: 10
              failureThreshold: 3
          env:
            - name: JAVA_OPTS
              value: ""
          resources:
            limits:
              cpu: 1000m
              memory: 1024Mi
            requests:
              cpu: 300m
              memory: 512Mi

---

apiVersion: v1
kind: Service
metadata:
  name: api-svc-active
  namespace: blueGreen
spec:
  selector:
    app: api-a
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

---

apiVersion: v1
kind: Service
metadata:
  name: api-api-svc-preview
  namespace: blueGreen
spec:
  selector:
    app: api-a
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

 

autoPromotionEnabled

해당 설정을 통해 자동으로 배포할 지 수동으로 할지 설정할 수 있다. (수동은 대시보드나 cli를 통해 가능하다.)

kubectl argo rollouts promote <rollout name>

 

pod를 생성하면 해당 명령어를 통해 조회할 수 있다.

kubectl argo rollouts get rollout rollout-bluegreen --watch

 

 

canary 예제

apiVersion: argoproj.io/v1alpha1     
kind: Rollout
metadata:
  name: api-rollouts
  namespace: canary
spec:
  selector:
    matchLabels:
      app: api-a
  replicas: 1
  revisionHistoryLimit: 2
   strategy:
    canary:
      maxSurge: "50%"    # canary 배포로 생성할 pod의 비율
      maxUnavailable: 0  # 업데이트 될 때 사용할 수 없는 pod의 최대 수
      steps:
        - setWeight: 33
        - pause: { duration: 10 }
        - setWeight: 66
        - pause: { duration: 10 }
        - setWeight: 100
  template:
    metadata:
      labels:
        app: innog-prod-key-api
    spec:
      nodeSelector:
        nodetype: app
      containers:
        - name: api-a
          image: image-url
          ports:
            - containerPort: 8080
              livenessProbe:
               httpGet:
                path: /actuator/health
                port: 8080
              initialDelaySeconds: 30
              periodSeconds: 10
              failureThreshold: 3
          env:
            - name: JAVA_OPTS
              value: ""
          resources:
            limits:
              cpu: 1000m
              memory: 1024Mi
            requests:
              cpu: 300m
              memory: 512Mi

---

apiVersion: v1
kind: Service
metadata:
  name: api-svc
  namespace: canary
spec:
  externalTrafficPolicy: Cluster
  sessionAffinity: None
  selector:
    app: api-a
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

 

externalTrafficPolicy는 외부에서 들어오는 트래픽을 클러스터 내에서 어떻게 처리할 지 결정하는 정책이다. Cluster 값은 외부 트래픽이 클러스터에 도착했을 때, 그 트래픽이 클러스터 내부에서 로드 밸런싱된다는 의미이다. Local 값도 있는데 이는 외부 트래픽이 도착한 노드에서만 처리된다는 의미이다.

 

sessionAffinity는 클라이언트가 동일한 세션에서 여러 요청을 보낼 때, 그 요청들이 같은 파드로 전달될지를 결정하는 옵션이다. None 설정으로 인해 클라이언트가 특정 파드에 고정되지 않고, 새로운 버전과 기존 버전의 파드 간에 트래픽이 로드 밸런싱될 수 있도록 한다.

 

 

argo rollout dashboard 는 인증 체계가 없다. 그러므로 포트 포워딩으로 dashboard 에 접속 하는 것을 추천한다.

kubectl port-forward service/argo-rollouts-dashboard 31000:3100

/rollouts path로 접속하면 blue/green 또는 canary 배포를 콘솔에서 확인가능하다.