[k8s] Service

Service

포드를 외부에 노출시키기 위해서는 쿠버네티스의 service 오브젝트를 생성해야한다. 서비스의 핵심 기능은 다음과 같다.

  1. 여러개의 포드에 쉽게 접근할 수 있도록 고유한 도메인 네임을 부여
  2. 여러개의 포드에 접근할 때 요청을 분산하는 로드 밸런서 기능 수행
  3. 클라우드 플랫폼의 로드 밸런서, 클러스터 노드의 포트 등을 통해 포드를 외부로 노출

서비스는 크게 ClusterIP 타입, NodePort 타입, LoadBalancer 타입으로 나눌 수 있다.

ClusterIP

ClusterIP타입은 쿠버네티스 내부에서만 포드들에 접근할 때 사용한다. 외부로 포드를 노출하지 않기 때문에 내부에서 사용하기 적합하다.

NodePort

NodePort타입을 이용해 클러스터 외부에서도 접근이 가능하도록 사용할 수 있다. NodePort타입은 모든 노드의 특정 포트를 개방해 서비스에 접근할 수 있도록 도와준다. 외부에서 포드에 접근하기 위해 각 노드에 개방된 포트로 요청을 전송하고 서비스와 연결된 포드중 하나로 라우팅된다. 클러스터 내부에서는 ClusterIP 타입과 동일하게 접근할 수 있다.

LoadBalancer

LoadBalancer타입은 서비스 생성과 동시에 로드밸런서를 새롭게 생성해 포드와 연결한다. LoadBalancer타입을 사용하기 위해서는 로드 밸런서를 동적으로 생성하는 기능을 제공하는 환경에서만 가능하다. LoadBalancer타입은 다음과 같이 동작한다.

  1. LoadBalancer타입의 서비스가 생성과 동시에 모든 워커 노드는 포드에 접근할 수 있는 랜덤한 포트를 개방한다
  2. 클라우드 플랫폼에서 생성된 로드 밸런서로 요청이 들어오면 이 요청은 쿠버네티스의 워커 노드중 하나로 전달된다
  3. 워커 노드로 전달된 요청은 포드중 하나로 전달되어 처리된다

로드밸런서 트래픽 분배

externalTrafiicPolicy를 통해 노드밸런서의 트래픽 분배 옵션을 설정할 수 있다. 기본 속성은 Cluster이며 이는 다음과 같이 동작한다.

  1. 워커 노드로 요청을 전달 받음
  2. 다른 워커노드를 포함한 모든 노드 중 하나의 포드로 요청 전달

Cluster의 단점은 요청을 전달받은 노드에서 처리할 수 있는 요청이여도 다른 노드로 전달될 수 있다는 점이다. 이는 네트워크 홉카운트를 하나 증가하게 되며 노드간 리다이렉트가 발생하게 된다.

Local속성은 포드가 생성된 노드에서만 포드로 접근할 수 있으며 로컬 노드에 위치한 포드 중 하나로 요청이 전달된다. 하지만 워커노드 내부 구성에 따라 요청이 고르게 분산되지 않을수 있다. 예를 들어 워커노드 A에 a’ b’의 포드가 존재하고 워커노드 B에 c’의 포드가 존재할 때 각 포드의 요청 수용량은 25% 25% 50%로 불균형하게 나뉘게된다.

ExternalName

ExternalName타입은 서비스가 외부 도메인을 가리키도록 설정할 수 있다.

Author: Song Hayoung
Link: https://songhayoung.github.io/2020/07/24/Docker/service/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.