Server/Kubernetes

쿠버네티스(Kubernetes) Service란?

범데이 2022. 12. 17. 14:15

1. 서비스(Service)란?

쿠버네티스 서비스는 파드들을 통해 실행되고 있는 애플리케이션을 네트워크에 노출시키는 가상의 컴포넌트이다.

쿠버네티스 내부의 다양한 객체들이 애플리케이션과, 그리고 애플리케이션이 다른 외부의 애플리케이션이나 사용자와 연결될 수 있도록 도와주는 역할을 한다.

 

 

 

 

 

2. 쿠버네티스에서 서비스를 사용하는 이유

클러스터 안에서 애플리케이션을 구동시키는 데에 쓰이는 파드들의 반영속성인(ephemeral)특성 때문에 서비스를 사용하게 된다. 쿠버네티스에서의 파드는 무언가가 구동 중인 상태를 유지하기 위해 동원되는 일회성 자원이기 때문에, 언제든 다른 노드로 옮겨지거나 삭제될 수 있다. 또한 파드는 생성될 때마다 새로운 내부 IP를 받게 되므로, 이것만으로 클러스터 내/외부와 통신을 계속 유지하기는 어렵다.

 

따라서 쿠버네티스에서는 파드가 외부와 통신할 수 있도록 클러스터 내부에서 고정적인 IP를 갖는 서비스(Service)를 이용하도록 하고 있다. 서비스는 또한 디플로이먼트나 스테이트풀셋처럼 같은 애플리케이션을 구동하도록 구성된 여러 파드들에게 단일한 네트워크 진입점을 부여하는 역할도 한다.

 

 

3. 서비스의 유형

쿠버네티스에서 서비스의 유형은 노출 범위에 따라 크게 4가지로 분류된다.

 

  1. ClusterIP (기본 형태) - 클러스터 내부에서만 접근 가능한 IP.
  2. NodePort - Port번호를 통해 외부에서 접근. (NAT 컨셉)
  3. LoadBalancer - 외부의 Load Balancer를 사용하는 방법.
  4. ExternalName - kube-dns 컴포넌트로 DNS를 이용하는 방법

 


(1) ClusterIP (기본 형태)

ClusterIP는 파드들이 클러스터 내부의 다른 리소스들과 통신할 수 있도록 해주는 가상의 클러스터 전용 IP다.

 이 유형의 서비스는 <ClusterIP> 로 들어온 클러스터 내부 트래픽을 해당 파드의 <파드IP>:<targetPort>로 넘겨주도록 동작하므로, 오직 클러스터 내부에서만 접근 가능하게 된다. 쿠버네티스가 지원하는 기본적인 형태의 서비스다.

 

 

(2) NodePort

NodePort는 외부에서 노드 IP의 특정 포트(<NodeIP>:<NodePort>)로 들어오는 요청을 감지하여, 해당 포트와 연결된 파드로 트래픽을 전달하는 유형의 서비스다. 이때 클러스터 내부로 들어온 트래픽을 특정 파드로 연결하기 위한 ClusterIP 역시 자동으로 생성된다.

 

(3) LoadBalancer

LoadBalancer는 별도의 외부 로드 밸런서를 제공하는 클라우드(AWS, Azure, GCP 등) 환경을 고려하여, 해당 로드밸런서를 클러스터의 서비스로 프로비저닝할 수 있는 LoadBalancer 유형도 제공한다.

 

 

위의 NodePort방식은 노드가 사라졌을 때 자동으로 다른 노드를 통해 접근이 불가능하다는 단점이 있다. 예를 들어, 3개의 노드가 있다면 3개 중에 아무 노드로 접근해도 NodePort로 연결할 수 있지만 어떤 노드가 살아 있는 지는 알 수가 없다.

 

자동으로 살아 있는 노드에 접근하기 위해 모든 노드를 바라보는 Load Balancer가 필요하다. 브라우저는 NodePort에 직접 요청을 보내는 것이 아니라 Load Balancer에 요청하고 Load Balancer가 알아서 살아 있는 노드에 접근하면 NodePort의 단점을 없앨 수 있다.

 

 

 

(4) ExternalName

ExternalName은 외부 서비스를 쿠버네티스 내부에서 호출고자 할 때 사용할 수 있다.

쿠버네티스 클러스터 내의 파드들은 cluster IP를 가지고 있기 때문에 cluster IP 대역 밖의 서비스를 호출하고자 하면, NAT 설정 등 복잡할 설정이 필요하다.

특히 AWS나 GCP와 같은 클라우드 환경을 사용할 경우 데이터베이스나, 또는 클라우드에서 제공되는 매지니스 서비스(RDS, CloudSQL)등을 사용하고자 할 경우에는 쿠버네티스 클러스터 밖이기 때문에, 호출이 어려운 경우가 있는데, 이를 쉽게 해결할 수 있는 방법이 ExternalName 타입이다.

 

 

 

 

 


#References

https://subicura.com/k8s/guide/service.html#service-clusterip-%E1%84%86%E1%85%A1%E1%86%AB%E1%84%83%E1%85%B3%E1%86%AF%E1%84%80%E1%85%B5

https://bcho.tistory.com/1262

https://seongjin.me/kubernetes-service-types/

 

반응형