보람찬 코기의 개발자 블로그
article thumbnail
반응형

이번 게시글은 쿠버네티스의 서비스 부분에 대한 개념을 정리하는 게시글입니다.

 

쿠버네티스를 작동하여 오브젝트를 생성하는거 이외로 가장 중요한 부분이라고 생각한다.

 

서비스(Service)란 ?

  • 컨테이너화된 애플리케이션을 외부에 노출시켜 외부 사용자(클라이언트가) 해당 애플리케이션에 접근할 수 있도록 하는 리소스
  • Pod들의 집단 안에서 접근할 때 사용하는 것이다 (간단한 예시, DB가 있는 pod 이랑 nginx가 있는 pod 끼리에서)

왜 서비스를 써야할까?

  • 파드는 일회성이다. [반영속적인 특성]
  • 노드에서 파드가 제거되면 새로운 파드가 생성되거나, 클러스터의 노드에 장애가 발생되면 스케줄러에 의해 Pod 다른 노드로 이동되어 생성된다. [동적이다]
  • 쿠버네티스의 파드는 노드에 스케줄된 후, 시작하기 전에 IP 주소를 자동 할당하기 때문에 미리 파드의 IP 주소를 알기 어렵다.
    • 또한 파드의 특성상 소멸되고 복구될 시에 IP주소가 자주 동적으로 바뀐다.
  • Scale-out(HPA/스케일 아웃) 는 여러 파드가 같은 서비스를 제공하는 것을 의미하는데 각 파드는 독립적이라 개별 IP 주소를 가지게 된다. 클라이언트는 서비스를 제공하는 파드의 수와 IP를 신경 쓸 필요가 없어야 하기 때문이다.

서비스를 사용한다면,

 

Pod에게 고유한 IP 주소와 집합에 대한 단일 DNS 명을 부여하고 레플리카들에게 알아서 로드밸런싱을 수행해준다.

 

 

 

이해를 위해 좋은 예시를 들고왔다.

 

    클러스터 내 프론트앤드와 백엔드 서버가 있다고 가정하자. 백엔드는 고 가용성(HA)을 위해 여러 개의 레플리카들로 관리된다. 만약에 프론트엔드가 백엔드와 통신하려고 하면 “service(서비스)”라는 개념 없이는 실제 IP 주소를 매번 추적해야 할 수 있다.

 

그러나 쿠버네티스에서 제공하는 서비스라는 추상화 개념을 이용하여 지정해준디면,

 

백엔드 파트의 실제 IP 주소를 추적할 필요 없이 등록된 내부 DNS 주소를 통해 통신이 가능하게된다.


10.10.10.2의 내부 아이피를 갖고있는 Pod와 그 옆에 10.10.10.3 ~ 10.10.10.4의 주소를 갖고 있는 Pod 들이 논리적으로 Service B 10.10.9.2라고 합쳐져 있다.

 

외부에서 접근할 때 이정표 처럼 찾아가면 되는 것이다.

 

즉 ,애플리케이션을 구동하도록 구성된 여러 파드들에게 단일한 네트워크 진입점을 부여하는 역할도 한다

 

 

간략하게 정리하자면 다음과 같다

  • Pod의 논리적 집합이며 어떻게 접근할지에 대한 정책을 정의해놓은 것을 말한다.
  •  Label Selector 통해 어떤 Pod를 포함할지 정의가 가능하다. 
  • 각 Pod의 IP로는 외부에서 직접적인 접근이 불가능하지만, 서비스는 원하는 IP 생성 및 고유한 DNS 이름을 갖게하여 이를 가능하게 허용해 준다.

서비스 종류

  • Cluster IP
  • NodePort
  • LoadBalancer
  • ExternalNmae

Cluster IP [내부 -> 내부]

  • 파드들이 클러스터 내부의 다른 리소스들과 통신할 수 있도록 해주는 가상의 클러스터 전용 IP다. [클러스터 내부 소통 방법]
  • 쿠버네티스가 지원하는 기본적인 형태의 서비스이다.
  • 이 유형의 서비스는 내부에서 <ClusterIP>로 들어온 클러스터 내부 트래픽을 해당 파드의 <파드IP>:<targetPort>로 넘겨주도록 동작하므로, 오직 클러스터 내부에서 내부로만 접근하는 방식이다

보통 서비스 디버깅 및 내부 트래픽 허용할 때 사용한다.

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

 


NodePort [외부 -> 내부]

NodePort는 외부 트래픽을 서비스로 직접 가져오는 원시적인 방법

 

고정 포트로 Pod이 배포된 노드들의 IP에 서비스를 노출시킨다.

 

이때, NodePort 서비스는 ClusterIP 서비스를 자동으로 생성한다.

 

NodeIP:NodePort를 요청하여 클러스터 외부에서 NodePort 서비스에 접근할 수 있다.

  1. 외부의 IP 가 192.168.1.1 이면 31000 번 포트로 노드에 접근한다 [nodeport]
  2. Nodeport는 Cluster IP 도 자동으로 생성된다.
  3. yaml 파일에 정의 한 방식으로 접근이 가능하다. [Lable , Selector 사용]

 

Label이 MyApp인 3개의 Pod를 Selector를 통해 서비스를 묶어주면 자동으로 연결되고 [위의 그림에서는 같은 기능을 하는 Pod] 자동으로 Load Balancing 기능을 수행하게 된다.

 

http://192.168.1.1:31000에 접근하게 되면 3개중 트래픽이 가장 원활한 곳에 자동으로 연결한다.

// nodeport.yaml

 

apiVersion: v1 
kind: Service 
metadata: 
  name: nodeport 
spec: 
  type: NodePort 
  ports: 
  - name:http 
    port:80 
    protocol: TCP 
    targetPort: 8080 
    nodePort: 8081 
  selector: 
    app: nodeport 
    ver: v1

 

//kubectl create -f nodeport.yaml

Load Balancing [부하분산]

  • 클라우드상에 존재하는 LoadBalancer에 연결하고자 할 때 사용되는 Service이다.
  • LoadBalancer의 외부 External IP를 통해 접근이 가능하다.
  • 서비스에 외부 접속이 가능한 대표 ip를 제공, 클라우드 서비스 프로바이더 (csp)를 사용하는경우 가능한 기능

 

AWS의 EKS, zure의 AKS, 구글의 GKS, IBM의 IKS 등과 같은 클라우드 벤더가 제공하는 쿠버네티스 서비스를 사용할 때 그 클라우드 벤더의 로드밸런서를 사용하기 위해 만든다.


LoadBalancer 서비스를 만들면 자동으로 클라우드 벤더의 로드밸런서가 연결되어 서비스 오브젝트를 접근할 때 그 로드밸런서를 통해 파드가 연결 된다.

 

 

 LoadBalancer Type은 public cloud와 연계하여 사용할 때 생성이 됩니다. 
 
 
 아래는 공식 문서에 대한 내용입니다.
LoadBalancer: 클라우드 공급자의 로드 밸런서를 사용하여 서비스를 외부에 노출시킨다. 외부 로드 밸런서가 라우팅되는 NodePort와 ClusterIP 서비스가 자동으로 생성된다.

추가적으로 자체 구축한 경우 Metal lb를 통해서 LoadBalancer 타입의 서비스를 제공하는것도 가능합니다.

 

 

 

내가 학습하면서 이해하기로는 Node Port 보다 상단인 클라우드 서비스에서 트래픽 분산과 처리를 해준다고 이해했다.

 

또한 학습하면서 aws 및 gcp를 연동하여 실행해보기에는 제한이 있어서 개념만 잡고 갔다.

 

밑 사진을 참고하면 좋다.


External Name [내부 -> 외부]

External Name은 클러스터 내부에서 클러스터 외부의 특정 주소로 접근할 때 사용하는 방법이다.

  • 서비스 이름 표준화: 외부 서비스의 위치가 자주 변경되는 경우, externalName 서비스를 사용하여 해당 서비스의 DNS 이름을 쿠버네티스 서비스에서 참조하면 된다. 그렇게 하면 외부 서비스 위치가 변경되어도 쿠버네티스 내부에서는 DNS 이름만 변경하면 되므로 코드나 구성 변경 없이 외부 서비스를 사용할 수 있다.
kind: Service
apiVersion: v1
metadata:
  name: externalname
spec:
  type: ExternalName
  externalName: www.naver.com

해당 코드는 externalname Service로 접근하게 되면 네이버 도메인으로 포워딩을 해준다.

 

경우에 따라 외부 데이터베이스에 접근하거나, 웹 서비스, 외부 레지스트리 등 에 접근이 필요할때 사용하면 될것같다.

 

확장성이 높아 외부 리소스와의 통합이용이하지만 

 

하지만 외부 서비스이다보니 DNS구성과 외부 리소스 가용성에 유의해아한다


추가적으로 Ingress 가 있다.

Ingress는 Kubernetes v1.1 추가된 기능이다.

NodePort 와LoadBalancer 와 마찬가지로 애플리케이션의 Service를 외부로 노출할때 사용되는 리소스입니다.

 

 

외부에서 들어온 HTTP와 HTTPS 트래픽을 ingress resouce를 생성하여 Cluster내부의 Service로 L7영역에서 라우팅하며 로드밸런싱, TLS, 도메인 기반의 Virtual Hosting을 제공합니다.

이러한 기능은 NodePort로 서비스를 노출하는 것에 비해 외부의 서비스를 보다 손쉽게 관리할 수 있도록해줍니다.

https://blog.wonizz.tk/2019/08/21/kubernetes-service/

Ingress는 실질적인 라우팅 기능을 제공하는 Ingress Controller와 Ingress 리소스로 구성할 수 있다.

반응형
profile

보람찬 코기의 개발자 블로그

@BoChan

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!