StatefulSet의 Headless Service 연결 점검

serviceName과 실제 Headless Service, Pod 선택자가 일치하는지 확인하세요.

설명

StatefulSet은 serviceName으로 지정한 Headless Service를 사용해 Pod별 안정적인 네트워크 이름을 제공합니다. 해당 Service는 같은 네임스페이스에 별도로 생성해야 하며, 선택자는 StatefulSet Pod의 라벨과 일치해야 합니다. 이름만 지정해도 Service가 자동으로 생성되거나 DNS와 연결이 보장되는 것은 아닙니다.

잠재적 영향

  • Pod별 이름 확인이나 구성원 간 통신이 실패할 수 있습니다.
  • Service 선택자가 다른 Pod를 가리키면 의도한 워크로드의 연결에 장애가 생길 수 있습니다.

해결 방법

  • 같은 네임스페이스에 clusterIP: None인 Headless Service를 준비하고, serviceName을 그 이름에 맞추세요. 선택자, Pod 라벨과 실제 수신 포트도 확인하세요.
  • 기존 일반 Service를 Headless로 바꾸려면 재생성과 연결 중단 영향을 계획하세요. 적용 후 EndpointSlice, Pod 준비 상태와 Pod별 DNS 및 실제 연결을 확인하세요.

예시

app 네임스페이스의 기존 nginx 예시입니다. 네임스페이스는 별도로 준비해야 하며 10.0.0.20은 클러스터의 서비스 주소 범위에 속한 사용 가능한 주소여야 합니다. 일반 Service에서 Headless로 전환할 때는 Service 재생성이 필요할 수 있습니다.

변경 전

yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: app
spec:
  clusterIP: 10.0.0.20
  selector:
    app: other
  ports:
    - port: 80
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
  namespace: app
spec:
  serviceName: nginx
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.25

일반 ClusterIP Service의 선택자가 StatefulSet Pod 라벨과도 다릅니다. 이 구성은 필요한 Pod별 Headless Service 연결을 제공하지 않습니다.

변경 후

yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: app
spec:
  clusterIP: None
  selector:
    app: nginx
  ports:
    - port: 80
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
  namespace: app
spec:
  serviceName: nginx
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.25

같은 nginx Service 이름을 Headless로 구성하고 선택자를 Pod 라벨에 맞춥니다. 실제 DNS와 연결은 준비 상태와 클러스터 네트워크에 따라 확인해야 합니다.

참조