Service
포드를 외부에 노출시키기 위해서는 쿠버네티스의 service 오브젝트를 생성해야한다. 서비스의 핵심 기능은 다음과 같다.
- 여러개의 포드에 쉽게 접근할 수 있도록 고유한 도메인 네임을 부여
- 여러개의 포드에 접근할 때 요청을 분산하는 로드 밸런서 기능 수행
- 클라우드 플랫폼의 로드 밸런서, 클러스터 노드의 포트 등을 통해 포드를 외부로 노출
서비스는 크게 ClusterIP 타입, NodePort 타입, LoadBalancer 타입으로 나눌 수 있다.
ClusterIP
ClusterIP타입은 쿠버네티스 내부에서만 포드들에 접근할 때 사용한다. 외부로 포드를 노출하지 않기 때문에 내부에서 사용하기 적합하다.
NodePort
NodePort타입을 이용해 클러스터 외부에서도 접근이 가능하도록 사용할 수 있다. NodePort타입은 모든 노드의 특정 포트를 개방해 서비스에 접근할 수 있도록 도와준다. 외부에서 포드에 접근하기 위해 각 노드에 개방된 포트로 요청을 전송하고 서비스와 연결된 포드중 하나로 라우팅된다. 클러스터 내부에서는 ClusterIP 타입과 동일하게 접근할 수 있다.
LoadBalancer
LoadBalancer타입은 서비스 생성과 동시에 로드밸런서를 새롭게 생성해 포드와 연결한다. LoadBalancer타입을 사용하기 위해서는 로드 밸런서를 동적으로 생성하는 기능을 제공하는 환경에서만 가능하다. LoadBalancer타입은 다음과 같이 동작한다.
- LoadBalancer타입의 서비스가 생성과 동시에 모든 워커 노드는 포드에 접근할 수 있는 랜덤한 포트를 개방한다
- 클라우드 플랫폼에서 생성된 로드 밸런서로 요청이 들어오면 이 요청은 쿠버네티스의 워커 노드중 하나로 전달된다
- 워커 노드로 전달된 요청은 포드중 하나로 전달되어 처리된다
로드밸런서 트래픽 분배
externalTrafiicPolicy를 통해 노드밸런서의 트래픽 분배 옵션을 설정할 수 있다. 기본 속성은 Cluster이며 이는 다음과 같이 동작한다.
- 워커 노드로 요청을 전달 받음
- 다른 워커노드를 포함한 모든 노드 중 하나의 포드로 요청 전달
Cluster의 단점은 요청을 전달받은 노드에서 처리할 수 있는 요청이여도 다른 노드로 전달될 수 있다는 점이다. 이는 네트워크 홉카운트를 하나 증가하게 되며 노드간 리다이렉트가 발생하게 된다.
Local속성은 포드가 생성된 노드에서만 포드로 접근할 수 있으며 로컬 노드에 위치한 포드 중 하나로 요청이 전달된다. 하지만 워커노드 내부 구성에 따라 요청이 고르게 분산되지 않을수 있다. 예를 들어 워커노드 A에 a’ b’의 포드가 존재하고 워커노드 B에 c’의 포드가 존재할 때 각 포드의 요청 수용량은 25% 25% 50%로 불균형하게 나뉘게된다.
ExternalName
ExternalName타입은 서비스가 외부 도메인을 가리키도록 설정할 수 있다.