1️⃣ 개요
쿠버네티스에서 애플리케이션을 운영하는 동안 새로운 버전으로 배포해야 하는 상황이 자주 발생합니다.
하지만 Pod를 한 번에 전부 삭제하고 새롭게 생성하면 서비스 단절(다운타임)이 발생할 수 있습니다.
이 문제를 해결하기 위해 Rolling Update(롤링 업데이트) 전략을 사용하면, 기존 Pod를 점진적으로 교체하면서 무중단 배포가 가능합니다.
이번 글에서는 ReplicaSet과 Deployment의 Rolling Update 전략을 이해하고 활용하는 방법을 정리하겠습니다.
2️⃣ Rolling Update란?
✅ Rolling Update의 개념
• 기존 Pod를 점진적으로 새로운 버전의 Pod로 교체
• 한 번에 일부 Pod만 교체하고, 새로운 Pod가 정상적으로 동작하면 나머지를 교체
• 애플리케이션이 지속적으로 서비스될 수 있도록 무중단 배포를 보장
📌 Rolling Update의 주요 기능
기능 | 설명 |
점진적 배포 | 기존 Pod를 순차적으로 새 버전으로 교체 |
무중단 서비스 | 트래픽을 계속 처리하면서 배포 진행 |
롤백 지원 | 문제가 발생하면 이전 버전으로 복구 가능 |
✅ Rolling Update는 Deployment 리소스를 사용하여 적용할 수 있습니다.
3️⃣ Rolling Update를 지원하는 리소스 (ReplicaSet vs Deployment)
✅ ReplicaSet은 Rolling Update를 직접 지원하지 않음
• ReplicaSet은 단순히 지정된 개수의 Pod를 유지하는 역할만 함
• Pod의 업데이트 기능이 없어, 새 버전으로 배포하려면 기존 ReplicaSet을 삭제하고 새로운 ReplicaSet을 생성해야 함
✅ Deployment는 자동으로 Rolling Update를 지원
• Deployment는 새로운 ReplicaSet을 생성하고, 기존 ReplicaSet을 점진적으로 교체하는 방식으로 업데이트 수행
• 무중단 배포(Zero Downtime Deployment)가 가능
• 롤백(Rollback) 기능을 제공하여 문제 발생 시 이전 버전으로 쉽게 되돌릴 수 있음
✅ 실무에서는 ReplicaSet을 직접 사용하지 않고, Deployment를 사용하여 Rolling Update를 적용하는 것이 일반적입니다.
4️⃣ Rolling Update 적용 방법
✅ 1. 기본 Deployment 설정
📌 Deployment 생성 예제 (v1.0 버전 배포)
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: my-app:v1.0 # 초기 버전
📌 Deployment 배포 명령어
kubectl apply -f deployment.yaml
✅ 이제 v1.0 버전이 실행되는 3개의 Pod가 생성됩니다.
✅ 2. 새로운 버전으로 Rolling Update 수행
배포된 애플리케이션을 v1.0 → v1.1로 업데이트하려면 Deployment를 수정해야 합니다.
📌 Deployment 업데이트 (v1.1 버전 적용)
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
strategy:
type: RollingUpdate # 기본값 (순차적 업데이트)
rollingUpdate:
maxUnavailable: 1 # 한 번에 중단할 수 있는 Pod 개수
maxSurge: 1 # 한 번에 추가 생성할 수 있는 Pod 개수
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: my-app:v1.1 # 새로운 버전
📌 Deployment 업데이트 적용
kubectl apply -f deployment.yaml
✅ 기존 Pod가 하나씩 종료되고 새로운 버전의 Pod가 순차적으로 생성됩니다.
📌 Rolling Update 진행 상황 확인
kubectl rollout status deployment my-app
📌 현재 실행 중인 ReplicaSet 확인
kubectl get replicaset
✅ Deployment는 이전 버전의 ReplicaSet을 유지하면서 새로운 ReplicaSet을 생성하여 업데이트를 수행합니다.
5️⃣ Rolling Update 전략 최적화
🚀 maxUnavailable와 maxSurge 설정
Rolling Update를 수행할 때 한 번에 몇 개의 Pod를 교체할 것인지 조정할 수 있습니다.
📌 설정 값 비교
설정 값 | 설명 |
maxUnavailable | 배포 중 동시에 중단될 수 있는 Pod 개수 |
maxSurge | 한 번에 추가로 생성할 수 있는 Pod 개수 |
📌 예제: 한 번에 2개까지 중단 가능하고, 최대 2개 추가 생성 가능
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 2
maxSurge: 2
✅ 이 설정을 활용하면 배포 속도를 조정할 수 있습니다.
6️⃣ 배포 중 문제가 발생했을 때 롤백하는 방법
✅ 1. 현재 배포 상태 확인
📌 현재 배포 버전 확인
kubectl rollout history deployment my-app
📌 특정 버전의 상세 정보 확인
kubectl rollout history deployment my-app --revision=2
✅ 2. 이전 버전으로 롤백
📌 롤백 실행 (이전 버전으로 되돌리기)
kubectl rollout undo deployment my-app
📌 특정 버전으로 롤백
kubectl rollout undo deployment my-app --to-revision=2
✅ 배포 중 문제가 발생하면 빠르게 이전 버전으로 복구할 수 있습니다.
🔥 7️⃣ 결론
✔ ReplicaSet은 Rolling Update를 직접 지원하지 않으므로, Deployment를 사용하는 것이 일반적입니다.
✔ Rolling Update를 사용하면 기존 Pod를 점진적으로 교체하여 무중단 배포가 가능합니다.
✔ maxUnavailable과 maxSurge 설정을 조정하면 배포 속도를 최적화할 수 있습니다.
✔ 배포 중 문제가 발생하면 kubectl rollout undo 명령어로 빠르게 롤백할 수 있습니다.