TIL

11. Disruptions

TL;DR

1. Voluntary vs Involuntary Disruption

구분 정의 대표 예시
Voluntary 운영자·시스템 컴포넌트가 의도적으로 종료 kubectl drain, 노드 업그레이드, Cluster Autoscaler scale-down, Deployment rollout
Involuntary 의도하지 않은 사고로 종료 하드웨어 장애, 커널 패닉, 노드 네트워크 단절, 노드 OOM으로 인한 강제 종료, kubelet 비정상 종료

2. Voluntary Disruption이 일어나는 시나리오

3. Eviction API의 동작

4. PodDisruptionBudget

4-1. spec

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: my-app-pdb
spec:
  selector:
    matchLabels:
      app: my-app
  minAvailable: 2          # 또는 maxUnavailable 중 택1

4-2. 동작 메커니즘

4-3. 안티패턴 — replicas=1 + minAvailable=1

4-4. unhealthyPodEvictionPolicy

동작 사용 시점
IfHealthyBudget (기본) ready인 pod도 PDB budget 안에서만 evict. unhealthy pod라도 PDB를 위반하면 막힘 안정성 우선. 정상 pod를 갑자기 빼앗기지 않음
AlwaysAllow unhealthy(non-ready) pod는 PDB와 무관하게 항상 evict 허용 죽은 pod 때문에 drain이 멈추는 상황 해소

5. PDB가 막을 수 없는 것

6. Deployment의 maxUnavailable vs PDB의 maxUnavailable

구분 Deployment maxUnavailable PDB maxUnavailable
적용 시점 rollout 진행 중 모든 voluntary disruption 시점
누가 사용 Deployment Controller가 새 ReplicaSet으로 교체할 때 Eviction API가 evict 허용 여부 판단할 때
보호 대상 rollout 진행 속도 노드 drain·오토스케일 등 외부 evict
단독으로 막는가 rollout 외에는 무력 rollout 자체에는 적용되지 않음 (rollout은 PDB 우회)

7. 무중단 운영 종합 체크리스트

  1. replicas ≥ 2 (또는 HPA minReplicas ≥ 2)
    • 단일 pod로는 어떤 메커니즘으로도 무중단 불가능
  2. Deployment strategymaxSurge ≥ 1, maxUnavailable: 0
    • rollout 중 사용 가능 수가 떨어지지 않음
  3. PDBminAvailable 또는 maxUnavailable을 desired보다 작게 설정
    • replicas=3 → minAvailable: 2 또는 maxUnavailable: 1
  4. readinessProbe 정확성
    • “단순 startup ≠ 트래픽 처리 가능”. 의존 자원 연결까지 끝났을 때 ready를 반환해야 의미가 있음
  5. preStop hook + terminationGracePeriodSeconds
  6. PodAntiAffinity (선택)
    • 같은 노드에 모든 replica가 몰리면 노드 한 대 사고로 동시 종료
    • 호스트 단위로 분산하면 involuntary disruption 영향도 함께 완화

8. 빠르게 점검하기