DevOps/Kubernetes

Services (ClusterIP / NodePort / LoadBalancer / Headless Service)

가은파파 2021. 7. 26. 10:21

목표

  • 쿠버네티스 서비스가 무엇인가?
  • 서비스는 언제 필요한가?
  • ClusterIP vs NodePort vs LoadBalancer vs Headless Service

쿠버네티스 서비스?

  • 안정적인 IP address를 제공
    • Pods는 고유 IP address가 존재한다. 그러나 Pod는 자주 생성되고 삭제되는 과정으로 거치면서 IP address가 새로 부여된다. 이를 해결하기 위해 서비스가 필요하다.
  • Loadbalancing
    • 클라이언트 입장에서 각각의 pod를 콜할 필요없고, 서비스를 콜함으로써 부하의 밸런스를 조절할 수 있다.
  • loose coupling

 

ClusterIP 특성

  • IP를 클러스터화 시켜서 서비스로 관리할 수 있다.
  • 주로 외부 ingress의 backend 인터널 서비스로 활용하여 목적지 pod에 포워딩 해주는 역할을 한다.

ingress와 ClusterIP service의 yaml 파일 세팅

 

  • 어떻게 Service 커뮤니케이션을 할까?  selector
    • Pods는 selectors에 의해서 식별된다.
    • multiple Pod ports?
      targetPort를 설정하여 pod port를 확인할 수 있다.

Headless Service

  • 목표 : 특정 pod와 각 pod에 직접 커뮤니케이션하기 위한 것.
  • 예 : Stateful applications 예를 들어 database
    • Pods 레플레카 셋은 동일하지 않다.
    • 오직 Master 인스턴스만 Write 권한을 가지고 있고, 다른 worker 인스턴스는 추가시에 data sync를 통해 status를 유지한다.(stateful)
  • Client 는 IP address를 각 pod별로 어떻게 식별할까?
    • 옵션1. k8s api call
      • k8s api에 너무 의존적이고, 비효율적
    • 옵션2. DNS Lookup
      • DNS Service Lookup에서 ip address를 리턴한다.

headless 서비스 세팅

  • 결론적으로 위와 같이 로드밸런싱이 필요한 부분은 Cluster-IP가 있는 mongodb-service를 활용하고, 특정 pod의 IP를 찾기 위해서는 headless를 활용한다.

NodePort 특성 

  • NodePort는 특정 static port에 각 pod에 연결되는 서비스이다. ClusterIP와 비교하면 ClusterIP는 오직 Cluster내에서만 접근이 가능한데, NodePort는 Fix된 각 Worker노드에서 External traffic이 가능하다. 결국 포트가 오픈되는 것이다.
  • 그래서 NodePort는 보안적으로 좋지 않다. 
    • 노드포드 범위 : 30000~32767

ClusterIP 주소는 자동생성

LoadBalancer 특성

  • NodePort가 외부 트래픽에서 직접 접근이 가능하여 보안적으로 좋지 않다.
  • 이런점을 커버할 수 있는 서비스 특성이 LoadBalancer이다.
  • 로드밸런서는 외부에서 클라우드 프로바이더(AWS, GCP, 오픈스택 ..) LoadBalancer를 통해 외부트래픽이 접근가능하다.
    • NodePort와 ClusterIP는 자동으로 생성된다.
  • 로드밸런서는 NodePort서비스의 확장이라고 할 수 있고, NodePort 서비스는 ClusterIP 서비스의 확장이다.

타입에 따른 서비스 종류

결론적으로 프로덕션 레벨에서 서비스를 활용하는 베스트 프렉티스는

  • ingress를 두고 ClusterIP로 인터널 서비스를 활용한다.
  • LoadBalancer를 두고 ClusterIP를 활용한다.