[Kubernetes] 쿠버네티스 서비스(Service)와 인그레스(Ingress) 비교

2020. 3. 10. 12:01Engineering/Container&Kubernetes

Content

1. Service 란?
2. Service의 종류 : ClusterIP, NodePort, LoadBalancer
3. Ingress란?

 


 

쿠버네티스의 서비스와 인그레스 자원에 대해 알아보고 차이점을 이해합니다.

 


1. 서비스(Service) 란?

쿠버네티스에서 말하는 서비스라는 자원은 POD의 집합입니다.

동일한 서비스 동작을 구현하는 여러가지 POD 하나로 묶어 관리하는 객체이죠.

 

서비스라는 자원이 필요할까요? 2 가지 이유가 있습니다.

 

첫번째) 서비스를 위한 고정된 IP가 필요하다.

버네티스는 POD 항상 건강한 상태이도록 관리합니다.

따라서 POD 하나가 이상이 있어 죽어버리면, 해당 POD 다시 띄우죠.

POD 새로 띄워질 때마다 동적으로  IP 할당 받습니다.

 

이러한 POD IP변경 가능성이 서비스를 제공하려는 상황에서는 문제가 되죠.

서비스를 위해서는 고객들이 서비스를 위해 접근할 고정된 IP 주소가 필요합니다.

여러분이 장사를 한다고 생각해보세요,

가게의 위치를 이리저리 계속 옮겨 다니면 손님들이 굉장히 불편하겠죠?

자리에 가게 위치를 고정할 필요가 있습니다.

 

서비스도 마찬가지 입니다.

서비스를 위해서는 고정된 IP필요합니다.

그러나 동적 IP를 가지는 POD만으로는 불가능하죠.

따라서 POD 상위 개념인 서비스가 등장합니다.

 

여러 POD들을 하나의 서비스 객체로 선언 있으며,

서비스 객체에는 고정된 IP가 할당됩니다.

서비스 내부의 POD IP가 계속 바뀌더라도, 서비스의 IP는 계속 고정되는 겁니다.

 

 

 

두번째) 서비스 제공을 위한 POD 집합에 대한 경로를 제공해야 한다. 

서비스 객체는 트래픽을 '전달'하는 역할만 합니다.

실제 서비스를 '수행'하는 객체는 POD들이죠.

그럼 서비스 객체가 할 트래픽이 들어 왔을

자신의 서비스와 연관된 POD들까지의 경로를 찾아 트래픽을 전달하는 일 입니다.

 

서비스 객체로 묶여진 POD들을 endpoint라고 합니다.

서비스 객체는 자신의 endpoint들을 label 통해 찾아 냅니다.

Label 쿠버네티스 객체들의 특성을 식별하기 위한 key-value 값으로,

쿠버네티스 객체들을 그룹핑 하는 기본 단위입니다.

 

서비스로 트래픽이 들어오면,

서비스와 같은 Label 갖는 POD endpoint들을 찾아, 이곳으로 트래픽을 전달합니다.

 

 

정리하자면 !!

서비스는 1) 고정된 IP제공 2) 서비스 endpoint들까지의경로를 제공하는 객체입니다.

서비스에 필요한 기본적인 기능을 스스로 관리하는 녀석 인거죠!

 

 

 

2. 서비스(Service)의 종류 : ClusterIP, NodePort, Loadbalancer

 

서비스 객체에는 여러가지 종류가 있습니다.

하나씩 살펴보겠습니다.

 

1) ClusterIP

서비스 객체에 클러스터 내부에서만 접근 가능한 IP를 할당합니다.

클러스터 내부 IP 할당 받기 때문에, 클러스터 외부에서는 접속이 불가 합니다.

(물론, kube-proxy를 통해 외부로부터 ClusterIP 타입 객체에 접근하는 방법도 있습니다.)

 

 

2) NodePort

이름처럼 클러스터 내 모든 노드에 외부에서 접근 가능한 포트를 개방합니다.

NodePort 개방할 포트 번호를 지정하게 되는데,

NodePort 설정되면 {클러스터 임의 노드의 IP}:{지정한 포트번호} 서비스에 접근 가능합니다.

, 클러스터 내의 모든 노드들이 공인 IP 갖는다면, 외부에서도 접근 가능한 서비스가 됩니다.

 

 

3) LoadBalancer (LB)

LB타입은 외부 접근이 가능한 LB의 공인IP를 서비스 객체에 할당합니다.

일반적인 사용자들은 LB 장비를 구비하고 있지 않겠죠. ㅎㅎ

그래서 쿠버네티스 서비스의 LB타입은 클라우드 프로바이더들이 이 기능을 지원해줘야만 합니다.

클라우드 서비스로 제공되는 LB 기능을 쿠버네티스와 연동해서 고객에게 제공해야합니다.

 

 

그런데 이런 Loadbalancer 타입의 서비스는, 서비스 1개당 Loadbalancer가 1개씩 필요합니다. 

서비스 갯수만큼 Loadbalancer를 신청되고, 각 서비스마다 자체의 IP주소를 갖게 되므로, 돈이 많이 듭니다. 

이런 문제를 해결하는 것이 Ingress 라는 객체 입니다.

 

 

 

3. Ingress란?

앞서 말씀드린 대로 하나의 IP 여러 서비스를 노출할 없는 LB 한계를 해결할 있는 것이 Ingress 입니다.

 

Ingress 객체는 쿠버네티스 서비스의 종류 하나가 아닙니다.

서비스들을 묶는 서비스들의 상위 객체 입니다.

 

아래 그림에서 보듯이 Ingress는 IP기반이 아니라 URL 기반의 경로를 찾아줍니다.

Ingress는 사실 URL 경로 요청을 어떤 서비스로 연결해라 라는 '규칙'을 정의합니다.

실제 Ingress 규칙에 맞게 경로를 찾는 '행위'를 하는 녀석 인그레스컨트롤러(IngressController)입니다.

 

@ image from https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0

 

 

인그레스 컨트롤러에도 다양한 종류가 있지만

Nginx 인그레스 컨트롤러가 가장 많이 사용되는 합니다.

 

 

 

지금까지 살펴본 쿠버네티스 서비스와 인그레스 컨트롤러에 대해

아주 정리해둔 글이 있습니다. 아래 글을 참고해보세요!

https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0

 

 

저는 실습내용까지 준비해서 다시 돌아오겠습니다!