Kubernetes/Kubernetes Advanced

📌 [DaemonSet 심화편 #8] DaemonSet과 PodDisruptionBudget(PDB): 노드 장애 시 서비스 가용성 유지 전략

ygtoken 2025. 3. 22. 19:33
728x90

1️⃣ 개요

DaemonSet은 노드마다 하나의 Pod를 실행하는 구조이기 때문에, 노드 재부팅이나 업데이트 등의 이벤트가 발생할 때 전체 서비스의 가용성에 영향을 줄 수 있습니다.
이때 **PodDisruptionBudget(PDB)**을 활용하면, 동시에 중단될 수 있는 Pod의 수를 제한하여 가용성을 유지할 수 있습니다.

이번 글에서는 DaemonSet과 PDB를 연동하여 안정적인 유지보수 및 노드 관리 전략을 구성하는 방법을 정리합니다.


2️⃣ PodDisruptionBudget(PDB)란?

 

항목 설명
PDB(PodDisruptionBudget) 계획된 중단(Drain, Eviction 등) 중에 최소한으로 살아 있어야 하는 Pod 수 또는 비율을 정의하는 리소스
대상 일반적으로 Deployment, StatefulSet, DaemonSet 등에 적용 가능
목적 유지보수나 노드 업데이트 시 서비스 중단을 방지하기 위해 사용

✅ PDB는 **강제 종료가 아닌 ‘계획된 중단’**에만 영향을 미칩니다. 장애로 인한 강제 삭제에는 작동하지 않습니다.


3️⃣ DaemonSet과 PDB의 관계

DaemonSet은 기본적으로 노드마다 하나의 Pod만 존재하기 때문에,
PDB를 사용할 경우 주의할 점이 있습니다:

  • DaemonSet Pod는 기본적으로 Eviction API의 대상이 아님 (수동으로 taint/drain 해야 적용됨)
  • 단, 특정 Pod만 강제로 중단되도록 유도할 경우 PDB를 활용할 수 있음

✅ 따라서 DaemonSet에 PDB를 적용하는 경우는 제한적이며, 조건부로 사용하거나 참고 용도로 활용할 수 있습니다.


4️⃣ 예제: DaemonSet에 PodDisruptionBudget 적용

✅ PDB 정의 예시 (최소 1개 Pod 유지)

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: ds-pdb
spec:
  minAvailable: 1                    # 최소 1개 이상의 Pod이 항상 Running 상태여야 함
  selector:
    matchLabels:
      app: node-exporter             # 대상 DaemonSet과 동일한 라벨

 

📌 설명

  • minAvailable을 설정하면 지정된 수 이상의 Pod이 항상 살아 있어야 하며,
    그렇지 않으면 해당 Pod에 대한 Eviction이 거부됩니다.
  • matchLabels는 DaemonSet과 동일한 라벨을 지정해야 정상 동작합니다.

✅ 예시 DaemonSet (node-exporter)

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
spec:
  selector:
    matchLabels:
      app: node-exporter
  template:
    metadata:
      labels:
        app: node-exporter
    spec:
      containers:
        - name: node-exporter
          image: prom/node-exporter:latest

 

📌 설명

  • 위 DaemonSet과 라벨이 일치하도록 PDB를 구성해야 적용됩니다.

5️⃣ PDB 동작 확인 방법

✅ 강제 노드 드레인 시 PDB 거부 확인

kubectl drain node-1 --ignore-daemonsets

 

📌 설명

  • DaemonSet은 기본적으로 --ignore-daemonsets 옵션이 있어 영향을 받지 않지만,
    이 옵션을 제거하고 Pod에 Eviction을 시도하면 PDB 조건에 따라 거부될 수 있습니다.

✅ Eviction 수동 테스트

kubectl evict pod node-exporter-abcde

 

📌 설명

  • 해당 Pod가 PDB 조건을 만족하지 못하면 Eviction이 거부됩니다.
  • 이를 통해 PDB 설정이 정상적으로 작동하는지 확인할 수 있습니다.

6️⃣ DaemonSet 운영 중 PDB 설정 시 고려사항

항목 설명
DaemonSet Pod는 drain 시 기본적으로 보호됨 --ignore-daemonsets 옵션이 default
PDB는 수동 Eviction이나 Custom Controller에 의한 중단 통제 시 유용 일반 drain에는 직접 영향 없음
minAvailable 또는 maxUnavailable 중 하나만 설정 가능 동시에 둘 다 설정하면 에러 발생
다수 노드에 DaemonSet이 배포된 경우에만 PDB 효과 발생 단일 노드만 있는 경우는 의미 없음

🔥 7️⃣ 결론

PodDisruptionBudget은 계획된 중단 작업 중 Pod 수를 제한하여 서비스 안정성을 유지할 수 있는 리소스입니다.
DaemonSet은 기본적으로 Eviction 대상이 아니지만, 수동 중단이나 커스텀 환경에서 PDB와 함께 사용할 수 있습니다.
라벨을 정확히 일치시켜야 PDB가 올바르게 적용됩니다.
소규모 노드 환경에서는 효과가 제한적일 수 있으므로 환경에 맞게 전략을 설계해야 합니다.

728x90