융융이'Blog

[Kubernetes] NodePort VS LoadBalancer VS ClusterIP 본문

2022이전/Docker&Kubernetes

[Kubernetes] NodePort VS LoadBalancer VS ClusterIP

바로퇴장 2020. 6. 23. 12:33

위 3가지는 서비스 퍼블리싱(Service Types) 에 속한다.

기본값으로 ClusterIP 방식으로 설정 된다.

  • ClusterIP : 서비스를 클러스터-내부 IP에 노출시킨다. 이 값을 선택하면 클러스터 내에서만 서비스에 도달할 수 있다.
    • Cluster 내부적에서만 사용한다.
  • NordPort : 고정포트로 각 노드 IP에 서비스를 노출 시킨다. NodePort 서비스가 라우팅되는 ClusterIP 서비스가 자동으로 생성된다. [NodeIP] : [NodePort]를 요청하여, 클러스터 외부에서 NodePort 서비스에 접속할 수 있다.
    • 같은 상위 네트워크 상에서 주로 사용한다.
  • LoadBalancer: 클라우드 공급자의 로드밸런서를 사용하여 서비스를 외부에 노출시킨다. 외부 로드 밸런서가 라우팅되는 NodeProt와 ClusterIP 서비스가 자동으로 생성된다.
    • 외부 인터넷과 주로 연결을 담당한다.

사용 구조 알기

이를 이해하기 위해서는 웹서비스의 3Tier 구조를 통해서 설명하기 좋다.

위 그림처럼 프론트엔드서버 <=> 백엔드서버 <=> DB 구조를 갖추고 있다. 그리고 DB 데이터의 안전을 위하여 cloud에 DB정보를 백업도 하고 DB server1 과 DBserver2가 있지만, Web1과 Web2의 서비스의 모든 데이터를 같이 관리하고자 한다. 또한 하나의 웹페이지에서 web1의 기능과 web2의 기능을 따로 개발하고자 한다.

즉, exmple.com/web1 이면 web1로 example.com/web2 이면 web2 로 연결되게 서비스를 구축을 하고자 한다.

위 그림을 과연 Kubenetes으로 구현하고자 한다면 어떻게 구성을 해야할까?

먼저, 서비스의 구성을 살펴봐야 한다.

  1. Deployment 구성하기

    웹서비스의 구성요소 (front, back, DB) 이다. 하지만 이를 Deployment set으로 묶기에는 DB관리하는데 있어서 불편할 거 같아 DB는 따로 Deployment set으로 묶기로 했다.

    • Web1
      • pod : front, back
      • replica : 2
    • Web2
      • pod : front, back
      • replica :2
    • DB
      • pod : DB
      • replica :2
  2. 네트워크(service) 구조 구성하기

    • Web1 과 Web2의 경로 구별 : Ingress 이용

      • Ingress은 IP주소를 통해서 들어오는 경로에 대해서 처리하지 못한다. 오로지 도메인 주소를 통해서 만 해당하는 서비스로 이어준다.
    • 외부 client가 접속하는 곳 : LB

    • Web1 과 Web2는 직접적으로 외부와 연결된것이 아니라 Ingress에 의해서 접속 : ClusterIP

    • DB 서버는 외부 접속은 아니지만, 같은 Overlay에서 참조할 경우가 있을 수 있다. 즉, 백업서버를 같은 클러스터는 아니지만, 같은 네트워크 내에서 구축을 한다면 해당 DB서버의 ip와 포트를 통해서 접속이 가능하도록 해야한다. : NodePort

  3. DB 백업서버는 같은 네트워크 공간(Overlay)에 구축을 한다.

위 과정을 통해 구성된 그림이 위 그림과 같다.

IP 주소? Port? 어떻게 구성된건가요?

쿠버네티스는 클러스터를 구축하기 위해서 Overlay환경을 구축합니다. 즉, 클러스터 내에서는 서브넷이 같은 네트워크에 놓이게 됩니다.

자 그림을 보면 현재 오버레이 아래로 노드 3개(물리적 구조)와 DB 백업서버가 배치되어 있다. 또한 각 노드마다 파드가 올라가 있다. 그림처럼 네트워크가 구성되어있다. 여기에 bridge 와 Nat가 적절하게 설정되어 있다.

ClusterIp가 Replicas set으로 부하분산하는 과정이 있는데 LB아닌가요?

쿠버네티스의 LB와 네트워크 LB의 정의는 약간 다릅니다. 쿠버네티스에서 ClusterIP 와 NodePort 도 부하분산 기능을 가지고 있습니다. 쿠버네티스에서 ClusterIP와 NodePort를 LB와 다르게 정의한 이유는 앞서 설명했듯이 해당 IP의 접속 범위와 dns 형태를 구분짓고 사용용도에 따라 기능적으로 다르기 때문입니다.

ClusterIP

apiVersion: v1
kind: Service
metadata:  
  name: my-internal-service
spec:
  selector:    
    app: my-app
  type: ClusterIP
  ports:  
  - name: http
    port: 80
    targetPort: 80
    protocol: TCP

Nodeport:

apiVersion: v1
kind: Service
metadata:  
  name: my-nodeport-service
spec:
  selector:    
    app: my-app
  type: NodePort
  ports:  
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30036
    protocol: TCP

LoadBalancer

kind: Service
apiVersion: v1
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
spec:
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - name: http
      port: 80
      targetPort: http
    - name: https
      port: 443
      targetPort: https


## ingress-nginx은 해당 github페이지에서 설치를 진행한다.