# 카나리 배포 (Canary 배포) <1> EKS 생성 1 # 콘솔 로그인 오른쪽위 서울리전 사용하는지 확인 - 교육기관 계정인 경우 본인 리전 사용 2 # ec2 키페어 1개 만들어야 한다.. ec2 > 네트워크 보안 및 보안 > 키 페어 EC2 키페어 생성 (기존에 EC2 키페어 있는경우는 해당 키페어 사용) data-2026-03-28 3 # ec2 1개 만드는 CloudFomation 실행 CloudFomation eks-man-wa wa alias 추가한 파일 4 ec2에 적용을 위한 iam role 하나 만듬. seo-admin role 생성 admin 권한 제공 보안 > IAM 역할 수정 > seo-admin-role 적용 5 ec2에 로그인 aws s3 ls 권한 확인 [root@kops-ec2 ~]# aws s3 ls 2026-01-16 19:56:51 agame-bk12 2026-01-16 19:12:25 ai-002-bk11 2026-01-16 15:33:05 ai-0021 2026-01-16 15:26:09 cf-templates-4h3zklo71j7k-ap-northeast-2 6 # 리전 지정 - 교육기관 계정인 경우 본인 리전 사용 ----------------- mkdir -p ~/environment/ cd ~/environment/ export AWS_REGION=ap-northeast-2 echo ${AWS_REGION} # eks 생성하기1 - m7i-flex.large 무료계정 가능 타입 , 워커 노드의 인스턴스 타입 cat << EOF > eks-demo-cluster.yaml --- apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: eks-demo # 생성할 EKS 클러스터명 region: ${AWS_REGION} # 클러스터를 생성할 리젼 version: "1.34" vpc: cidr: "192.168.0.0/16" # 클러스터에서 사용할 VPC의 CIDR managedNodeGroups: - name: node-group # 클러스터의 노드 그룹명 instanceType: m7i-flex.large # 클러스터 워커 노드의 인스턴스 타입 desiredCapacity: 1 # 클러스터 워커 노드의 갯수 volumeSize: 20 # 클러스터 워커 노드의 EBS 용량 (단위: GiB) iam: withAddonPolicies: imageBuilder: true # AWS ECR에 대한 권한 추가 albIngress: true # albIngress에 대한 권한 추가 cloudWatch: true # cloudWatch에 대한 권한 추가 autoScaler: true # auto scaling에 대한 권한 추가 cloudWatch: clusterLogging: enableTypes: ["*"] EOF eksctl create cluster -f eks-demo-cluster.yaml ---------------- # 무료 계정으로 가능한 서버 t3.micro t3.small c7i-flex.large 2/4 m7i-flex.large 2 /8 <2> 카나리 배포 0 # 새 터미널 - 터미널 2에서 watch -d kubectl get Rollout,no,deploy,rs,pods,svc # 터미널 1 <3> Argo Rollouts 컨트롤러 설치 기본적인 Deployment 대신 Argo Rollouts의 Rollout 오브젝트를 사용합니다. Argo Rollouts 컨트롤러는 Kubernetes에서 고급 배포 전략(Canary, Blue/Green 등)을 자동으로 관리하는 핵심 컨트롤러입니다. 기본적으로 Kubernetes Deployment 컨트롤러보다 더 정교한 배포 제어 기능을 제공합니다. 6 # Argo Rollouts Controller 설치 # 네임스페이스 argo-rollouts를 만들고 Argo Rollouts Controller 설치한다. kubectl create namespace argo-rollouts kubectl apply -n argo-rollouts \ -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml kubectl get pods -n argo-rollouts argo-rollouts-5cf9b959f9-sw7wv 1/1 Running 0 7m16s k ns argo-rollouts --------------- <4> kubectl Argo Rollouts plugin 설치 쿠버네티스에서 카나리 배포, 블루/그린 배포 같은 점진적 배포 전략을 쉽게 제어하고 모니터링할 수 있게 해주는 CLI 플러그인입니다. 4. 설치 방법 (중요) 플러그인은 따로 설치해야 함 kubectl Argo Rollouts plugin 설치 curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-linux-amd64 chmod +x kubectl-argo-rollouts-linux-amd64 mv kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts kubectl argo rollouts version ---------- 전제 조건은 아래 2개입니다. Argo Rollouts controller 설치 완료 kubectl argo rollouts plugin 설치 완료 Service 포함 + cat 한 번으로 실행 가능한 nginx 카나리 실습 Rollout 생성 Service 생성 처음에는 nginx:1.25 이후 nginx:1.26으로 변경 20% 카나리 후 pause 확인 후 promote 문제 있으면 abort 흐름으로 되어 있습니다. Argo Rollouts 공식 가이드도 Rollout + Service를 같이 배포하고, setWeight, pause, promote, abort 순서로 실습합니다. ------------ 1단계. 네임스페이스 생성 kubectl create namespace rollouts-demo 2단계. YAML 파일 생성 아래 그대로 입력해서 파일을 만드세요. cat <<'EOF' > simple-nginx-rollout.yaml apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: simple-nginx namespace: rollouts-demo spec: replicas: 5 selector: matchLabels: app: simple-nginx template: metadata: labels: app: simple-nginx spec: containers: - name: nginx image: nginx:1.25 ports: - containerPort: 80 strategy: canary: steps: - setWeight: 20 - pause: {} --- apiVersion: v1 kind: Service metadata: name: simple-nginx namespace: rollouts-demo spec: selector: app: simple-nginx ports: - port: 80 targetPort: 80 EOF # 3단계. 배포 적용 kubectl apply -f simple-nginx-rollout.yaml replicaset.apps/simple-nginx-cb7574c44 5 5 5 18s NAME READY STATUS RESTARTS AGE pod/simple-nginx-cb7574c44-46jzx 1/1 Running 0 17s pod/simple-nginx-cb7574c44-cfm6z 1/1 Running 0 17s pod/simple-nginx-cb7574c44-hpt7t 1/1 Running 0 17s pod/simple-nginx-cb7574c44-nk992 1/1 Running 0 17s pod/simple-nginx-cb7574c44-tlppd 1/1 Running 0 17s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/simple-nginx ClusterIP 10.100.113.166 80/TCP 18s 4단계. 생성 확인 kubectl get rollout -n rollouts-demo kubectl get svc -n rollouts-demo kubectl get pods -n rollouts-demo 5단계. 현재 상태 보기 kubectl argo rollouts get rollout simple-nginx -n rollouts-demo 또는 실시간으로 보려면: kubectl argo rollouts get rollout simple-nginx -n rollouts-demo --watch # 새 터미널 6단계. 카나리 업데이트 시작 기존 nginx:1.25를 nginx:1.26으로 바꿉니다. kubectl argo rollouts set image simple-nginx nginx=nginx:1.26 -n rollouts-demo 7단계. 카나리 상태 확인 kubectl argo rollouts get rollout simple-nginx -n rollouts-demo --watch 여기서 핵심은: 새 버전이 일부만 올라옴 setWeight: 20 이라서 5개 기준 대략 1개 정도가 새 버전 pause: {} 때문에 멈춤 트래픽 라우팅을 따로 쓰지 않는 기본 카나리에서는 현재 weight에 맞춰 canary replica 수를 조정합니다. 예를 들어 25%에 replicas 4개면 canary 1개 수준으로 맞춥니다 --------------- 8단계. 문제 없으면 승격 kubectl argo rollouts promote simple-nginx -n rollouts-demo 1.26 # 참고 # 9단계. 문제 있으면 중단 - 미 실행 kubectl argo rollouts abort simple-nginx -n rollouts-demo abort는 현재 배포 진행을 멈추고 이전 ReplicaSet을 다시 활성화합니다. 다만 spec.template은 여전히 새 버전을 가리키므로, 완전히 이전 상태로 되돌리려면 이미지도 다시 바꾸는 것이 안전합니다 10단계. 완전히 이전 버전으로 되돌리기 kubectl argo rollouts set image simple-nginx nginx=nginx:1.25 -n rollouts-demo --------------- Argo Rollouts에서 nginx 버전이 실제로 바뀌었는지 확인하는 방법을 단계별로 정리 1. 가장 확실한 방법 (Pod 이미지 확인) kubectl get pods -n rollouts-demo -o wide kubectl describe pod -n rollouts-demo kubectl describe pod simple-nginx-c567cdbfc-8lrn4 -n rollouts-demo 1.26 kubectl describe pod/simple-nginx-cb7574c44-2xkf2 -n rollouts-demo 1.25 2 또는 한 번에 보기: kubectl get pods -n rollouts-demo -o=jsonpath='{.items[*].spec.containers[*].image}' 결과 예: nginx:1.25 nginx:1.25 nginx:1.26 nginx:1.25 이렇게 나오면 ➡️ 일부 Pod만 1.26 → 카나리 진행 중 3 2. Rollout 기준으로 확인 (추천 kubectl argo rollouts get rollout simple-nginx -n rollouts-demo 여기서 핵심 포인트: Stable RS → nginx:1.25 Canary RS → nginx:1.26 weight (20%) stable: nginx:1.25 canary: nginx:1.26 이게 가장 "Argo 관점"에서 정확한 확인 방법 3. ReplicaSet 기준 확인 kubectl get rs -n rollouts-demo kubectl describe rs -n rollouts-demo kubectl describe rs simple-nginx-cb7574c44 -n rollouts-demo kubectl describe rs simple-nginx-cb7574c44 -n rollouts-demo 확인 포인트: OLD RS → nginx:1.25 NEW RS → nginx:1.26 4. Pod별 버전 깔끔하게 보기 (추천) kubectl get pods -n rollouts-demo -o custom-columns=NAME:.metadata.name,IMAGE:.spec.containers[0].image simple-nginx-xxxxx nginx:1.25 simple-nginx-yyyyy nginx:1.26 5. 실제 HTTP로 확인 (옵션) nginx는 기본 페이지에 버전이 안 나오므로: kubectl exec -it -n rollouts-demo -- nginx -v kubectl exec -it simple-nginx-c567cdbfc-8lrn4 -n rollouts-demo -- nginx -v nginx version: nginx/1.26.0 -------- 핵심 요약 kubectl argo rollouts get rollout simple-nginx -n rollouts-demo kubectl get pods -n rollouts-demo -o custom-columns=NAME:.metadata.name,IMAGE:.spec.containers[0].image ----------------- 카나리 배포 전 상태로 되돌리기 1 배포가 아직 진행 중이거나 pause 상태라면 먼저 중단: kubectl argo rollouts abort simple-nginx -n rollouts-demo 이 명령은 현재 진행 중인 Rollout을 멈추고 이전 ReplicaSet을 다시 활성화합니다. 다만 spec.template은 여전히 새 버전을 가리킬 수 있어서, 완전히 이전 상태로 고정하려면 이미지도 원래 버전으로 다시 돌려야 합니다. 2 kubectl argo rollouts set image simple-nginx nginx=nginx:1.25 -n rollouts-demo 무기한 pause: {} 단계였다면 promote 전까지는 멈춰 있는 것이 정상입니다. 가장 간단히 순서만 쓰면 이겁니다: kubectl argo rollouts abort simple-nginx -n rollouts-demo kubectl argo rollouts set image simple-nginx nginx=nginx:1.25 -n rollouts-demo kubectl argo rollouts get rollout simple-nginx -n rollouts-demo --watch 3 배포가 끝난 뒤 이전 버전으로 되돌리는 거라면 undo도 가능합니다: kubectl argo rollouts undo simple-nginx -n rollouts-demo 4 특정 revision으로 되돌릴 수도 있습니다. ------------------------- # 배포중 문제가 있다. 중단후 롤백 실습 2048 게임 기준으로, 앞서 nginx 예제와 완전히 똑같이 하나씩 실행하는 방식으로 정리 이번 예제는 가장 단순한 Rollout 방식입니다. 초기 버전: public.ecr.aws/l6m2t8p7/docker-2048:latest 업데이트 버전: alexwhen/docker-2048:latest setWeight: 20 pause: {} 즉, 업데이트 시 20% 수준으로 새 Pod를 올리고 멈춤 확인 후 promote 문제 있으면 abort Argo Rollouts의 기본 canary는 setWeight와 pause로 진행되며, 트래픽 관리 기능을 쓰지 않으면 Replica 비율로 최대한 weight에 가깝게 맞추는 방식으로 동작합니다. 또 pause: {} 는 사용자가 직접 promote하기 전까지 무기한 멈춥니다. 참고로 public.ecr.aws/l6m2t8p7/docker-2048:latest 이미지는 AWS Load Balancer Controller의 2048 예제에서도 사용되는 공개 샘플 이미지입니다 1단계. 네임스페이스 생성 kubectl create namespace game-2048 2단계. YAML 파일 생성 cat <<'EOF' > 2048-rollout.yaml apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: game-2048 namespace: game-2048 spec: replicas: 5 selector: matchLabels: app: "2048" template: metadata: labels: app: "2048" spec: containers: - name: game-2048 image: public.ecr.aws/l6m2t8p7/docker-2048:latest ports: - containerPort: 80 strategy: canary: steps: - setWeight: 20 - pause: {} --- apiVersion: v1 kind: Service metadata: name: game-2048 namespace: game-2048 spec: selector: app: "2048" ports: - port: 80 targetPort: 80 protocol: TCP type: LoadBalancer EOF 이 설정은 초기 배포 때는 바로 배포되고, 이후 이미지가 바뀌는 업데이트부터 20% → pause 단계가 적용됩니다. # NodePort나 Clusterip를 type: LoadBalancer 로 변경한것임. 3단계. 배포 적용 kubectl apply -f 2048-rollout.yaml k ns game-2048 4단계. 생성 확인 kubectl get rollout -n game-2048 kubectl get svc -n game-2048 kubectl get pods -n game-2048 5단계. 현재 Rollout 상태 확인 kubectl argo rollouts get rollout game-2048 -n game-2048 실시간으로 보려면: kubectl argo rollouts get rollout game-2048 -n game-2048 --watch 6단계. 접속 테스트 방법1 브라우저로 로드밸런서 서비스 접속 # 방법2 - 포워딩으로 사용시 - 참고 # kubectl port-forward svc/game-2048 8080:80 -n game-2048 브라우저에서: # http://localhost:8080 # 포트가 보안그룹에서 열려 있어야 한다. 7단계. 카나리 업데이트 시작 이제 새 이미지로 변경합니다. kubectl argo rollouts set image game-2048 game-2048=alexwhen/docker-2048:latest -n game-2048 et image는 Rollout의 컨테이너 이미지를 바꾸는 공식 명령이고, 업데이트가 시작되면 정의된 canary step이 실행됩니다. 8단계. 카나리 상태 확인 kubectl argo rollouts get rollout game-2048 -n game-2048 --watch 여기서 보게 되는 핵심은: 새 ReplicaSet 생성 5개 중 대략 1개 정도가 새 버전으로 전환 20% 단계에서 멈춤 pause: {} 상태 유지 Argo Rollouts 문서는 트래픽 관리 기능이 없을 때도 weight에 맞추어 새/기존 ReplicaSet 개수를 best effort로 조정한다고 설명합니다. 예를 들어 10 replicas에서 10%면 1개, 5 replicas에서 20%면 대략 1개 수준입니다. 9단계. 실제로 어떤 Pod가 새 버전인지 확인 kubectl get pods -n game-2048 -o custom-columns=NAME:.metadata.name,IMAGE:.spec.containers[0].image 즉, 일부만 새 이미지면 카나리 중입니다. 10단계. 문제 없으면 승격 # kubectl argo rollouts promote game-2048 -n game-2048 Argo Rollouts 문서에 따르면, pause 단계에 도달한 Rollout은 promote로 다음 단계로 진행할 수 있습니다. # 배포중 문제가 있다. 중단후 롤백하자 11단계. 문제 있으면 중단 kubectl argo rollouts abort game-2048 -n game-2048 abort는 진행 중인 Rollout을 멈추고 이전 안정 버전 쪽으로 되돌리는 데 사용합니다. 12단계. 카나리 배포 전 상태로 완전히 되돌리기 처음 이미지로 다시 맞추려면: kubectl argo rollouts set image game-2048 game-2048=public.ecr.aws/l6m2t8p7/docker-2048:latest -n game-2048 kubectl argo rollouts get rollout game-2048 -n game-2048 --watch 13단계. 정리 # kubectl delete -f 2048-rollout.yaml # kubectl delete namespace game-2048 --------------------------