k8s 기반 Argo Rollouts 배포 컨트롤러와 GitlabCI를 사용하여 Kubernetes에 Canary 배포를 실행합니다.
이 시리즈의 기사
Kubernetes #1의 카나리아 배포: Gitlab CI - (이 기사)
- Istio를 사용한 카나리아 배포
- Jenkins-X Istio Flagger를 사용한 카나리아 배포
카나리아 배포
우리는 당신이 읽기를 바랍니다
아르고 롤아웃
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 플러그인)
예시 애플리케이션
애플리케이션 코드와 인프라에 대해 별도의 저장소를 갖는 것이 좋습니다.
애플리케이션 저장소
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
포크해야 해 KUBECONFIG
액세스를 위한 구성이 포함된 GitlabCI에서 kubectl
클러스터에.
인프라 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에서 두 단계를 정의합니다.
- 카나리아로 향하는 트래픽의 10%(수동 확인 대기)
- 카나리아에 대한 트래픽 50%(2분 동안 기다린 후 100%까지 계속)
초기 배포 수행
초기 배포 후 리소스는 다음과 같습니다.
그리고 우리는 애플리케이션의 첫 번째 버전에서만 응답을 받습니다.
카나리아 배포 수행
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가 배포되고 변경 사항이 표시됩니다.
이제 서비스에 액세스하면 다음과 같습니다.
엄청난! 우리는 카나리아 배포를 진행 중입니다. 다음을 실행하여 진행 상황을 확인할 수 있습니다.
kubectl argo rollouts get rollout rollout-canary
2단계: 트래픽 50%:
이제 다음 단계인 트래픽의 50%를 리디렉션하는 단계로 넘어가겠습니다. 이 단계가 수동으로 실행되도록 구성했습니다.
kubectl argo rollouts promote rollout-canary # continue to step 2
그리고 우리 애플리케이션은 새 버전의 응답 중 50%를 반환했습니다.
출시 검토:
좋은
3단계: 트래픽 100%:
2분 후에 50% 단계가 자동으로 종료되고 100% 단계가 시작되도록 설정했습니다.
그리고 애플리케이션 출력은 다음과 같습니다.
출시 검토:
카나리아 배포가 완료되었습니다.
Argo Rollouts의 추가 예
여기에는 카나리아를 기반으로 환경 미리보기 및 비교를 설정하는 방법과 같은 더 많은 예가 있습니다.
Argo 롤아웃 및 Argo CI에 대한 비디오
Argo Rollouts와 Argo CI가 어떻게 함께 작동하는지 보여주는 이 비디오를 정말 추천합니다.
합계
추가 유형의 배포 또는 복제본 세트 생성, 트래픽 리디렉션 등을 관리하는 CRD를 사용한다는 아이디어가 정말 마음에 듭니다. 그들과의 작업은 순조롭게 진행됩니다. 다음으로 Argo CI와의 통합을 테스트하고 싶습니다.
그러나 Argo CI와 Flux CI의 대규모 합병이 있을 것으로 보이므로 새 릴리스가 나올 때까지 기다릴 수도 있습니다.
Argo Rollouts나 Argo CI를 사용해 본 경험이 있나요?
블로그에서 다른 기사도 읽어보세요.
Nginx 웹 서버를 사용하여 Spring 애플리케이션의 블루-그린 배포 Kubernetes: 시스템 리소스 관리를 설정하는 것이 왜 그렇게 중요한가요? Hashicorp Consul의 Kubernetes 인증 소개 Tekton Pipeline - Kubernetes 기반 파이프라인 Nginx용 동적 모듈 빌드 Redmine용 텔레그램 봇. 자신과 다른 사람의 삶을 단순화하는 방법
출처 : habr.com