-
StatefulSet + headless service 조합의 사용Kubernetes 2025. 3. 23. 21:04728x90
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'Kubernetes' 카테고리의 다른 글
calico vs cilium (0) 2025.03.25 Kubernetes Network 구성 (0) 2025.03.25 Kubernetes Operator의 RequeueAfter 개념 (0) 2025.03.22 Kubernetes의 동작 철학 중 하나인 Level-Triggered 방식의 개념 (0) 2025.03.22 K8S Operator의 Custom Resource 상태 정보를 외부 DB나 외부 API 호출을 통해서 업데이트 해야하는 경우 (0) 2025.03.22 - Standby가 primary에게 연결할 때: