Kubernetes/Kubernetes Advanced

📌 [ReplicaSet 심화편 #5] ReplicaSet과 RollingUpdate 전략을 활용한 배포 관리

ygtoken 2025. 3. 12. 12:32
728x90

 

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 명령어로 빠르게 롤백할 수 있습니다.

728x90