무중단 배포 실습입니다. 1 # EC2 1대 생성 CloudFormmation EC2에 role 부여하기 EC2 로그인 # 터미널1 ------------------ mkdir 1 cd 1 # cluster.yaml 파일 생성 cat < cluster.yaml apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: my-eks-cluster region: ap-northeast-2 managedNodeGroups: - name: standard-nodes instanceType: t3.small desiredCapacity: 4 volumeSize: 20 EOF # 클러스터 생성 (약 15분 소요) eksctl create cluster -f cluster.yaml # 타이머 - 웹 브라우저로 접속해 15분 설정 https://vclock.kr/timer/#countdown=00:10:00&enabled=0&seconds=0&sound=xylophone&loop=1 2 # 삭제 후 재설치 필요시(약 15분 소요) # eksctl delete cluster --name my-eks-cluster --region ap-northeast-2 # 설치상황 cloudformation에서 확인 3 # 터미널2 watch -d kubectl get rollout,no,svc,pods,deploy,rs 4 # aws cli로 생성된 서브넷 확인해보기 aws ec2 describe-subnets \ --query 'Subnets[*].{ID:SubnetId, CIDR:CidrBlock, AvailableIP:AvailableIpAddressCount, Name:Tags[?Key==`Name`].Value | [0]}' \ --output table # 파드와 노드증가를 시각화 하여 확인하는 Kubeops view 설치 - 5분 git clone https://codeberg.org/hjacobs/kube-ops-view.git cd kube-ops-view/ kubectl apply -k deploy # 외부에서 kube-ops-view를 접속하기 위해서 Service Type을 LoadBalancer 로 변경한다. kubectl edit svc kube-ops-view type: LoadBalancer 5 # my-eks-cluster node 변경법 - 5개로 변경해 실습하자. eksctl scale nodegroup --cluster=my-eks-cluster --name=standard-nodes --nodes=5 --nodes-min=1 --nodes-max=10 --region ap-northeast-2 eksctl scale nodegroup --cluster=my-eks-cluster --name=standard-nodes --nodes=3 --nodes-min=1 --nodes-max=10 --region ap-northeast-2 6 # ECR 생성 - 레파지토리로 나의 컨테이너 이미지를 올릴곳. aws ecr create-repository --repository-name my-web-app --region ap-northeast-2 aws ecr describe-repositories 7 # aws 계정 id 확인법 aws sts get-caller-identity --query "Account" --output text 697016550159 # Docker File 생성 # 간단한 nginx 기반 정적 페이지 echo "

My EKS App - Version 1.0

" > index.html echo "FROM nginx:alpine" > Dockerfile echo "COPY index.html /usr/share/nginx/html/" >> Dockerfile # 이 명령어는 현재 디렉토리(.)에 있는 Dockerfile을 사용하여 이미지를 빌드하고, # 해당 이미지를 AWS ECR(Elastic Container Registry) 리포지토리에 푸시할 수 있도록 태그(-t)를 지정하는 단계입니다 # docker build -t .dkr.ecr.ap-northeast-2.amazonaws.com/my-web-app:v1 . docker build -t 697016550159.dkr.ecr.ap-northeast-2.amazonaws.com/my-web-app:v1 . 8 # 이미지를 넣기위해 ECR에 로그인 - Push # aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin .dkr.ecr.ap-northeast-2.amazonaws.com aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 697016550159.dkr.ecr.ap-northeast-2.amazonaws.com # docker push .dkr.ecr.ap-northeast-2.amazonaws.com/my-web-app:v1 docker push 697016550159.dkr.ecr.ap-northeast-2.amazonaws.com/my-web-app:v1 # 콘솔에서 확인 # ecr 확인 my-web-app v1 9 # 터미널 1 # Argo CD 설치 # 1. 네임스페이스 생성 kubectl create namespace argocd # 2. 해당 네임스페이스에 ArgoCD 설치 kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml --server-side # 참고 - # --server-side 플래그를 사용하신 건 아주 탁월한 선택입니다. Argo CD의 설치 매니페스트는 양이 매우 방대해서, # 일반적인 kubectl apply를 사용하면 설정 정보가 너무 커서 발생하는 오류(annotation size limit)를 만날 수 있는데, # 서버 측 적용(Server-side apply)을 통해 이를 깔끔하게 해결할 수 있습니다. # Argo CD 서버 외부 노출 (LoadBalancer) kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}' # 네임스페이스 변경 유틸 # 1. kubens 실행 파일 다운로드 sudo curl -L https://github.com/ahmetb/kubectx/releases/latest/download/kubens -o /usr/local/bin/kubens # 2. 실행 권한 부여 sudo chmod +x /usr/local/bin/kubens kubens argocd 10 # 로드밸런서 접속 - 5분후 admin # web 로그인 암호 kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo 11 # Argo Rollouts 설치 방금 실행하신 명령어로 Argo Rollouts Controller와 관련 CRD(Custom Resource Definitions)들이 argo-rollouts 네임스페이스에 성공적으로 설치 Argo Rollouts는 기본 Kubernetes의 Deployment가 제공하지 못하는 Canary(카나리)나 Blue/Green(블루/그린) 배포를 가능하게 해주는 강력한 도구입니다. 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 12 # Argo Rollouts CLI 플러그인 설치 (강력 추천) # Argo Rollouts는 전용 CLI 플러그인을 사용하면 배포 상태를 시각적으로 확인하거나 수동으로 승인(Promote)하기가 훨씬 쉽습니다. Linux (amd64) 기준 설치법: # 바이너리 다운로드 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 -------------------- 13 # Argo Rollouts 대시보드 실행 - 선택 작업 Argo CD와는 별개로 Rollouts 전용 대시보드가 있습니다. 배포 과정을 실시간으로 모니터링하기 좋습니다. 대시보드에서 할 수 있는 것들 대시보드에 접속하면 다음과 같은 작업을 마우스 클릭만으로 처리할 수 있습니다. Visual Strategy: 현재 카나리 단계(20%, 50% 등)가 어디쯤인지 시각적으로 확인 Promote: 클릭 한 번으로 수동 승인(pause 해제) Rollback: 문제가 생겼을 때 이전 버전으로 즉시 되돌리기 Analysis: 실행 중인 분석(AnalysisRun) 결과 확인 터미널 3 # 대시보드 보기 - 10 분걸림 # 대시보드 구성 요소 설치 kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/dashboard-install.yaml kubectl argo rollouts dashboard # 로드밸런서로 변경해 보자 주의: EC2 보안 그룹에서 3100번 포트가 열려 있어야 합니다. kubectl edit svc argo-rollouts-dashboard type: ClusterIP -> Loadbalancer 브라우저에서 http://:3100으로 접속하세요. --------- 또는 # 포트 포워딩으로 사이트 연결 kubectl port-forward -n argo-rollouts service/argo-rollouts-dashboard 3100:80 --address 0.0.0.0 이렇게 실행한 후, 브라우저에서 http://:3100으로 접속하세요. (주의: EC2 보안 그룹에서 3100번 포트가 열려 있어야 합니다.) ------------ 14 간단한 Canary 배포 예제 YAML 파일 cat < 무중단 배포 실습입니다. kubens default 3단계: Canary 배포 실습 (Blue -> Green) 이제 실제 애플리케이션을 배포하고, 이미지를 업데이트하면서 무중단 Canary 배포가 어떻게 이루어지는지 확인해 보겠습니다. 1. 최초 배포 (Version 1 - Blue) 먼저 'Blue' 버전의 애플리케이션을 배포합니다. Rollout 리소스와 이를 외부에 노출할 Service 리소스를 함께 생성합니다. # canary-rollout.yaml 파일 생성 cat < canary-rollout.yaml apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: demo-rollout spec: replicas: 5 selector: matchLabels: app: demo-app template: metadata: labels: app: demo-app spec: containers: - name: demo-app image: argoproj/rollouts-demo:blue # 최초 버전: Blue ports: - containerPort: 8080 strategy: canary: steps: - setWeight: 20 # 새 버전에 트래픽 20% 주입 - pause: {} # 수동 승인(Promote) 대기 - setWeight: 50 # 승인 후 트래픽 50%로 확대 - pause: {duration: 60s} # 60초 대기 후 자동 완료 --- apiVersion: v1 kind: Service metadata: name: demo-service spec: ports: - port: 80 targetPort: 8080 protocol: TCP selector: app: demo-app type: LoadBalancer # 외부 접속을 위해 LoadBalancer 타입으로 설정 EOF # 매니페스트 적용 kubectl apply -f canary-rollout.yaml 2. 서비스 접속 주소 확인 및 접속 생성된 LoadBalancer의 외부 IP(또는 DNS)를 확인하여 브라우저로 접속합니다. # 서비스 확인 및 External-IP 복사 kubectl get svc demo-service 브라우저에서 해당 IP로 접속하면 아래와 같이 파란색(Blue) 배경의 웹사이트가 보입니다. 이것이 현재 운영 중인 버전 1입니다. 시각적 확인 (V1 - Blue): ------- 3. 모니터링 시작 (터미널 3) 또 다른 터미널 창을 열어 Argo Rollouts의 배포 상태를 실시간으로 모니터링합니다 , . Bash # 터미널 3에서 실행 kubectl argo rollouts get rollout demo-rollout --watch --------- 4. 버전 업데이트 (Version 2 - Yellow) 및 Canary 배포 시작 이제 애플리케이션 이미지를 'Yellow' 버전으로 업데이트하여 Canary 배포를 트리거합니다 , . # 이미지 업데이트 명령 실행 kubectl argo rollouts set image demo-rollout demo-app=argoproj/rollouts-demo:yellow --------- 5. Canary 배포 진행 상황 확인 (Paused 상태) 모니터링 창(터미널 3)을 보면, 새로운 버전(Yellow)의 파드가 생성되고 트래픽의 20%가 흐르기 시작합니다. 그리고 canary.steps 설정에 따라 배포가 Paused - Waiting for promotion 상태로 멈춥니다 . 브라우저를 새로고침하다 보면 가끔씩 노란색(Yellow) 배경의 페이지가 보이는 것을 확인할 수 있습니다 (전체 요청의 20%). 대부분은 여전히 파란색입니다. 시각적 확인 (Canary 20% - Blue & Yellow 공존): 6. 수동 승인 (Promote) 새 버전(Yellow)에 문제가 없음을 확인했다면, 배포를 계속 진행하도록 수동으로 승인합니다 . # 배포 승인 kubectl argo rollouts promote demo-rollout 7. 배포 완료 확인 (Version 2 - Yellow) 승인 후 모니터링 창을 보면 트래픽 비율이 50%로 올라갔다가, 60초 후에 자동으로 100%로 확대되며 배포가 완료(Healthy)됩니다 . 기존의 Blue 파드들은 삭제됩니다. 이제 브라우저를 새로고침하면 모든 요청이 노란색(Yellow) 배경의 페이지로 접속됩니다. 무중단으로 버전 업데이트가 완료되었습니다. 시각적 확인 (V2 완료 - Yellow): ------------- 4단계: 문제 발생 시 롤백 (Rollback) 실습 만약 배포 중에 새 버전에 문제가 발견된다면 어떻게 해야 할까요? Argo Rollouts를 이용하면 쉽고 빠르게 이전의 안정된 상태로 되돌릴 수 있습니다. 1. 문제 있는 버전으로 업데이트 가정 (Version 3 - Red) 이번에는 문제가 있는 버전이라고 가정하고 'Red' 이미지로 업데이트를 시도합니다. # 이미지 업데이트 (Red 버전) kubectl argo rollouts set image demo-rollout demo-app=argoproj/rollouts-demo:red 모니터링 창을 보면 다시 Canary 배포가 시작되고 20% 트래픽 단계에서 Paused 상태가 됩니다. 브라우저에서도 가끔 빨간색 페이지가 보이기 시작합니다. ----- 2. 긴급 롤백 (Undo) 실행 이때 빨간색 버전에서 심각한 오류가 발견되었다고 가정하고, 승인(Promote) 대신 롤백(Undo) 명령을 내려 즉시 이전의 안정된 버전(Yellow)으로 되돌립니다 , . # 롤백 실행 kubectl argo rollouts undo demo-rollout ----- 3. 롤백 완료 확인 (Version 2 - Yellow로 복구) 모니터링 창을 보면 즉시 Red 버전의 파드들이 삭제되고, Yellow 버전의 파드들이 다시 100% 트래픽을 담당하게 됩니다. 브라우저에서도 다시 노란색 페이지 만 보이게 됩니다. ----- 5단계: 실습 리소스 삭제 실습이 끝난 후 불필요한 비용 발생을 방지하기 위해 클러스터와 리소스를 삭제합니다 , . 1. Kubernetes 리소스 삭제 # Rollout 및 Service 삭제 kubectl delete rollout demo-rollout kubectl delete svc demo-service # Argo Rollouts 대시보드 등을 설치했다면 함께 삭제 kubectl delete service/argo-rollouts-dashboard -n argo-rollouts pkill -f "kubectl port-forward" # 포트 포워딩 프로세스 종료 2. EKS 클러스터 삭제 (약 15~20분 소요) # 클러스터 삭제 eksctl delete cluster --name my-eks-cluster --region ap-northeast-2