설명
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와 일치하는 라벨이 필요합니다.