Search

PodDisruptionBudget

PodDisruptionBudget(PDB)는 Kubernetes에서 애플리케이션의 가용성을 보장하기 위해 사용되는 리소스다. PDB는 클러스터에서 계획된 중단(예: 노드 업그레이드, 스케일링 등) 동안 특정 수의 파드가 항상 실행되도록 보장한다. 이를 통해 애플리케이션의 가용성을 유지하고, 서비스 중단을 최소화할 수 있다.

pod 중단

Pod의 개수는 replica 수 만큼을 항상 유지하도록 되어있다.
Pod의 수가 replica 수를 유지 못하고 줄어드는 경우가 있는데,
자발적 중단(Voluntary disruptions)
비자발적 중단(InVoluntary disruptions)
1.
자발적 중단의 예
관리자가 pod를 관리하는 배포 또는 컨트롤러 삭제 및 pod 직접 삭제
배포의 포드 템플릿 업데이트로 인한 재시작
수리 또는 업그레이드를 위해 노드를 drain할 때
2.
비자발적 중단의 예
노드를 지원하는 물리적 시스템의 하드웨어 오류
클러스터 관리자가 실수로 VM을 삭제
클러스터 네트워크 분할로 노드가 사라졌을 때
노드의 리소스 부족
커널 패닉

PDB 동작 원리

PDB는 자발적 중단으로 인해 동시에 다운되는 복제된 애플리케이션의 포드 수를 제한한다.
어플리케이션에서는 로드를 처리하는 복제본 수가 전체의 특정 비율 미만으로 떨어지지 않도록 할 수 있다.
deployment에서도 replicas를 통해 pod를 유지하지 않습니까?
→ 여기서 PDB를 사용해야 하는 이유를 찾을 수 있었다.
사전에 Deployment의 replicas 값을 2로 둔 상황
노드 3개가 존재하고, pod는 app-1,2 2개가 돌아가고 있습니다.
클러스터 관리자가 node-1을 업그레이드하기 위해 drain작업을 시작합니다.
따라서 app-1은 다른 노드 즉, node-3으로 할당됩니다. 새로 생성되기 때문에 app-3으로 생성되었습니다. 아직 옮겨가고 있는 중이기 때문에 pending상태입니다.
하지만 여기서, app-3이 생성되기 전에 node-2를 또다시 drain하게 된다면 …
이 순간, 결국 동작하게 되는 pod가 존재하지 않습니다.
# minAvailable 사용 apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: nginx-pdb spec: minAvailable: 2 selector: matchLabels: app: nginx
YAML
복사
# maxAvailable 사용 apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: nginx-pdb spec: maxAvailable: 1 selector: matchLabels: app: nginx
YAML
복사
app=nginx인 라벨을 갖는 pod들에 대한 PDB
nginx1.yaml
apiVersion: apps/v1 kind: Deployment metadata: labels: app: wlstmd name: wlstmd-nginx1 spec: replicas: 1 selector: matchLabels: app: wlstmd template: metadata: labels: app: wlstmd spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: key operator: In values: - worker1 containers: - image: nginx name: nginx ports: - containerPort: 80
YAML
복사
nginx2.yaml
apiVersion: apps/v1 kind: Deployment metadata: labels: app: wlstmd name: wlstmd-nginx2 spec: replicas: 2 selector: matchLabels: app: wlstmd template: metadata: labels: app: wlstmd spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: key operator: In values: - worker2 containers: - image: nginx name: nginx ports: - containerPort: 80
YAML
복사
pdb.yaml
apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: wlstmd-pdb spec: minAvailable: 2 selector: matchLabels: app: wlstmd
YAML
복사