StatefulSet의 PodDisruptionBudget 설정 점검

계획된 유지보수 중 필요한 복제본 수를 유지하도록 중단 예산을 구성하세요.

설명

PodDisruptionBudget(PDB)은 노드 드레인처럼 Eviction API를 사용하는 자발적 중단을 제한합니다. StatefulSet의 가용성 요구에 맞는 예산이 없으면 유지보수 중 여러 복제본이 함께 중단될 수 있습니다. PDB는 직접 Pod 삭제, 노드 장애나 StatefulSet 자체의 롤링 업데이트를 막는 장치는 아닙니다.

잠재적 영향

  • 계획된 노드 작업 중 가용 복제본이 줄어 서비스나 정족수 유지에 영향을 줄 수 있습니다.
  • 너무 엄격한 예산이나 부족한 대체 용량 때문에 노드 드레인이 진행되지 않을 수 있습니다.

해결 방법

  • 같은 네임스페이스에서 실제 Pod 라벨과 일치하는 PDB 선택자를 구성하세요. 서비스 가용성이나 정족수에 맞게 minAvailable 또는 maxUnavailable 중 하나를 설정하세요.
  • Pod 준비 상태와 대체 배치 용량을 확인하고 드레인을 시험하세요. 장애 복구, 복제본 분산과 롤링 업데이트 정책은 별도로 구성하세요.

예시

기존 nginx StatefulSet에 PDB를 추가하는 비교입니다. nginx Headless Service 등 나머지 환경은 별도로 준비해야 합니다.

변경 전

yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: nginx
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.25

세 복제본을 정의하지만 이 발췌에는 PDB가 없습니다. 실제로 적용되는 다른 PDB가 있는지 확인해야 합니다.

변경 후

yaml
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: web-pdb
spec:
  maxUnavailable: 1
  selector:
    matchLabels:
      app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: nginx
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.25

app: nginx Pod에 maxUnavailable: 1을 적용합니다. 이미 사용할 수 없는 Pod도 예산에 반영되며, 예산이 허용할 때만 Eviction API를 통한 중단을 허용합니다.

참조