Service Type에 대해 설명한다.

ClusterIP

ClusterIP 타입의 서비스는 클러스터 내부에서 해당 ClusterIP를 통해 Pod to Pod 통신을 가능하게 한다. ClusterIP는 서비스(디플로이먼트/레플리카셋) 단위로 생성되므로, ClusterIP 주소로 서비스를 호출하면 백단의 Pod 중 하나에 프록시된다. 

NodePort

NodePort 타입의 서비스는 클러스터에 속한 Node의 IP:NodePort를 Pod의 Service Port와 매핑시킨다. 

LoadBalancer

LoadBalancer 타입의 서비스는 외부의 LB를 생성하여, 외부 LB에서 NodePort로 들어오는 트래픽을 프록시 한다. 

ExternalName

Headless

Headless 서비스는 ClusterIP를 None으로 설정하면 생성할 수 있다. Headless 서비스를 생성하면 ClusterIP가 존재하지 않고, 각 Pod의 네트워크 인터페이스로 라우팅 할 수 있다. 다시 말해서, 트래픽이 프록시 되지 않고 Pod가 가진 각각의 Private IP로 전송 가능하다. 


Port/Container Port/Node Port 구분은 다음과 같다.

  • Port Kubernetes 서비스를 클러스터의 특정 포트에 매핑한다. 클러스터 내부의 Pod간에 통신을 Port를 통해 할 수 있다.
  • TargetPort  Service가 Request를 보내는 포트(Pod가 리스닝하는 포트), 컨테이너 내부의 애플리케이션 또한 TargetPort에 해당하는 포트를 리스닝 하고 있어야 한다. 편의를 위해 default로 Port와 동일한 값이 매핑된다. 
  • NodePort 클러스터의 외부에 서비스를 노출시키는 포트, 타겟 노드들의 IP:NodePort를 통해 서비스에 접근 가능하다. 별도로 설정하지 않으면 default로 설정된다. 

Service Proxy란?

Kubernetes 클러스터의 모든 노드는 kube-proxy를 실행시킨다. kube-proxy는 ExternalName 타입의 서비스 이외의 다른 서비스들(ClusterIP, NodePort, LoadBalancer)에 Virtual IP 주소를 매핑하는 역할을 한다.

Strategy은?

User space proxy mode

  • kube-proxy는 control plane을 모니터링 하다가 서비스 또는 엔드포인트 오브젝트가 생성/삭제되는지 확인
  • 각 서비스마다 임의의 포트가 로컬 노드에 오픈되며, 이 proxy port로 들어오는 서비스가 백엔드의 Pod로 전달됨
  • Session Affinity 적용
  • Round-Robin 알고리즘으로 백엔드에 요청 전달됨

iptables proxy mode

  • kube-proxy는 control plane을 모니터링 하다가 서비스 또는 엔드포인트 오브젝트가 생성/삭제되는지 확인
  • 각 서비스마다 iptables rule이 생성됨(ClusterIP와 port 기록)
  • 서비스의 백엔드 Pod로 임의 전달
  • 연결시도하는 백엔드 Pod가 응답하지 않으면 Connection fail이 나오고 자동으로 다른 백엔드 Pod에 연결 시도(User space proxy mode와 다른 점)