Kubernetes

Kubernetes Headless Service

DevelopC 2023. 3. 21. 13:36
728x90

Kubernetes Headless Service

Kubernetes Headless Service는 클러스터 내의 동일한 작업 집합의 파드에 대한 서비스 디스커버리를 제공하는 데 사용되는 특별한 종류의 Kubernetes 서비스입니다. 기본 Kubernetes 서비스와는 다르게, kubernetes headless service는 로드 밸런싱을 위한 클러스터 IP를 제공하지 않습니다. 대신, 헤드리스 서비스는 각 파드에 대해 고유한 네트워크 주소를 제공하고, 이를 통해 클라이언트가 직접 파드와 통신할 수 있습니다.

 

1. statefulset: 헤드리스 서비스는 stateful 애플리케이션에 적합하며, 각 파드가 고유한 데이터를 저장하거나 처리해야 하는 경우에 유용합니다. 예를 들어, 분산 데이터베이스 클러스터는 헤드리스 서비스를 사용하여 각 노드와 통신할 수 있습니다.

2. 클라이언트가 특정 파드와 직접 통신해야 하는 경우: kubernetes headless service를 사용하면, 클라이언트가 특정 파드에 직접 연결되므로 로드 밸런싱이 필요하지 않은 시나리오에 적합합니다.

 

헤드리스 서비스를 생성하려면, Kubernetes 서비스 매니페스트에 spec.clusterIP: None 속성을 추가하여 클러스터 IP 할당을 비활성화해야 합니다. 이렇게 하면, 서비스가 헤드리스 모드로 작동하며, 파드에 직접 접근할 수 있는 DNS 엔트리가 생성됩니다.

# kubernetes headless service
apiVersion: v1
kind: Service
metadata:
  name: headless
  namespace: default
spec:
  type: ClusterIP
  clusterIP: None
  ports:
  - name: tcp
    port: 8080
    protocol: TCP
    targetPort: tcp
  selector:
    app.kubernetes.io/instance: app1
    app.kubernetes.io/name: app1
---
# kubernetes service
apiVersion: v1
kind: Service
metadata:
  name: app1
  namespace: default
spec:
  type: ClusterIP
  ports:
  - name: tcp
    port: 8080
    protocol: TCP
    targetPort: tcp
  selector:
    app.kubernetes.io/instance: app1
    app.kubernetes.io/name: app1

 

DNS 조회

kubernetes headless service를 nslookup 명령어를 사용하여 DNS조회시 실행 중인 POD의 아이피를 전부 조회할 수 있습니다. 

$ kubectl run -it --rm dns --image=registry.k8s.io/e2e-test-images/jessie-dnsutils:1.3 --restart=Never nslookup headless.default.svc.cluster.local
Server:     10.96.0.10
Address:    10.96.0.10#53

Name:   headless.default.svc.cluster.local
Address: 10.244.201.112
Name:   headless.default.svc.cluster.local
Address: 10.244.143.100
Name:   headless.default.svc.cluster.local
Address: 10.244.123.104
pod "dns" deleted

 

kubernetes service를 nslookup 명령어를 사용하여 DNS조회시 서비스에 할당된 아이피만 조회됩니다.

$ kubectl run -it --rm dns --image=registry.k8s.io/e2e-test-images/jessie-dnsutils:1.3 --restart=Never nslookup app1.default.svc.cluster.local
Server:     10.96.0.10
Address:    10.96.0.10#53

Name:   app1.default.svc.cluster.local
Address: 10.96.100.12
pod "dns" deleted
728x90