Deployment PodDisruptionBudget 구성 점검

유지보수 중 허용할 자발적 파드 중단 수를 서비스 요구에 맞게 정하세요.

설명

Deployment의 여러 파드가 노드 드레인 등 자발적 축출로 동시에 중단되면 복제본이 있어도 가용성이 떨어질 수 있습니다. PodDisruptionBudget(PDB)은 Eviction API를 사용하는 작업에 허용 중단 기준을 제공합니다.

PDB는 노드 장애나 직접 파드 삭제를 막지 않으며 Deployment 롤링 업데이트도 제한하지 않습니다. 업데이트 전략과 장애 분산은 별도로 구성해야 합니다.

잠재적 영향

  • 유지보수 중 가용 복제본이 부족해 응답이 지연되거나 서비스가 중단될 수 있습니다.
  • 과도한 제한은 노드 드레인이나 유지보수를 막을 수 있습니다.

해결 방법

  • 같은 네임스페이스에서 실제 Deployment 파드를 선택하는 PDB를 정의하고 max_unavailable 또는 min_available 중 하나를 가용성 요구에 맞게 설정하세요.
  • readiness, 복제본 수와 교체 용량을 확인하고 드레인을 시험하세요. Deployment의 롤링 업데이트와 파드 분산 정책도 별도로 검토하세요.

예시

파드 template 등은 생략한 기존 발췌입니다. 현재 API에는 kubernetes_pod_disruption_budget_v1을 사용하세요. 세 레플리카에서 max_unavailable 20%는 올림되어 한 파드의 중단을 허용합니다.

변경 전

hcl
resource "kubernetes_deployment" "example" {
  metadata {
    name = "terraform-example"
    labels = {
      k8s-app = "prometheus"
    }
  }

  spec {
    replicas = 3
  }
}

변경 후

hcl
resource "kubernetes_deployment" "example" {
  metadata {
    name = "terraform-example"
    labels = {
      k8s-app = "prometheus"
    }
  }

  spec {
    replicas = 3

    selector {
      match_labels = {
        k8s-app = "prometheus"
      }
    }
  }
}

resource "kubernetes_pod_disruption_budget" "example" {
  metadata {
    name = "demo"
  }

  spec {
    max_unavailable = "20%"

    selector {
      match_labels = {
        k8s-app = "prometheus"
      }
    }
  }
}

설명:

  • 변경 전: 복제본 세 개를 지정하며 PDB는 없습니다. 자발적 축출의 허용 범위를 검토해야 합니다.
  • 변경 후: 실제 파드 라벨이 일치할 때 PDB가 적용됩니다. 모든 장애나 직접 삭제로부터 최소 가용성을 보장하는 것은 아닙니다.

참조