쿠버네티스에서 가장 많이 사용하는 서비스(Service) 유형에는 3가지가 있다.
1. ClusterIP
2. NodePort
3. LoadBalancer
3가지가 어떤 역할을 하는지를 알아보기 전에, 먼저 간략히 IP와 Port 개념을 알아보자.
IP는 네트워크상의 특정 노드를 가리키는 주소이다. 그리고 Port는 노드 안에 존재하는 여러가지 서비스의 창구이다. 그러므로 하나의 노드는 하나의 IP와 여러 개의 Port를 갖는다. Port는 16비트로 이루어져있고 0~65535까지 존재한다.
쿠버네티스 클러스터 안에는 여러 오브젝트가 존재하는데, IP가 부여되어 하나의 노드로써 역할을 한다. 서비스(Service)도 IP가 부여되는 클러스터 내 오브젝트이다. 서비스는 하나의 IP와 여러 개의 포트를 가지며, 포트를 오픈하여 트래픽을 받아 POD로 전달한다.
ClusterIP
서비스는 클러스터 내부에서만 사용하는 Private한 IP를 부여받는다. 해당 IP에는 클러스터 내부에서만 접근이 가능하다. 서비스는 클러스터 내부에서 들어오는 트래픽을 받을 수 있도록 포트를 열어놓는다. 위 사진을 보면, mysql 서비스는 3306포트, nodejs 서비스는 8080포트, react 서비스는 80포트가 열려있다. 이와 같이, 클러스터 내부 트래픽만 접근이 가능하도록 포트를 열어놓는 서비스를 ClusterIP 서비스라고 부른다.
NodePort
NodePort서비스는 내부트래픽이 접근하는 서비스의 포트와 Node의 Port를 포트포워딩한 서비스를 의미한다.
그림이 복잡해보이지만 우측 User가 접근하는 하늘색 선부터 보면 된다.
User는 클러스터의 노드의 포트로 접근한다. 클러스터에서 유일하게 외부에서 접근 가능한 포트가 노드포트이다. 외부에서 클러스터 내부의 서비스에 접근하려면 노드포트와 서비스포트가 서로 포트포워딩되어야 한다. 그러므로 NodePort 서비스란 노드포트와 서비스포트를 포워딩하는 서비스를 의미한다. User의 트래픽이 마스터 노드를 포함하여 어떤 노드든 30085 포트로 들어오면, 각 노드의 kube-proxy에 의해 라우팅되어 Ingress-Controller 서비스로 전달된다. 인그레스 컨트롤러를 간단히 설명하면, 클러스터의 리버스 프록시 서버로 생각하면 된다. 요청을 적절한 서비스로 분산시키는 역할을 한다.
인그레스 컨트롤러 서비스의 Port를 보면 서비스포트의 80포트와 노드포트의 30261 포트가 포트포워딩되어 있다. ( 노드포트 서비스는 30000 - 32767 사이의 노드포트 중 하나를 정하여 서비스 포트와 포트포워딩한다. ) 30261, 30085 같은 포트가 서비스 포트와 포트포워딩되면서, 외부트래픽이 서비스 오브젝트로 접근할 수 있는 루트가 생성된 것이다. 인그레스 컨트롤러 서비스는 인그레스 컨트롤러 파드와 포트포워딩되어 있으므로 외부에서 유입된 트래픽이 서비스를 거쳐 클러스터 파드까지 전달된다.
위 그림을 보면, 프론트엔드 서비스와 백엔드 서비스는 ClusterIP 서비스로 생성되었다. ClusterIP 서비스는 클러스터 내부에서만 접근 가능한 서비스이다. 인그레스 컨트롤러 파드가 kube-proxy로 트래픽을 라우팅하여 프론트엔드나 백엔드 서비스로 보낸다. kube-proxy가 라우팅한 트래픽은 내부에서 들어오는 트래픽으로 ClusterIP서비스가 전달 받을 수 있다.
LoadBalancer
NodePort 서비스는 외부에서 Node의 IP와 Node의 Port로 접근해야 한다. 외부에서 직접 클러스터의 노드에 접근하는 방식은 보안적으로 좋지 못하고 특정노드에만 집중적으로 트래픽이 들어갈 수 있다. LoadBalancer 서비스는 이런 문제를 해결할 수 있다. NodePort 서비스가 서비스포트와 노드포트를 포워딩하는데 그쳤다면, LoadBalancer 서비스는 한발 더 나아가 노드포트와 로드밸런서 포트까지 포트포워딩하였다.
로드밸런서는 외부에서 접근가능한 PublicIP와 Port를 연다. 외부 User는 열려있는 PublicIP와 Port로 접근한다. 위 그림에서는 80포트가 열려있다. 80포트는 노드포트 30085와 포워딩되어 있다. 이때 로드밸런서는 각 노드의 상태에 따라 적절한 노드에 트래픽을 분산하여 전달한다. 로드밸런서가 중간에서 자동으로 트래픽을 분산시켜주는 것이다. 분산된 트래픽은 특정노드의 노드포트로 들어온다. 30085 포트로 들어온 트래픽은 kube-proxy에 의해 인그레스 컨트롤러 서비스 포트(80포트)로 라우팅된다. 그리고 서비스는 인그레스 컨트롤러 파드의 포트(80포트)로 라우팅한다.
정리하면
LoadBalancer는 로드밸런서 포트 - 노드포트 - 서비스포트로 포트포워딩된 서비스
NodePort는 노드포트 - 서비스포트로 포트포워딩 된 서비스
ClusterPort는 서비스포트만 열려있어 클러스터 내부에서만 접근가능한 서비스이다.
참고자료
'DevOps > K8S' 카테고리의 다른 글
[Kubernetes] NFS 서버에 PV 만들어 접근하기 ( 우분투 환경 ) (0) | 2023.10.16 |
---|---|
[Kubernetes] MySQL PV, PVC 적용하기 (0) | 2023.10.16 |
[Kubernetes] MySQL 서비스 및 디플로이먼트 생성하기 (3) | 2023.10.13 |
[Kubernetes] 프론트엔드, 백엔드 서비스 및 디플로이먼트 생성하기 (0) | 2023.10.12 |
[Kubernetes] Minikube 설치 및 인그레스 설치 및 설정하기 (0) | 2023.10.12 |