Kubernetes/Kubernetes Best Practices

[Scenario Playbook - 심화편 | Medium Level #2] Pod Disruption Budget(PDB)를 활용한 안정적인 롤링 업데이트

ygtoken 2025. 3. 16. 18:55
728x90

 

쿠버네티스에서 롤링 업데이트 중 발생하는 서비스 중단을 최소화하는 것이 중요합니다.

특히, 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 가용성을 유지하고 있음

 

728x90