파드가 노드에 호스팅되는 것과는 다르게, 서비스는 클러스터 전체에 걸쳐 호스트된다.
이전에 정리했던 것 처럼 서비스는 3가지 종류가 존재한다.
클러스터 내부의 모든 파드에서 서비스로 접근이 가능하다.
cluster ip와 동일하게 아이피를 할당받고, 내부에서는 이 아이피로 모든 파드에서 서비스로의 접근이 가능하다.
동시에 이 아이피는 외부로도 노출되어 외부 사용자나 애플리케이션도 서비스에 접근이 가능하다.
서비스는 어떻게 아이피 주소를 할당받을까? 그리고 그 아이피로 어떻게 클러스터 내의 모든 파드와 통신할 수 있을까?
서비스가 생성되면 cluster ip를 할당받는다.
할당받는 아이피 범위는 kube-apiserver에 설정되어있다.
# cat /etc/kubernetes/manifests/kube-apiserver.yaml
# default: 10.0.0.0/24
kube-api-server --service-cluster-ip-range ipNet
그리고 서비스가 생성될 때 마다 kube-proxy가 각 노드에게 포워딩 규칙을 생성해준다.
(서비스 아이피로 들어오는 요청은 파드 아이피로 전달하도록)
규칙은 어떻게 만들지?
기본적으로 iptables 를 사용하여 규칙을 만든다 (그 밖에 userspace, ipvs 존재함)
이렇게 추가되는 DNAT 규칙은 iptables 에서 확인 가능하다.
iptables -L -t nat | grep {서비스이름}
10.103.132.104:3306
요청은 10.244.1.2:3306
으로 포워딩하는 규칙 예시
proxy 타입 확인 방법 → 로그 확인
# kubectl logs <kube-proxy-pod-name> -n kube-system
controlplane ~ ➜ k logs -n kube-system kube-proxy-62qjz
I0116 11:50:11.551998 1 node.go:141] Successfully retrieved node IP: 192.26.120.12
I0116 11:50:11.552071 1 server_others.go:110] "Detected node IP" address="192.26.120.12"
I0116 11:50:11.552096 1 server_others.go:551] "Using iptables proxy"
I0116 11:50:11.660894 1 server_others.go:190] "Using iptables Proxier"