쿠버네티스에서 롤링 업데이트 중 발생하는 서비스 중단을 최소화하는 것이 중요합니다.
특히, Deployment 또는 StatefulSet을 업데이트할 때 일정 수 이상의 Pod이 항상 실행되도록 보장해야 합니다.
이를 위해 Pod Disruption Budget(PDB)을 활용하여 안정적인 롤링 업데이트를 수행하는 방법을 다룹니다.
📌 글에서 다루는 상황들
1. Pod Disruption Budget(PDB)를 활용하여 최소한의 가용성을 유지하는 방법
2. 롤링 업데이트 중 서비스 중단 없이 새로운 버전으로 교체하는 전략
3. kubectl 명령어를 활용하여 업데이트 진행 상황 및 PDB 적용 상태 확인
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ Pod Disruption Budget(PDB)를 활용하여 최소한의 가용성을 유지하는 방법
❓ 문제 상황
운영팀에서 애플리케이션을 배포하는 동안 최소한 2개의 Pod이 항상 실행되도록 보장해야 합니다.
PDB를 설정하여 롤링 업데이트, 노드 스케일링, 장애 발생 시에도 서비스 가용성을 유지해야 합니다.
• Deployment 이름: web-app
• 최소 유지 Pod 개수: 2개
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. Pod Disruption Budget(PDB)을 생성하여 최소한 2개의 Pod이 항상 유지되도록 설정합니다.
2. kubectl 명령어를 활용하여 PDB가 정상적으로 적용되었는지 확인합니다.
✅ 정답 Manifest (Pod Disruption Budget 설정)
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: web-app-pdb
namespace: default
spec:
minAvailable: 2 # 최소 2개의 Pod이 항상 유지되어야 함
selector:
matchLabels:
app: web-app
📌 적용 후 예상 결과 값
1. PDB가 정상적으로 생성되었는지 확인
kubectl get pdb
💡 예상 출력 값
NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE
web-app-pdb 2 N/A 1 5s
✅ PDB가 적용되었으며, 최소 2개의 Pod을 유지하도록 설정됨
2️⃣ 롤링 업데이트 중 서비스 중단 없이 새로운 버전으로 교체하는 전략
❓ 문제 상황
운영팀에서 애플리케이션의 새로운 버전을 배포하는 동안 서비스 중단 없이 기존 Pod을 순차적으로 교체해야 합니다.
이를 위해 Deployment의 maxUnavailable 및 maxSurge 값을 조정하여 업데이트 중에도 일정 개수의 Pod이 유지되도록 설정해야 합니다.
• Deployment 이름: web-app
• maxUnavailable: 1개 (최대 1개의 Pod만 동시에 다운됨)
• maxSurge: 2개 (동시에 최대 2개의 새로운 Pod 추가 가능)
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. Deployment의 업데이트 전략을 지정하여 maxUnavailable과 maxSurge 값을 설정합니다.
2. kubectl 명령어를 활용하여 업데이트 진행 상황을 모니터링합니다.
✅ 정답 Manifest (Deployment 롤링 업데이트 설정)
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1 # 업데이트 중 최대 1개의 Pod만 중단됨
maxSurge: 2 # 최대 2개의 새로운 Pod이 추가될 수 있음
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web-container
image: nginx:latest # 새로운 버전으로 업데이트됨
📌 적용 후 예상 결과 값
1. Deployment 업데이트 진행 상태 확인
kubectl rollout status deployment/web-app
💡 예상 출력 값
deployment "web-app" successfully rolled out
2. 업데이트 과정 중 Pod 상태 확인
kubectl get pods -l app=web-app
💡 예상 출력 값 (업데이트 중)
NAME READY STATUS RESTARTS AGE
web-app-76d7f8bcf5-abc12 1/1 Running 0 5s
web-app-76d7f8bcf5-xyz34 1/1 Running 0 5s
web-app-76d7f8bcf5-qwe56 0/1 Terminating 0 30s
✅ 업데이트 중에도 최소 2개의 Pod이 유지되면서 서비스 중단 없이 배포가 진행됨
3️⃣ kubectl 명령어를 활용하여 업데이트 진행 상황 및 PDB 적용 상태 확인
❓ 문제 상황
운영팀에서 PDB가 제대로 적용되었는지, 롤링 업데이트 중에 최소한의 Pod이 유지되고 있는지 확인해야 합니다.
kubectl 명령어를 활용하여 현재 배포 상태 및 PDB 적용 여부를 검증해야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. kubectl get pdb 명령어를 사용하여 PDB가 정상적으로 적용되었는지 확인합니다.
2. kubectl describe pdb 명령어를 사용하여 PDB 정책이 올바르게 설정되었는지 점검합니다.
✅ PDB 상태 확인 명령어
🔹 현재 PDB 상태 확인
kubectl get pdb
💡 예상 출력 값
NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE
web-app-pdb 2 N/A 1 10m
🔹 PDB 상세 정보 확인
kubectl describe pdb web-app-pdb
💡 예상 출력 값
Name: web-app-pdb
Namespace: default
Min available: 2
Selector: app=web-app
Allowed disruptions: 1
Age: 10m
✅ PDB가 적용되어 있으며, 롤링 업데이트 중에도 최소한의 Pod 가용성을 유지하고 있음