StatefulSet Headless Service 연결 점검

StatefulSet의 고정 네트워크 식별자에 사용할 Headless Service를 구성하세요.

설명

StatefulSet은 각 파드의 안정적인 네트워크 이름을 위해 spec.service_name으로 Headless Service를 참조합니다. 같은 네임스페이스의 Service에 cluster_ip = "None"을 설정하고 selector가 실제 파드 라벨과 맞도록 구성해야 합니다.

일반 Service나 잘못된 selector를 참조하면 StatefulSet의 고유한 DNS 이름과 피어 검색이 기대대로 동작하지 않을 수 있습니다.

잠재적 영향

  • 파드의 고정 DNS 이름으로 피어에 연결하지 못할 수 있습니다.
  • 재시작이나 스케일링 중 서비스 검색이 불안정해져 상태 저장 애플리케이션의 복구가 어려워질 수 있습니다.

해결 방법

  • StatefulSet의 service_name이 같은 네임스페이스의 Headless Service를 가리키도록 구성하고 Service의 cluster_ip를 "None"으로 지정하세요.
  • Service selector와 실제 파드 라벨, 포트와 DNS 응답을 확인하세요. Service는 별도로 생성해야 합니다.

예시

Service와 StatefulSet 연결 부분만 보여 주며 필수 파드 template과 서비스 포트 등은 생략했습니다. 변경 전은 cluster_ip를 생략해 일반 ClusterIP 할당을 사용하고, 변경 후는 Headless Service를 지정합니다.

변경 전

hcl
resource "kubernetes_service" "example" {
  metadata {
    name      = "prometheus"
    namespace = "monitoring"
  }

  spec {
    selector = {
      app = "prometheus"
    }
  }
}

resource "kubernetes_stateful_set" "example" {
  metadata {
    name      = "prometheus"
    namespace = "monitoring"
  }

  spec {
    service_name = "prometheus"

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

변경 후

hcl
resource "kubernetes_service" "example" {
  metadata {
    name      = "prometheus"
    namespace = "monitoring"
  }

  spec {
    cluster_ip = "None"

    selector = {
      app = "prometheus"
    }
  }
}

resource "kubernetes_stateful_set" "example" {
  metadata {
    name      = "prometheus"
    namespace = "monitoring"
  }

  spec {
    service_name = "prometheus"

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

설명:

  • 변경 전: 일반 ClusterIP Service를 참조합니다. Headless Service 구성이 아닙니다.
  • 변경 후: cluster_ip를 None으로 지정합니다. 생략된 파드 template에도 selector와 일치하는 라벨이 필요합니다.

참조