본문 바로가기
K8S

Headless Service

by HH_g 2024. 12. 8.

쿠버네티스에서 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