[Scenario Playbook Ep.6] 🚀 Deployment 편 #1 | 배포 전략 및 롤링 업데이트
쿠버네티스에서 Deployment는 애플리케이션의 배포 및 관리를 담당하는 핵심 리소스입니다.
이번 글에서는 Deployment를 활용한 배포 전략과 롤링 업데이트 방식을 다룹니다.
📌 글에서 다루는 상황들
1️⃣ 기본적인 Deployment 배포
2️⃣ 롤링 업데이트 전략 적용
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ 기본적인 Deployment 배포
📍 상황 설명
운영팀에서 웹 애플리케이션을 안정적으로 배포할 수 있도록 Deployment를 활용하려 합니다.
이 애플리케이션은 여러 개의 Replica(복제본)를 실행해야 하며, 트래픽을 분산시켜야 합니다.
• Deployment의 이름은 web-deployment이어야 합니다.
• nginx:latest 이미지를 사용하여 웹 서버를 실행해야 합니다.
• 3개의 Replica를 생성하여 부하를 분산시켜야 합니다.
🛠️ 해결 방법
1. Deployment를 생성하고 여러 개의 Replica를 설정해야 합니다.
• spec.replicas를 사용하여 원하는 개수(3개) 설정
2. Pod이 동일한 애플리케이션을 실행하도록 정의해야 합니다.
• spec.template.spec.containers에 Nginx 컨테이너를 설정
✅ 정답 Manifest (기본 Deployment 배포)
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment # Deployment의 이름
spec:
replicas: 3 # 실행할 Pod 개수
selector:
matchLabels:
app: web # 이 레이블이 있는 Pod을 관리
template:
metadata:
labels:
app: web # Pod 레이블 설정
spec:
containers:
- name: nginx
image: nginx:latest # Nginx 웹 서버 컨테이너
ports:
- containerPort: 80 # 80번 포트에서 서비스 제공
📌 적용 후 예상 결과 값
1. Deployment 생성 확인
kubectl get deployments
💡 예상 출력 값
NAME READY UP-TO-DATE AVAILABLE AGE
web-deployment 3/3 3 3 5s
2. Pod 상태 확인
kubectl get pods -l app=web
💡 예상 출력 값
NAME READY STATUS RESTARTS AGE
web-deployment-5d9f8bff8c-abc12 1/1 Running 0 5s
web-deployment-5d9f8bff8c-def34 1/1 Running 0 5s
web-deployment-5d9f8bff8c-ghi56 1/1 Running 0 5s
2️⃣ 롤링 업데이트 전략 적용
📍 상황 설명
운영 중인 애플리케이션의 새로운 버전을 무중단으로 배포해야 합니다.
이를 위해 롤링 업데이트(Rolling Update) 전략을 적용해야 합니다.
• Deployment의 이름은 web-deployment이어야 합니다.
• 기존 nginx:latest 이미지를 nginx:1.21.6으로 업데이트해야 합니다.
• 무중단 배포를 보장하기 위해 최대 1개의 Pod만 다운되고, 2개의 새로운 Pod이 동시에 배포되도록 설정해야 합니다.
🛠️ 해결 방법
1. Deployment의 업데이트 전략을 정의해야 합니다.
• strategy.type을 RollingUpdate로 설정
• maxUnavailable을 1로 설정하여 최대 1개의 Pod만 다운되도록 제한
• maxSurge를 2로 설정하여 동시에 2개의 새로운 Pod을 배포하도록 구성
✅ 정답 Manifest (롤링 업데이트 적용된 Deployment)
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment # Deployment의 이름
spec:
replicas: 3 # 실행할 Pod 개수
strategy:
type: RollingUpdate # 롤링 업데이트 전략 적용
rollingUpdate:
maxUnavailable: 1 # 최대 1개의 Pod만 다운될 수 있음
maxSurge: 2 # 최대 2개의 새로운 Pod을 동시에 배포 가능
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.21.6 # 업데이트할 새 버전
ports:
- containerPort: 80
📌 적용 후 예상 결과 값
1. 롤링 업데이트 적용
kubectl apply -f web-deployment.yaml
💡 예상 출력 값
deployment.apps/web-deployment configured
2. 업데이트 진행 상태 확인
kubectl rollout status deployment web-deployment
💡 예상 출력 값
deployment "web-deployment" successfully rolled out
3. 새로운 버전의 Pod이 배포되었는지 확인
kubectl get pods -l app=web
💡 예상 출력 값
NAME READY STATUS RESTARTS AGE
web-deployment-6f8d9bff8c-xyz12 1/1 Running 0 5s
web-deployment-6f8d9bff8c-xyz34 1/1 Running 0 5s
web-deployment-6f8d9bff8c-xyz56 1/1 Running 0 5s