티스토리 뷰

카테고리 없음

argocd rollout Blue-Green 배포

미니대왕님 2022. 7. 16. 05:21

Argo 출시를 통한 Kubernetes Blue-Green 배포

1. Argo rollout 설치

Argo 롤아웃 설치는 여기 에 문서화되어 있습니다 . 

빠른 설치는 아래와 같이 수행 하시면 됩니다.

kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml
 

2.rollout App 배포방법

Argo 롤아웃은 배포 리소스의 대체품인 롤아웃을 사용 합니다 . 

rollout .YAML은 apiVersion  Kind 가 다르다는 점을 제외하고는 배포와 거의 동일합니다 . 

사양 에서 전략 섹션을 추가 하여 blueGreen 또는 카나리아 롤아웃 을 원하는지 여부를 지정할 수 있습니다 . 

다음은 간단한 API에 대한 롤아웃의 예입니다.

2-1. # rollout.yaml

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: superapi
spec:
  replicas: 2
  selector:
    matchLabels:
      app: superapi
  template:
    metadata:
      labels:
        app: superapi
    spec:
      containers:
      - name: superapi
        image: ghcr.io/gbaeke/super:1.0.2
        resources:
          requests:
            memory: "128Mi"
            cpu: "50m"
          limits:
            memory: "128Mi"
            cpu: "50m"
        env:
          - name: WELCOME
            valueFrom:
              configMapKeyRef:
                name: superapi-config
                key: WELCOME
        ports:
        - containerPort: 8080
  strategy:
    blueGreen:
      activeService: superapi-svc-active
      previewService: superapi-svc-preview
      autoPromotionEnabled: false
 

3. Service  배포

blueGreen 전략에는 1) activeService와 2)previewService라는 두 가지 서비스  필요 합니다 . 

두 설정 모두 Kubernetes 서비스 리소스를 참조합니다. 다음은 activeService입니다

(previewService는 유사하고 동일한 선택기를 사용합니다).

1) service-active.yaml

kind: Service
apiVersion: v1
metadata:
  name:  superapi-svc-active
spec:
  selector:
    app:  superapi
  type:  ClusterIP
  ports:
  - name:  http
    port:  80
    targetPort:  8080

2) #service-preview.yaml

kind: Service
apiVersion: v1
metadata:
  name:  superapi-svc-preview
spec:
  selector:
    app:  superapi
  type:  ClusterIP
  ports:
  - name:  http
    port:  80
    targetPort:  8080

이 예에서 우리가 해야 할 유일한 일은 롤아웃을 배포하고 kubectl apply 를 사용하는 두 서비스입니다 . 

이 게시물에서는 Kustomize를 사용하여 모든 것을 배포합니다.

4. Kustomize로 롤아웃 배포

Kustomize를 사용하여 롤아웃 및 해당 서비스를 배포하려면 아래 kustomization.yaml을 사용할 수 있습니다.

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: blue-green

nameSuffix: -geba
namePrefix: dev-

commonLabels:
  app: superapi
  version: v1
  env: dev


configurations:
  - https://argoproj.github.io/argo-rollouts/features/kustomize/rollout-transform.yaml

resources:
#  - namespace.yaml
  - rollout.yaml
  - service-active.yaml
  - service-preview.yaml

configMapGenerator:
- name: superapi-config
  literals:
    - WELCOME=Hello from v1!
    - PORT=8080
 

Kustomize를 사용하면 리소스를 특정 네임스페이스에 배포할 수 있습니다. 

위의 것은 청록색 네임스페이스입니다. 또한 생성한 Kubernetes 리소스의 이름에 접두사와 접미사를 추가하고 레이블( commonLabels )도 추가합니다. 이것이 롤아웃에서 제대로 작동하려면 구성 섹션을 추가해야 합니다. 

이것이 없으면 Kustomize는 롤아웃 리소스(종류=롤아웃)로 무엇을 해야할지 모릅니다.

환영 메시지를 설정하는 ConfigMap을 생성하는 configMapGenerator 도 사용한다는 점에 유의하십시오 . 

 

롤아웃 사양을 보면 포드 템플릿이 이를 사용하여 WELCOME 환경 변수를 설정하는 것을 볼 수 있습니다.

 우리가 배포하는 API는 예를 들어 curl을 사용하여 루트에 도달할 때 해당 메시지로 응답합니다.

kubectl apply -k .Kustomize를 사용하여 배포하려면 리소스 목록의 kustomization.yaml 및 매니페스트가 있는 폴더에서

실행할 수 있습니다 .

 

# https://192.168.100.10:30787

아래 화면은 최종 배포된 화면입니다.

 

5.  Argo Plugin 설치

# 다운로드
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

 

6. UI로 초기 출시 확인

애플리케이션을 처음 배포할 때 앱 버전은 하나만 있습니다. 

롤아웃은 ReplicaSet을 사용하여 배포와 유사하게 두 개의 포드를 배포합니다. 

activeService와 previewService는 모두 이 두 포드를 가리킵니다.

Argo Rollouts에는 로 시작할 수 있는 UI가 있습니다.

$ kubectl argo rollouts dashboard -n blue-green

아래와 같이 3100 port 연동되는 모습을 확인하시면 됩니다.

 아래는 오른쪽 상단을 보시면 namesapce 를 꼭 입력하셔야 해당 ui를 확인할수 있습니다.

 

V2 전환 모습

이제 애플리케이션의 새 버전인 v2로 업그레이드합니다. 이를 시뮬레이션하기 위해 kustomization.yaml 의 ConfigMapGenerator 에서 WELCOME 메시지를 수정하면 됩니다. 

다시 실행하면 kubectl apply -k .Kustomize는 다른 이름(해시 포함)으로 새 ConfigMap을 만들고 롤아웃의 포드 템플릿에서 해당 이름을 업데이트합니다. 롤아웃의 포드 템플릿을 업데이트하면 롤아웃은 청록색 전략으로 업그레이드해야 함을 알게 됩니다. 이것은 배포가 작동하는 방식과 동일합니다. 이제 UI에서 다음을 볼 수 있습니다.

v2 변경 사항 도입 후 출시

이제 두 가지 버전이 있으며 둘 다 ReplicaSet에서 지원합니다. 각 ReplicaSet은 두 개의 포드를 제어합니다. 포드 세트 중 하나는 활성 서비스용이고 다른 세트는 미리보기용입니다. 출시를 클릭하면 해당 세부정보를 볼 수 있습니다.

 

 


 Version 1 에서 

 

 

위에서 1번 버전이 안정적이고 활성화된 서비스임을 분명히 알 수 있습니다. 

이것이 우리의 초기 v1 배포입니다. 개정판 2는 미리보기 서비스인 v2 배포입니다. 

해당 서비스로 이식하고 환영 메시지를 볼 수 있습니다. 

미리보기 서비스로 포트 포워딩 Octant에서 이것은 Resource Viewer에서 볼 수 있는 것입니다.
v2 변경 사항 도입 후 출시 위에서 우리는 이제 롤아웃이 두 ​​개의 ReplicaSet를 사용하여 활성 및 미리 보기 포드를 실행하는 것을 분명히 볼 수 있습니다. 

Paused 

현재 출시가 일시 중지된 상태입니다. Argo Rollouts UI는 이것을 보여주지만 다음을 실행하여 CLI로 볼 수도 있습니다 kubectl argo rollouts get rollout dev-superapi-geba.

CLI를 사용하여 출시 상태 가져오기

위의 상태는 BlueGreenPause 메시지와 함께 paused 입니다. 

녹색 서비스가 안정적이고 활성화된 서비스(v1)이고 파란색 서비스가 미리보기 서비스(v2)임을 분명히 알 수 있습니다. 

이제 미리 보기 서비스를 활성화하여 안정적이고 활성화할 수 있습니다.

서비스를 승격하려면 웹 UI에서 승격 을 클릭한 다음 확인하시겠습니까?

 CLI를 사용하여  명령을 다시 실행하면 다음이 표시됩니다.

# kubectl argo rollouts promote dev-superapi-geba. get

또는 아래 UI 에서 승격버튼을 누르면 됩니다.

v2 승격

 

버전 2 프로모션 후 출시
업그레이드 => 중단 => 승격 (롤백) 작업 

 

업그레이드, 중단, 승격 및 롤백 작업을 

 

 

결론

블루-그린 배포가 필요한 경우 Argo Rollouts와 같은 점진적 전달 컨트롤러를 사용하는 것이 좋습니다. 

전체 프로세스를 보다 직관적으로 만들고 업그레이드, 중단, 승격 및 롤백 작업을 세밀하게 제어할 수 있습니다. 

위에서 수동 일시 중지, 확인 및 승격이 있는 청록색을 살펴보았습니다. 자동 프로모션이 포함된 메트릭 기반 분석과

같은 다른 옵션이 있습니다.

 

댓글