1 # 터미널 1 watch -d kubectl get svc,hpa,deploy,rs,pods 2 # 터미널 2 k ns default 3 # name: mario-rolling cat < mario-v1.yaml apiVersion: apps/v1 kind: Deployment metadata: name: mario-rolling spec: replicas: 3 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 # 업데이트 중 기준치보다 더 생성할 수 있는 포드 수 maxUnavailable: 0 # 업데이트 중 사용할 수 없는 상태가 되어도 되는 포드 수 (0은 무중단 강조) selector: matchLabels: app: mario-rolling template: metadata: labels: app: mario-rolling version: v1 spec: containers: - name: mario image: pengbai/docker-supermario ports: - containerPort: 8080 EOF kubectl apply -f mario-v1.yaml 4 # mario-update-svc kubectl expose deployment mario-rolling --type=LoadBalancer --port=80 --target-port=8080 --name=mario-update-svc 5 # 터미널 1: 업데이트 상태 실시간 감시 kubectl rollout status deployment/mario-rolling # 터미널 2: 이미지 업데이트 실행 (무중단 시작!) kubectl set image deployment/mario-rolling mario=pengbai/docker-supermario 6 watch -d kubectl get pods -l app=mario-rolling 7 # 1. 업데이트 이력 확인 kubectl rollout history deployment/mario-rolling # 2. 바로 이전 버전으로 롤백 kubectl rollout undo deployment/mario-rolling # 3. 롤백 상태 확인 kubectl rollout status deployment/mario-rolling --------------- 1 # name: mario-v1 cat < mario-v1-stable.yaml apiVersion: apps/v1 kind: Deployment metadata: name: mario-v1 spec: replicas: 9 selector: matchLabels: app: mario-canary template: metadata: labels: app: mario-canary version: v1 spec: containers: - name: mario image: pengbai/docker-supermario EOF kubectl apply -f mario-v1-stable.yaml 2 cat < mario-v2-canary.yaml apiVersion: apps/v1 kind: Deployment metadata: name: mario-v2-canary spec: replicas: 1 selector: matchLabels: app: mario-canary template: metadata: labels: app: mario-canary version: v2 # 버전 라벨만 다름 spec: containers: - name: mario image: pengbai/docker-supermario # 실제로는 수정된 이미지 사용 EOF kubectl apply -f mario-v2-canary.yaml 3 cat < mario-canary-svc.yaml apiVersion: v1 kind: Service metadata: name: mario-canary-svc spec: type: LoadBalancer ports: - port: 80 targetPort: 8080 selector: app: mario-canary # v1, v2 포드 모두를 포함함 EOF kubectl apply -f mario-canary-svc.yaml 4 # 실시간으로 어느 버전 포드로 접속되는지 확인 (로그 확인) # 터미널을 열고 v2 포드의 로그만 모니터링해 보세요. kubectl logs -f -l version=v2 --------------------------- # argo-rollouts 1 # 네임스페이스 생성 및 설치 kubectl create namespace argo-rollouts kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml # kubectl 플러그인 설치 (관리 편의용) 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 2 cat < mario-rollout.yaml apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: mario-rollout spec: replicas: 5 strategy: canary: steps: - setWeight: 20 # 1단계: 트래픽의 20%만 신규 버전으로 보냄 - pause: {duration: 1m} # 2단계: 1분간 대기하며 상태 관찰 - setWeight: 50 # 3단계: 성공적이라면 50%까지 확대 - pause: {} # 4단계: 무기한 중단 (관리자가 승인할 때까지 대기) selector: matchLabels: app: mario-rollout template: metadata: labels: app: mario-rollout spec: containers: - name: mario image: pengbai/docker-supermario:latest # V1 버전 EOF kubectl apply -f mario-rollout.yaml 3 kubectl expose rollout mario-rollout --type=LoadBalancer --port=80 --target-port=8080 4 # 명령어로 대시보드 보자 # Rollout 상태를 트리 구조로 확인 kubectl argo rollouts get rollout mario-rollout --watch ------------- # 2. 이미지 업데이트 (V1 -> V2 가정) kubectl argo rollouts set image mario-rollout mario=pengbai/docker-supermario:latest # 3. 실시간 배포 상태 확인 kubectl argo rollouts get rollout mario-rollout --watch ------------ 카나리 배포 직접 제어해보기 터미널 모니터링 화면을 띄워둔 채로, 다른 터미널 창에서 아래 명령어들을 하나씩 입력해 보세요. 카나리 배포가 어떻게 진행되는지 바로 체감하실 수 있습니다. 이미지 업데이트 (v2 배포 시작): # default 네임스페이스에 있는 mario-rollout의 이미지를 업데이트 kubectl argo rollouts set image mario-rollout mario=pengbai/docker-supermario:latest -n default 다음 단계로 승인 (Promote): kubectl argo rollouts promote mario-rollout -n default 배포 중단 및 복구 (Abort): kubectl argo rollouts abort mario-rollout -n default