본문으로 건너뛰기

9. 서비스

파드는 일시적인 존재라 언제든지 할당된 IP 주소가 바뀔 수 있다. 클라이언트 입장에서는 늘 변하는 파드의 IP 주소를 알기 어렵기 때문에 쿠버네티스에는 서비스라는 오브젝트가 존재한다.

서비스에는 여러 타입이 있다. 이를 매니페스트에 지정함으로써 접근 가능한 클라이언트의 범위를 한정할 수 있다. 서비스의 타입들은 아래와 같다.

ClusterIP​

서비스를 만들 때 타입을 지정하지 않으면 설정되는 기본 타입이다. 클러스터 내부에서 내부 DNS에 등록한 이름으로 특정 파드 집합에 요청을 전송할 수 있게 해준다.

NodePort​

앞의 ClusterIP에 더해 노드의 IP 주소에 공개 포트가 열린다. 이를 통해 k8s 클러스터 외부에서 내부의 파드에 요청을 보낼 수 있게 된다.

NordPort 타입의 서비스를 만들면 클러스터의 모든 노드에 지정한 포트가 열리게 된다. 그리고 각 노드가 수령한 요청은 대상이 되는 파드들에게 부하 분산되어 전송된다. 이때 요청을 받은 노드 내에 있는 파드로만 전송하도록 설정할 수 있다. 노드들 앞에 로드밸런서가 있다면 유용한 설정임.

단, 사용자가 특정 노드를 지정해서 접속하고 있는데 해당 노드가 하드웨어 점검 등의 이유로 셧다운 된다면 서비스를 이용할 수 없게 되고, 이미 사용 중인 포트를 설정하면 매니페스트 배포 과정에서 실패한다. NodePort는 쉽고 편리하게 설정할 수 있지만 정식 서비스에 사용하는 것은 추천하지 않는다.

LoadBalancer​

이 서비스 타입은 로드밸런서와 연동하여 파드의 애플리케이션을 외부에 공개한다. 또한 LoadBalancer는 NodePort를 사용하기 때문에 ClusterIP도 자동적으로 만들어진다.

ExternalName​

파드에서 K8s 클러스터 외부의 엔드 포인트에 접속하기 위한 이름을 해결해 준다. 예를 들어, 퍼블릭 클라우드의 데이터베이스 등에 접근할 때 사용될 수 있다.

세션 어피니티​

동일한 클라이언트에서 온 요청은 언제나 같은 파드에 전송하고 싶을 수 있다. 그런 경우에는 매니페스트의 세션 어피니티를 ClientIP로 설정하면 된다.

apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web
ports:
- protocol: TCP
port: 80
sessionAffinity: ClientIP