-
[따배쿠] Headless Service, Kube-Proxykubernetes 2024. 12. 8. 11:25
Headless Service
- 클러스터 내에서 Pod에 대한 DNS 이름을 제공하지만, ClusterIP를 할당하지 않는 서비스
- 주로 StatefulSet과 같은 상태 저장 애플리케이션에서 사용되며, 파드 간의 직접적인 통신을 가능하게 합니다.
- Pod IP에 대해 DNS resolving service도 제공
- Service가 연결된 Pod의 endpoint로 DNS 레코드가 생성됨
- Pod의 DNS 주소 : pod-ip-addr.namespace.pod.cluster.local
- type은 ClusterIP이나 clusterIP는 None
특징
- ClusterIP 없음
- headless 서비스는 ClusterIP를 가지지 않으며, 대신 각 파드의 IP 주소를 직접 반환합니다. 이를 통해 클라이언트는 특정 파드에 직접 연결할 수 있습니다.
- DNS 레코드
- headless 서비스는 DNS 쿼리를 통해 각 파드의 IP 주소를 반환합니다. 예를 들어, 서비스 이름이 my-service이고, 네임스페이스가 my-namespace인 경우, DNS 쿼리를 통해 my-service.my-namespace.svc.cluster.local로 요청하면 해당 서비스에 연결된 모든 파드의 IP 주소 목록이 반환됩니다.
- 로드 밸런싱 없음
- 헤드리스 서비스는 로드 밸런싱을 제공하지 않으며, 클라이언트는 반환된 IP 주소 중 하나를 선택하여 직접 연결해야 합니다.
예시
# Deployment로 Pod 생성 및 확인
root@master:~/Getting-Start-Kubernetes/7# vi deploy-nginx.yaml apiVersion: apps/v1 kind: Deployment metadata: name: webui spec: replicas: 3 selector: matchLabels: app: webui template: metadata: name: nginx-pod labels: app: webui spec: containers: - name: nginx-container image: nginx:1.14
root@master:~/Getting-Start-Kubernetes/7# kubectl create -f deploy-nginx.yaml deployment.apps/webui created
root@master:~/Getting-Start-Kubernetes/7# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES testpod 1/1 Running 1 (14m ago) 17h 192.168.104.2 node2 <none> <none> webui-5f67dcf6d-7rkcd 1/1 Running 0 4m13s 192.168.104.3 node2 <none> <none> webui-5f67dcf6d-nr2qj 1/1 Running 0 4m13s 192.168.104.4 node2 <none> <none> webui-5f67dcf6d-zfhlm 1/1 Running 0 4m13s 192.168.166.165 node1 <none> <none>
# headless-nginx 파일 생성 및 배포
root@master:~/Getting-Start-Kubernetes/7# vi headless-nginx.yaml apiVersion: v1 kind: Service metadata: name: headless-service spec: type: ClusterIP clusterIP: None selector: app: webui ports: - protocol: TCP port: 80 targetPort: 80
root@master:~/Getting-Start-Kubernetes/7# kubectl create -f headless-nginx.yaml service/headless-service created
# 확인
root@master:~/Getting-Start-Kubernetes/7# kubectl describe svc headless-service Name: headless-service Namespace: default Labels: <none> Annotations: <none> Selector: app=webui Type: ClusterIP IP Family Policy: SingleStack IP Families: IPv4 IP: None IPs: None Port: <unset> 80/TCP TargetPort: 80/TCP Endpoints: 192.168.104.3:80,192.168.104.4:80,192.168.166.165:80 Session Affinity: None Events: <none>
app=webui이라는 label을 가지는 pod 3개에 대해 headless service를 제공한다.
예시2
# pod 생성 (테스트 용도)
root@master:~/Getting-Start-Kubernetes/7# kubectl run testpod -it --image=centos:7 /bin/bash If you don't see a command prompt, try pressing enter.
# pod의 DNS 서버 확인
[root@testpod /]# cat /etc/resolv.conf search default.svc.cluster.local svc.cluster.local cluster.local lmmolpfs2h0erbppadumnuesna.syx.internal.cloudapp.net nameserver 10.96.0.10 options ndots:5
10.96.0.10이 해당 pod의 DNS 서버임을 확인가능 (= master가 제공해주는 Core DNS의 IP)
# 확인
[root@testpod /]# curl 192-168-166-165.default.pod.cluster.local
Pod DNS 주소로 curl하면, nginx가 나온다.
Kube-proxy
- Kube-Proxy는 Kubernetes에서 네트워크 동작을 관리하는 컴포넌트
- Kube-Proxy는 모든 Worker Node에 하나씩 위치하고 있는데, Kubernetes의 오브젝트 중 모든 오브젝트에 하나씩 위치하는 오브젝트인 DaemonSet의 형태로 배포
- 기능
- Kube-proxy는 새로운 Cluster IP가 생성되거나 Pod이 추가될 때, 자신이 동작하고 있는 Node의 iptables에 룰을 추가하여 줍니다.
- 따라서, 클라이언트 요청은 kube-proxy가 받아서 iptables 룰을 참고하여 연결
- kube-proxy는 Service의 IP와 Port로 들어온 접속을 Service와 연결된 여러 Pod들에게 Load Balancing
- 또한, Node Port와 같은 Service를 통해 외부에 port를 노출시켜야 할 때, 그 port를 Listen하는 역할을 담당합니다.
# 확인
root@master:~/Getting-Start-Kubernetes/7# kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE default testpod 1/1 Running 1 (28s ago) 12m default webui-5f67dcf6d-7rkcd 1/1 Running 0 23m default webui-5f67dcf6d-nr2qj 1/1 Running 0 23m default webui-5f67dcf6d-zfhlm 1/1 Running 0 23m kube-system calico-kube-controllers-5b9b456c66-slbt7 1/1 Running 4 (33m ago) 2d19h kube-system calico-node-22qcb 1/1 Running 11 (33m ago) 34d kube-system calico-node-7lxq2 1/1 Running 4 (33m ago) 2d19h kube-system calico-node-hqlgk 1/1 Running 11 (33m ago) 34d kube-system coredns-55cb58b774-hn85c 1/1 Running 4 (33m ago) 2d19h kube-system coredns-55cb58b774-wx9q6 1/1 Running 4 (33m ago) 2d19h kube-system etcd-master 1/1 Running 11 (33m ago) 34d kube-system kube-apiserver-master 1/1 Running 11 (33m ago) 34d kube-system kube-controller-manager-master 1/1 Running 11 (33m ago) 34d kube-system kube-proxy-4gkx6 1/1 Running 11 (33m ago) 34d kube-system kube-proxy-6xskg 1/1 Running 4 (33m ago) 2d19h kube-system kube-proxy-bbl9f 1/1 Running 11 (33m ago) 34d kube-system kube-scheduler-master 1/1 Running 11 (33m ago) 34d product myweb 1/1 Running 6 (33m ago) 4d20h
kube-proxy가 3개 배포되어있는데, 이는 master / node1 / node2에서 DaemonSet 형태로 각각 동작한다.
kube-proxy mode
- userspace
- 클라이언트의 서비스 요청을 iptables를 거쳐 kube-proxy가 받아서 연결
- k8s 초기 버전에 잠깐 사용
- iptables (now)
- default kubernetes network mode
- kube-proxy는 service API 요청 시(ex. cluster ip 또는 node port 생성 요청), iptables rule 생성
- 클라이언트 연결은 kube-proxy가 받아서 iptables 룰을 통해 연결
- IPVS
- 리눅스 커널이 지원하는 L4 로드밸런싱 기술을 이용
- 별도의 ipvs 지원 모듈을 설정한 후 적용 가능
- 지원 알고리즘 : round-robin, least connection, destination hashing, source hashing, shortest expected delay
참고 영상
https://www.youtube.com/watch?v=ilQSgu8qt0o&list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&index=27
'kubernetes' 카테고리의 다른 글
[따배쿠] Ingress - 웹페이지 구현 (0) 2024.12.09 [따배쿠] Ingress - 개념 및 설치 (0) 2024.12.09 [따배쿠] Service - ClusterIP, NodePort, LoadBalancer, ExternalName (0) 2024.12.07 [따배쿠] Service - 개요 (1) 2024.12.07 [따배쿠] Controller - Cronjob (0) 2024.12.07