ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kubernetes] Pod - PodDisruptionBudget (PDB)
    공부/데이터 2025. 2. 2. 00:37

    PodDisruptionBudget(PDB)은 Kubernetes에서 고가용성 애플리케이션을 구축하기 위한 핵심 요소 중 하나입니다. PDB는 애플리케이션의 파드가 중단되는 상황을 관리하고 최소한의 가용성을 보장하는 역할을 합니다.

    자발적 중단 (Voluntary Disruption), 비자발적 중단 (Involuntary Disruption)

    자발적 중단 (Voluntary Disruption)

    자발적 중단은 클러스터 관리자 또는 애플리케이션 소유자가 계획적으로 수행하는 파드 중단을 의미합니다.

    특징으론 사전에 계획된 작업으로 인해 발생합니다. 또한 클러스터 관리자가 중단 시점을 제어할 수 있고 파드가 정상적으로 종료될 수 있도록 유예 기간(grace period)을 설정할 수 있습니다.

    다음은 자발적 중단의 예시입니다.

    • 노드 유지보수: 클러스터 관리자가 노드 업그레이드 또는 유지보수를 위해 노드를 드레인(drain)하는 경우
    • 애플리케이션 업데이트: 새로운 버전의 애플리케이션을 배포하기 위해 기존 파드를 삭제하는 경우
    • 스케일 다운: 애플리케이션의 트래픽 감소로 인해 파드 수를 줄이는 경우
    • 파드 삭제: 애플리케이션 소유자가 특정 파드를 수동으로 삭제하는 경우

    비자발적 중단 (Involuntary Disruption)

    비자발적 중단은 예기치 않은 시스템 오류 또는 장애로 인해 발생하는 파드 중단을 의미합니다.

    특징으론 예측하기 어려운 상황에서 발생합니다. 또한 클러스터 관리자가 중단 시점을 제어할 수 없고 파드가 즉시 종료되므로 정상 종료를 위한 유예 기간을 설정할 수 없습니다.

    다음은 비자발적 중단의 예시입니다.

    • 노드 장애: 노드 하드웨어 고장, 운영체제 오류 등으로 인해 노드가 다운되는 경우
    • 커널 패닉: 노드 커널에 문제가 발생하여 시스템이 멈추는 경우
    • 클러스터 네트워크 오류: 클러스터 네트워크 단절로 인해 Pod가 통신할 수 없게 되는 경우
    • 메모리 부족: 노드의 메모리 자원 부족으로 인해 Pod가 강제로 종료되는 경우

    PDB가 필요한 이유

    Kubernetes 클러스터 관리자는 클러스터 유지보수, 업그레이드, 자동 크기 조정 등의 작업을 수행해야 합니다. 이러한 작업은 필연적으로 파드의 중단을 동반할 수 있습니다. 하지만 중단 없이 지속적으로 서비스를 제공해야 하는 애플리케이션의 경우, 파드 중단은 심각한 장애로 이어질 수 있습니다.

    PDB는 이러한 문제를 해결하기 위해 자발적인 파드 중단을 관리합니다. 여기서 자발적인 중단은 클러스터 관리자가 계획적으로 수행하는 작업을 의미합니다. 예를 들어, 노드 유지보수를 위해 노드를 drain하거나 애플리케이션을 업그레이드하기 위해 파드을 삭제하는 경우가 해당됩니다.

    PDB의 작동 방식

    PDB는 다음과 같은 방식으로 작동합니다.

    1. PDB 정의: 애플리케이션 소유자는 애플리케이션의 가용성을 보장하기 위한 PDB를 정의합니다. PDB에는 최소 가용 파드 수 또는 최대 중단 가능 파드 수를 지정합니다.
    2. Pod 중단 시 제약: 클러스터 관리자가 Pod를 중단시키려고 할 때 Kubernetes는 PDB를 확인하여 중단 가능한 파드 수가 PDB에 정의된 제약 조건을 충족하는지 확인합니다.
    3. 제약 조건 준수: Kubernetes는 PDB에 정의된 제약 조건을 준수하는 범위 내에서만 파드 중단을 허용합니다. 이를 통해 애플리케이션의 최소 가용성을 보장합니다.

    예시

    apiVersion: policy/v1
    kind: PodDisruptionBudget
    metadata:
      name: my-app-pdb
    spec:
      minAvailable: 2 # 최소 2개의 Pod가 항상 실행 중이어야 함
      selector:
        matchLabels:
          app: my-app

    위 PDB는 app: my-app 레이블을 가진 Pod의 최소 가용 개수를 2개로 설정합니다. 즉, 클러스터 관리자가 파드를 중단시키려고 할 때 app: my-app 레이블을 가진 파드가 2개 미만으로 남는 경우에는 파드 중단이 허용되지 않습니다.

    레퍼런스

    https://kubernetes.io/docs/concepts/workloads/pods/disruptions/

    댓글