목표
- 쿠버네티스 서비스가 무엇인가?
- 서비스는 언제 필요한가?
- 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에 포워딩 해주는 역할을 한다.
- 어떻게 Service 커뮤니케이션을 할까? selector
- Pods는 selectors에 의해서 식별된다.
- multiple Pod ports?
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를 리턴한다.
- 옵션1. k8s api call
- 결론적으로 위와 같이 로드밸런싱이 필요한 부분은 Cluster-IP가 있는 mongodb-service를 활용하고, 특정 pod의 IP를 찾기 위해서는 headless를 활용한다.
NodePort 특성
- NodePort는 특정 static port에 각 pod에 연결되는 서비스이다. ClusterIP와 비교하면 ClusterIP는 오직 Cluster내에서만 접근이 가능한데, NodePort는 Fix된 각 Worker노드에서 External traffic이 가능하다. 결국 포트가 오픈되는 것이다.
- 그래서 NodePort는 보안적으로 좋지 않다.
- 노드포드 범위 : 30000~32767
LoadBalancer 특성
- NodePort가 외부 트래픽에서 직접 접근이 가능하여 보안적으로 좋지 않다.
- 이런점을 커버할 수 있는 서비스 특성이 LoadBalancer이다.
- 로드밸런서는 외부에서 클라우드 프로바이더(AWS, GCP, 오픈스택 ..) LoadBalancer를 통해 외부트래픽이 접근가능하다.
- NodePort와 ClusterIP는 자동으로 생성된다.
- 로드밸런서는 NodePort서비스의 확장이라고 할 수 있고, NodePort 서비스는 ClusterIP 서비스의 확장이다.
결론적으로 프로덕션 레벨에서 서비스를 활용하는 베스트 프렉티스는
- ingress를 두고 ClusterIP로 인터널 서비스를 활용한다.
- LoadBalancer를 두고 ClusterIP를 활용한다.