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를 활용하는 것이 좋음
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
📌 [ReplicaSet 심화편 #6] ReplicaSet과 Cluster Autoscaler: 노드 자동 확장과 리소스 최적화 (0) | 2025.03.12 |
---|---|
📌 [ReplicaSet 심화편 #5] ReplicaSet과 RollingUpdate 전략을 활용한 배포 관리 (0) | 2025.03.12 |
📌 [ReplicaSet 심화편 #3] ReplicaSet과 HorizontalPodAutoscaler(HPA)를 활용한 자동 확장 (0) | 2025.03.12 |
📌 [ReplicaSet 심화편 #2] ReplicaSet의 동작 원리와 트러블슈팅 (0) | 2025.03.12 |
📌 [ReplicaSet 심화편 #1] ReplicaSet의 역할과 활용 방법 (0) | 2025.03.12 |