1 기본적인 Deployment 대신 Argo Rollouts의 Rollout 오브젝트를 사용합니다. kubectl create namespace argo-rollouts kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml 2 k ns argo-rollouts 3 vi rollout.yaml # rollout.yaml apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: my-web-app spec: replicas: 4 strategy: canary: # 트래픽 분할 단계 설정 steps: - setWeight: 10 pause: {duration: 1m} # 10% 트래픽으로 1분간 대기 - setWeight: 50 pause: {duration: 5m} # 50% 트래픽으로 5분간 대기 (이때 수동 승인도 가능) selector: matchLabels: app: my-web-app template: metadata: labels: app: my-web-app spec: containers: - name: nginx image: nginx:1.21 # 새 버전으로 변경 시 카나리 작동 ports: - containerPort: 80 kubectl apply -f my-rollout.yaml 4 카나리 배포 모니터링 (Argo UI) # kubectl 플러그인 설치 후 실행 kubectl argo rollouts get rollout my-web-rollout --watch 5 kubectl argo rollouts 명령어가 실행되지 않는 이유는 크게 두 가지입니다. argo는 kubectl의 기본 명령어가 아닌 별도의 플러그인이기 때문인데요. 지금 상황은 플러그인이 설치되어 있지 않거나, 설치했더라도 실행 경로($PATH)에 등록되지 않았을 가능성이 높습니다. 아래 단계를 따라 해결해 보세요! 1. kubectl-argo-rollouts 플러그인 설치 (Linux 기준) 배스티언(Bastion) 호스트가 Linux 기반이라면 아래 명령어를 복사해서 실행해 주세요. # 1. 바이너리 다운로드 (최신 버전) curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-linux-amd64 # 2. 실행 권한 부여 chmod +x ./kubectl-argo-rollouts-linux-amd64 # 3. 경로 이동 (kubectl이 인식할 수 있도록 /usr/local/bin으로 이동) sudo mv ./kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts 설치 확인 설치가 정상적으로 완료되면 아래 명령어로 버전을 확인할 수 있습니다. 이제 kubectl argo rollouts라고 입력해도 작동할 거예요. kubectl argo rollouts version krew를 사용 중이라면? 만약 Kubernetes 플러그인 관리자인 Krew를 사용 중이시라면 더 간단하게 설치할 수 있습니다. kubectl krew install rollouts 6 kubectl argo rollouts get rollout my-web-app --watch 7 kubectl create namespace argo-rollouts kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml 8 kubectl 플러그인 설치 (macOS 기준): brew install argoproj/tap/kubectl-argo-rollouts (Windows/Linux라면 공식 가이드를 참고하여 바이너리를 다운로드하세요.) https://www.google.com/search?q=https://argoproj.github.io/argo-rollouts/installation/%23kubectl-plugin-installation 9 # 기본 버전인 nginx:1.24를 먼저 배포합니다. # 일반적인 Deployment와 매우 흡사하지만 kind가 Rollout인 점이 다릅니다. vi my-rollout.yaml # my-rollout.yaml apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: my-web-rollout spec: replicas: 4 selector: matchLabels: app: my-web-app template: metadata: labels: app: my-web-app spec: containers: - name: nginx image: nginx:1.24 ports: - containerPort: 80 strategy: canary: steps: - setWeight: 25 # 25% 트래픽 전송 - pause: {} # 무기한 중단 (사람이 확인 후 승인할 때까지) - setWeight: 50 - pause: {duration: 2m} # 2분간 대기 후 다음으로 10 kubectl argo rollouts get rollout my-web-rollout --watch 11 kubectl argo rollouts set image my-web-rollout nginx=nginx:1.25 12 kubectl argo rollouts promote my-web-rollout 이 명령어를 입력하면 즉시 카나리 버전이 삭제되고 100% 트래픽이 다시 이전 안정 버전(Stable)으로 돌아갑니다. -------------------- EKS시스템을 정리 이제 인프라의 "틀"은 완성되었습니다. 실제 운영 단계에서 고려할 만한 고급 주제들은 다음과 같습니다. 보안 강화: Kyverno나 OPA를 사용하여 클러스터 내의 보안 정책을 강제(예: Root 권한 실행 금지). 비용 최적화: Kubecost를 설치하여 어떤 팀/서비스가 AWS 비용을 얼마나 쓰고 있는지 정산. 서비스 메시: Istio를 도입하여 마이크로서비스 간의 통신 암호화(mTLS) 및 복잡한 트래픽 제어. 지금까지 배운 내용 중 가장 흥미롭거나 보완하고 싶은 부분이 있으신가요? 혹은 특정 서비스를 실제 도메인에 올리는 마지막 실습을 도와드릴까요?