쿠버네티스에서 Headless Servicee 는 일반적인 서비스와는 달리 가상 IP 를 생성하지 않고, 파드의 IP를 직접 노출하는 서비스 유형입니다.
클라이언트는 서비스 이름을 DNS 조회하면 파드의 IP 목록을 직접 받게 됩니다.
주요 특징
- 로드 밸런싱 없음
- 일반 서비스는 쿠버네티스가 자동으로 로드 밸런싱을 처리하지만, 헤드리스 서비스는 클라이언트가 직접 분산 처리(ex. Round Robin)을 구현해야 합니다.
- 보통 Statefulset 를 Headless Service로 설정합니다.
- StatefulSet은 각 파드에 고유한 정적 DNS 이름을 제공하는데, 이를 통해 클라이언트는 특정 파드에 접근하거나 순서를 지정하여 통신 가능합니다. (예: pod-0.my-headless-service.default.svc.cluster.local).
- 헤드리스 서비스는 DNS를 통해 파드의 IP를 반환하는 역할만 수행하며, 포트에 대한 제어는 컨테이너의 설정에 의존
yaml 예시
apiVersion: v1
kind: Service
metadata:
name: my-headless-service
namespace: default
spec:
clusterIP: None # 헤드리스 서비스로 설정
selector:
app: my-app
ports:
- name: http
port: 80
targetPort: 80
헤드리스 서비스와 일반 서비스 비교
일반 서비스 (ClusterIP)헤드리스 서비스 (Headless)
구분 | ClusterIP | Headless Service |
ClusterIP | 제공 | 제공하지 않음 (None) |
DNS 반환 값 | ClusterIP 하나 | 파드 IP 목록 |
로드 밸런싱 | Kubernetes에서 자동 처리 | 클라이언트가 직접 구현 |
사용 사례 | HTTP 서비스, 무상태 애플리케이션 | 데이터베이스, 분산 시스템, StatefulSet |
장점 | 사용이 간편, 기본 로드 밸런싱 제공 | 파드와 직접 통신 가능, 유연성 제공 |
단점 | 특정 파드 접근 어려움 | 클라이언트 구현 부담 |
Headless Service DNS 동작
헤드리스 서비스는 clusterIP: None으로 설정되며, 클라이언트가 DNS를 통해 파드의 IP 목록을 직접 받습니다.
- DNS 반환:
- 헤드리스 서비스는 my-headless-service.namespace.svc.cluster.local로 DNS 요청이 들어오면 연결된 파드들의 IP 주소를 반환합니다.
- 이 경우, 클라이언트는 반환된 파드 IP로 직접 연결을 시도합니다.
- 컨테이너가 LISTEN 상태인 포트에 직접 접근 가능:
- 클라이언트는 파드의 IP와 컨테이너에서 열려 있는 포트로 직접 연결합니다.
- 서비스 자체가 트래픽을 가로채거나 제어하지 않기 때문에, 컨테이너에서 LISTEN 중인 포트(8000, 10000 등)에 요청이 직접 도달할 수 있습니다.
ClusterIP 서비스에서의 동작
ClusterIP 서비스는 가상 IP를 생성하고, 이를 통해 클라이언트 요청을 라우팅합니다.
- 트래픽 제어:
- ClusterIP 서비스는 트래픽을 파드로 전달하기 전에 포트 매핑(port, targetPort)을 기준으로 요청을 필터링합니다.
- 서비스 정의에 명시되지 않은 포트에 대해서는 요청을 전달하지 않습니다.
- 포트 매핑 요구사항:
- ClusterIP 서비스에서 특정 포트로 접근하려면 서비스의 ports 필드에 해당 포트를 명시해야 합니다.
- 이 경우, targetPort는 컨테이너에서 열려 있는 포트를 지정해야 합니다.
ClusterIP 서비스는 트래픽 라우팅 과정에서 포트 매핑을 엄격히 적용합니다. 서비스에서 명시적으로 열려 있지 않은 포트로의 접근은 차단됩니다.
'K8S' 카테고리의 다른 글
Vector + Scalable Loki (1) | 2024.12.22 |
---|---|
쿠버네티스 내부에서는 어떻게 DNS 질의를 할까? (1) | 2024.10.10 |