Kubernetes/Kubernetes Advanced

📌 [ReplicaSet 심화편 #4] ReplicaSet과 PodDisruptionBudget(PDB)을 활용한 안정적인 운영

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

 

1️⃣ 개요

 

쿠버네티스에서 ReplicaSet은 Pod의 개수를 유지하는 역할을 합니다. 하지만 운영 환경에서는 노드 업데이트, 유지보수, 장애 발생 등으로 인해 Pod가 예기치 않게 종료될 수 있습니다.

 

이때 모든 Pod가 동시에 종료되지 않도록 보호하는 메커니즘이 필요하며, 이를 위해 **PodDisruptionBudget(PDB)**을 활용할 수 있습니다.

이번 글에서는 ReplicaSet과 PDB를 함께 사용하여 안정적인 서비스를 운영하는 방법을 설명하겠습니다.

 


2️⃣ PodDisruptionBudget(PDB) 개념

 

PDB는 특정 서비스의 Pod 개수가 일정 개수 이하로 줄어들지 않도록 보호하는 기능입니다.

예를 들어, 데이터베이스 애플리케이션처럼 항상 2개 이상의 Pod가 유지되어야 하는 경우, PDB를 활용하면 불필요한 Pod 종료를 방지할 수 있습니다.

 

📌 PDB의 주요 기능 

기능 설명
Pod 유지 보호 운영 중인 Pod의 최소 개수를 보장
Rolling Update 안정성 제공 배포 과정에서 너무 많은 Pod가 삭제되지 않도록 제한
노드 유지보수 중 서비스 지속성 보장 노드가 재시작될 때 최소한의 Pod가 유지되도록 설정

PDB는 ReplicaSet, Deployment, StatefulSet과 함께 사용할 수 있습니다.

 


3️⃣ ReplicaSet과 PDB의 연계 동작 방식


✅ PDB의 기본 원리

 

1) 쿠버네티스가 특정 노드를 종료하려고 할 때, PDB가 설정된 Pod를 확인

2) PDB 기준을 초과하는 경우만 Pod를 삭제하고, 최소 개수 이하로 내려가지 않도록 보호

3) 운영 중인 Pod의 개수를 유지하면서 노드 유지보수 또는 업데이트를 수행할 수 있도록 보장

 

📌 ReplicaSet과 PDB를 함께 사용하는 이유

ReplicaSet은 Pod 개수를 유지하지만, 동시에 삭제되는 Pod의 개수를 제한하지 않음

PDB를 사용하면 최소한의 Pod 개수를 보장하면서 안전한 업데이트가 가능

 


4️⃣ PodDisruptionBudget 설정 방법

 

✅ 1. 최소 Pod 개수 보장 (minAvailable)

 

PDB는 서비스에 영향을 주지 않도록 최소한 몇 개의 Pod를 유지할 것인지 설정할 수 있습니다.

 

📌 예제: 최소 2개 이상의 Pod 유지

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: my-app-pdb
spec:
  minAvailable: 2  # 최소 2개의 Pod 유지
  selector:
    matchLabels:
      app: my-app

2개 이상의 Pod가 유지되어야 하므로, 동시에 2개 이상의 Pod를 종료할 수 없음.

 


✅ 2. 최대 종료 가능 Pod 개수 (maxUnavailable)

 

maxUnavailable을 설정하면 한 번에 최대 몇 개의 Pod가 종료될 수 있는지 지정할 수 있습니다.

 

📌 예제: 한 번에 최대 1개 Pod만 삭제 가능

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: my-app-pdb
spec:
  maxUnavailable: 1  # 최대 1개의 Pod만 종료 가능
  selector:
    matchLabels:
      app: my-app

이 설정을 적용하면, 특정 노드가 종료되더라도 최대 1개 이상의 Pod는 항상 유지됩니다.

 


5️⃣ ReplicaSet + PDB 실전 적용 방법

 

📌 1. ReplicaSet 배포

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: my-replicaset
spec:
  replicas: 5  # 5개의 Pod 유지
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: nginx

 

📌 2. PDB 적용

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: my-app-pdb
spec:
  minAvailable: 3  # 최소 3개 유지
  selector:
    matchLabels:
      app: my-app

📌 3. PDB 상태 확인

kubectl get poddisruptionbudget

📌 4. 특정 노드에서 Pod 강제 종료 시도

kubectl drain <node-name> --ignore-daemonsets

PDB가 적용된 경우, 최소 3개의 Pod가 유지되지 않으면 해당 노드의 Pod를 삭제할 수 없습니다.

 


6️⃣ PDB 활용 시 고려해야 할 점

 

✅ 1. minAvailable과 maxUnavailable 값의 조정이 중요

너무 낮게 설정하면 효과가 없음 → 운영 중인 Pod가 모두 삭제될 가능성 증가

너무 높게 설정하면 배포/업데이트가 어려움 → 새로운 버전으로 롤링 업데이트할 때 일부 Pod가 삭제되지 않음

 

📌 적절한 설정 예제

minAvailable: 2  # 최소 2개 유지
maxUnavailable: 1  # 동시에 1개만 삭제 가능

 

✅ 2. PodDisruptionBudget은 강제적인 Pod 종료에는 적용되지 않음

PDB는 kubectl delete pod 또는 노드 장애로 인한 Pod 종료를 막을 수 없음

운영자가 kubectl delete pod를 실행하면 Pod는 삭제됨

 

📌 강제적인 Pod 삭제 방지 방법

PriorityClass를 활용하여 중요한 Pod의 우선순위를 높임

Pod 삭제를 방지하려면 kubectl delete pod 실행 전에 PDB 정책을 확인

kubectl describe poddisruptionbudget my-app-pdb

 

✅ 3. PDB는 DaemonSet에는 적용되지 않음

PDB는 일반적인 Pod(ReplicaSet, Deployment, StatefulSet)에 적용 가능하지만, DaemonSet에는 적용되지 않음

DaemonSet은 특정 노드에서 반드시 실행되어야 하므로 PDB 보호 대상이 아님

 

DaemonSet을 운영할 때는 PDB 대신 Pod Priority를 활용하여 중요도를 설정하는 것이 일반적입니다.

 


🔥 7️⃣ 결론

 

ReplicaSet은 Pod 개수를 유지하지만, 특정 조건에서 모든 Pod가 한꺼번에 삭제될 위험이 있음

PodDisruptionBudget(PDB)을 활용하면 최소한의 Pod 개수를 보장하여 서비스의 안정성을 높일 수 있음

minAvailable 또는 maxUnavailable 값을 적절히 설정하여 안정적인 Pod 운영이 가능함

운영 환경에서는 PDB와 함께 Rolling Update를 설정하여 서비스 지속성을 유지하는 것이 중요함

DaemonSet에는 PDB가 적용되지 않으며, 필요 시 PriorityClass를 활용하는 것이 좋음

728x90