ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • StatefulSet + headless service 조합의 사용
    Kubernetes 2025. 3. 23. 21:04
    728x90

    StatefulSet + headless service 조합은 Kubernetes에서 PostgreSQL처럼 상태(stateful)를 가진 애플리케이션을 배포하고, 노드 간 안정적인 네트워크 ID를 제공하는 핵심 메커니즘입니다.

    특히, PostgreSQL의 클러스터링 구성이나 장애조치(failover) 시 이 구조가 중요한 역할을 해요.

     

    ✅ 1. Headless Service란?

    apiVersion: v1
    kind: Service
    metadata:
      name: postgres
    spec:
      clusterIP: None  # 👈 headless로 만듦
      selector:
        app: postgres
      ports:
        - port: 5432

     

    📌 핵심 특징:

    항목 설명
    clusterIP: None Cluster IP가 없음 → DNS 이름을 통해 개별 Pod의 IP 직접 조회 가능
    목적 StatefulSet 각 Pod에 고정된 DNS 주소 제공
    예시 DNS 주소 postgres-0.postgres.default.svc.cluster.local

     

    ✅ 2. StatefulSet 구성 시 headless 서비스는 어떻게 쓰이나?

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: postgres
    spec:
      serviceName: postgres  # 👈 이 이름과 Headless Service가 매칭돼야 함
      replicas: 3
      selector:
        matchLabels:
          app: postgres
      template:
        metadata:
          labels:
            app: postgres
        spec:
          containers:
            - name: postgres
              image: postgres:15

     

    DNS 이름 자동 구성:

    Pod 이름DNS 이름
    postgres-0 postgres-0.postgres.default.svc.cluster.local
    postgres-1 postgres-1.postgres.default.svc.cluster.local
    postgres-2 postgres-2.postgres.default.svc.cluster.local

    ➡️ 각 Pod에 고정된 hostname이 DNS를 통해 접근 가능

    이걸 통해 PostgreSQL 클러스터 내부에서 노드 간 통신을 안정적으로 할 수 있어요.

     

     

    ✅ 3. PostgreSQL 클러스터에서의 역할 (failover 포함)

    PostgreSQL을 StatefulSet으로 구성할 때 보통 고가용성(HA)을 위해 아래 구성 중 하나를 사용합니다:

    구성 설명
    Patroni leader election + automatic failover
    Stolon keeper/sentinel/proxy 구조의 자동 failover
    Repmgr primary-standby 감시 및 manual/automatic failover
    CrunchyData Operator production-grade operator, streaming replication 포함

     

    이때 headless service는 다음과 같은 역할을 합니다:

    🔁 Pod 간 replication 통신:

    • Standby가 primary에게 연결할 때:
      psql -h postgres-0.postgres.default.svc.cluster.local

    🔁 Failover 감시 및 리더 선출:

    • Operator 또는 sidecar(Patroni 등)가 DNS를 통해 각 노드의 상태를 체크
    • 리더 변경 시, Service 또는 ConfigMap을 업데이트

    🔁 앱이 항상 리더를 찾을 수 있도록 하기:

    • 일반 서비스(예: postgres-leader)는 리더 Pod를 가리킴 → 앱은 이걸 사용
    • 내부적으로는 postgres-1.postgres.default.svc.cluster.local으로 바인딩됨

    💥 예시: Patroni 사용 시 구성

    • StatefulSet + headless service + leader service
    • 애플리케이션은 항상 postgres-leader.default.svc를 사용
    • 내부적으로 leader service가 현재 리더 Pod를 선택적으로 가리킴
    • 리더가 죽으면 Patroni가 새로운 리더를 선출하고 leader service selector를 수정

    ✅ 요약

    항목설명
    Headless Service StatefulSet의 각 Pod에 DNS 이름을 부여해 직접 접근 가능하게 함
    사용 목적 Pod 간 연결, 고정된 주소 제공, 클러스터 통신 지원
    Failover 시 활용 리더 선출/복구 후 앱이 새로운 리더에 접근하도록 지원
    연동 도구 Patroni, Stolon, CrunchyData, Repmgr 등
    예시 DNS postgres-0.postgres.default.svc.cluster.local

     

     

    728x90
Designed by Tistory.