Kubernetes의 카나리아 배포 #2: Argo 롤아웃

k8s 기반 Argo Rollouts 배포 컨트롤러와 GitlabCI를 사용하여 Kubernetes에 Canary 배포를 실행합니다.

Kubernetes의 카나리아 배포 #2: Argo 롤아웃

https://unsplash.com/photos/V41PulGL1z0

이 시리즈의 기사

카나리아 배포

우리는 당신이 읽기를 바랍니다 제 부, Canary 배포가 무엇인지 간략하게 설명했습니다. 또한 표준 Kubernetes 리소스를 사용하여 이를 구현하는 방법도 보여주었습니다.

아르고 롤아웃

Argo Rollouts는 Kubernetes 기본 배포 컨트롤러입니다. Kubernetes용 CRD(Custom Resource Definition)를 제공합니다. 덕분에 우리는 새로운 엔터티를 사용할 수 있습니다: Rollout, 다양한 구성 옵션을 사용하여 블루-그린 및 카나리아 배포를 관리합니다.

사용자 정의 리소스에서 사용되는 Argo Rollouts 컨트롤러 Rollout, Kubernetes용 블루-그린 및 카나리아와 같은 추가 배포 전략을 허용합니다. 자원 Rollout 동등한 기능을 제공합니다 Deployment, 추가 배포 전략이 있는 경우에만 가능합니다.
자원 Deployments 배포에는 두 가지 전략이 있습니다. RollingUpdate и Recreate. 이러한 전략은 대부분의 경우에 적합하지만 매우 대규모로 서버에 배포하는 경우 배포 컨트롤러에서 사용할 수 없는 청록색 또는 카나리아와 같은 추가 전략이 사용됩니다. Kubernetes에서 이러한 전략을 사용하려면 사용자는 배포 위에 스크립트를 작성해야 했습니다. Argo Rollouts Controller는 이러한 전략을 간단하고 선언적이며 구성 가능한 매개변수로 표시합니다.
https://argoproj.github.io/argo-rollouts

Rollouts와 함께 사용할 수 있는 편리한 웹 인터페이스를 제공하는 Argo CI도 있습니다. 이에 대해서는 다음 기사에서 살펴보겠습니다.

Argo 롤아웃 설치

서버 측

kubectl create namespace argo-rolloutskubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml

인프라 순무(아래 참조)에 이미 install.yaml을 i/k8s/argo-rollouts/install.yaml로 추가했습니다. 이렇게 하면 GitlabCI가 이를 클러스터에 설치합니다.

클라이언트 측(kubectl 플러그인)

https://argoproj.github.io/argo-rollouts/features/kubectl-plugin

예시 애플리케이션

애플리케이션 코드와 인프라에 대해 별도의 저장소를 갖는 것이 좋습니다.

애플리케이션 저장소

Kim Wuestkamp/k8s-deployment-example-app

이는 응답을 JSON으로 반환하는 매우 간단한 Python+Flask API입니다. GitlabCI를 사용하여 패키지를 빌드하고 결과를 Gitlab 레지스트리에 푸시하겠습니다. 레지스트리에는 두 가지 릴리스 버전이 있습니다.

  • wuestkamp/k8s-배포-예제-앱:v1
  • wuestkamp/k8s-배포-예제-앱:v2

이들 사이의 유일한 차이점은 반환된 JSON 파일입니다. 우리는 어떤 버전과 통신하고 있는지 가능한 한 쉽게 시각화하기 위해 이 애플리케이션을 사용합니다.

인프라 저장소

이 리포지토리에서는 Kubernetes에 배포하기 위해 GitlabCI를 사용합니다. .gitlab-ci.yml은 다음과 같습니다.

image: traherom/kustomize-dockerbefore_script:
   - printenv
   - kubectl versionstages:
 - deploydeploy test:
   stage: deploy
   before_script:
     - echo $KUBECONFIG
   script:
     - kubectl get all
     - kubectl apply -f i/k8s    only:
     - master

직접 실행하려면 클러스터가 필요하며 Gcloud를 사용할 수 있습니다.

gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b
gcloud compute firewall-rules create incoming-80 --allow tcp:80

포크해야 해 https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure 변수를 만들고 KUBECONFIG 액세스를 위한 구성이 포함된 GitlabCI에서 kubectl 클러스터에.

여기에 클러스터(Gcloud)에 대한 사용자 인증 정보를 얻는 방법을 읽어보세요.

인프라 Yaml

인프라 저장소 내부에는 다음과 같은 서비스가 있습니다.

apiVersion: v1
kind: Service
metadata:
 labels:
   id: rollout-canary
 name: app
spec:
 ports:
 - port: 80
   protocol: TCP
   targetPort: 5000
 selector:
   id: app
 type: LoadBalancer

및 Rollout.yaml :

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
 name: rollout-canary
spec:
 replicas: 10
 revisionHistoryLimit: 2
 selector:
   matchLabels:
     id: rollout-canary
 template:
   metadata:
     labels:
       id: rollout-canary
   spec:
     containers:
     - name: rollouts-demo
       image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v1
       imagePullPolicy: Always
 strategy:
   canary:
     steps:
     - setWeight: 10
     # Rollouts can be manually resumed by running `kubectl argo rollouts promote ROLLOUT`
     - pause: {}
     - setWeight: 50
     - pause: { duration: 120 } # two minutes

Rollout 배포와 동일하게 작동합니다. 업데이트 전략(여기서는 Canary와 같은)을 설정하지 않으면 기본 롤링 업데이트 배포처럼 작동합니다.

카나리아 배포를 위해 yaml에서 두 단계를 정의합니다.

  1. 카나리아로 향하는 트래픽의 10%(수동 확인 대기)
  2. 카나리아에 대한 트래픽 50%(2분 동안 기다린 후 100%까지 계속)

초기 배포 수행

초기 배포 후 리소스는 다음과 같습니다.

Kubernetes의 카나리아 배포 #2: Argo 롤아웃

그리고 우리는 애플리케이션의 첫 번째 버전에서만 응답을 받습니다.

Kubernetes의 카나리아 배포 #2: Argo 롤아웃

카나리아 배포 수행

1단계: 트래픽 10%

카나리아 배포를 시작하려면 일반적으로 배포에서 수행하는 것처럼 이미지 버전을 변경하면 됩니다.

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
 name: rollout-canary
spec:
...
 template:
   metadata:
     labels:
       id: rollout-canary
   spec:
     containers:
     - name: rollouts-demo
       image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
...

그리고 변경 사항을 푸시하면 Gitlab CI가 배포되고 변경 사항이 표시됩니다.

Kubernetes의 카나리아 배포 #2: Argo 롤아웃

이제 서비스에 액세스하면 다음과 같습니다.

Kubernetes의 카나리아 배포 #2: Argo 롤아웃

엄청난! 우리는 카나리아 배포를 진행 중입니다. 다음을 실행하여 진행 상황을 확인할 수 있습니다.

kubectl argo rollouts get rollout rollout-canary

Kubernetes의 카나리아 배포 #2: Argo 롤아웃

2단계: 트래픽 50%:

이제 다음 단계인 트래픽의 50%를 리디렉션하는 단계로 넘어가겠습니다. 이 단계가 수동으로 실행되도록 구성했습니다.

kubectl argo rollouts promote rollout-canary # continue to step 2

Kubernetes의 카나리아 배포 #2: Argo 롤아웃

그리고 우리 애플리케이션은 새 버전의 응답 중 50%를 반환했습니다.

Kubernetes의 카나리아 배포 #2: Argo 롤아웃

출시 검토:

Kubernetes의 카나리아 배포 #2: Argo 롤아웃

좋은

3단계: 트래픽 100%:

2분 후에 50% 단계가 자동으로 종료되고 100% 단계가 시작되도록 설정했습니다.

Kubernetes의 카나리아 배포 #2: Argo 롤아웃

그리고 애플리케이션 출력은 다음과 같습니다.

Kubernetes의 카나리아 배포 #2: Argo 롤아웃

출시 검토:

Kubernetes의 카나리아 배포 #2: Argo 롤아웃

카나리아 배포가 완료되었습니다.

Argo Rollouts의 추가 예

여기에는 카나리아를 기반으로 환경 미리보기 및 비교를 설정하는 방법과 같은 더 많은 예가 있습니다.

https://github.com/argoproj/argo-rollouts/tree/master/examples

Argo 롤아웃 및 Argo CI에 대한 비디오

Argo Rollouts와 Argo CI가 어떻게 함께 작동하는지 보여주는 이 비디오를 정말 추천합니다.

합계

추가 유형의 배포 또는 복제본 세트 생성, 트래픽 리디렉션 등을 관리하는 CRD를 사용한다는 아이디어가 정말 마음에 듭니다. 그들과의 작업은 순조롭게 진행됩니다. 다음으로 Argo CI와의 통합을 테스트하고 싶습니다.

그러나 Argo CI와 Flux CI의 대규모 합병이 있을 것으로 보이므로 새 릴리스가 나올 때까지 기다릴 수도 있습니다. 아르고 플럭스.

Argo Rollouts나 Argo CI를 사용해 본 경험이 있나요?

블로그에서 다른 기사도 읽어보세요.

출처 : habr.com

코멘트를 추가