[Kubernetes] NodePort VS LoadBalancer VS ClusterIP
위 3가지는 서비스 퍼블리싱(Service Types) 에 속한다.
기본값으로 ClusterIP 방식으로 설정 된다.
ClusterIP
: 서비스를 클러스터-내부 IP에 노출시킨다. 이 값을 선택하면 클러스터 내에서만 서비스에 도달할 수 있다.- Cluster 내부적에서만 사용한다.
NordPort
: 고정포트로 각 노드 IP에 서비스를 노출 시킨다. NodePort 서비스가 라우팅되는 ClusterIP 서비스가 자동으로 생성된다. [NodeIP] : [NodePort]를 요청하여, 클러스터 외부에서 NodePort 서비스에 접속할 수 있다.- 같은 상위 네트워크 상에서 주로 사용한다.
LoadBalance
r: 클라우드 공급자의 로드밸런서를 사용하여 서비스를 외부에 노출시킨다. 외부 로드 밸런서가 라우팅되는 NodeProt와 ClusterIP 서비스가 자동으로 생성된다.- 외부 인터넷과 주로 연결을 담당한다.
사용 구조 알기
이를 이해하기 위해서는 웹서비스의 3Tier 구조를 통해서 설명하기 좋다.
위 그림처럼 프론트엔드서버 <=> 백엔드서버 <=> DB 구조를 갖추고 있다. 그리고 DB 데이터의 안전을 위하여 cloud에 DB정보를 백업도 하고 DB server1 과 DBserver2가 있지만, Web1과 Web2의 서비스의 모든 데이터를 같이 관리하고자 한다. 또한 하나의 웹페이지에서 web1의 기능과 web2의 기능을 따로 개발하고자 한다.
즉, exmple.com/web1 이면 web1로 example.com/web2 이면 web2 로 연결되게 서비스를 구축을 하고자 한다.
위 그림을 과연 Kubenetes으로 구현하고자 한다면 어떻게 구성을 해야할까?
먼저, 서비스의 구성을 살펴봐야 한다.
-
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
- Web1
-
네트워크(service) 구조 구성하기
-
Web1 과 Web2의 경로 구별 :
Ingress
이용- Ingress은 IP주소를 통해서 들어오는 경로에 대해서 처리하지 못한다. 오로지 도메인 주소를 통해서 만 해당하는 서비스로 이어준다.
-
외부 client가 접속하는 곳 :
LB
-
Web1 과 Web2는 직접적으로 외부와 연결된것이 아니라 Ingress에 의해서 접속 :
ClusterIP
-
DB 서버는 외부 접속은 아니지만, 같은 Overlay에서 참조할 경우가 있을 수 있다. 즉, 백업서버를 같은 클러스터는 아니지만, 같은 네트워크 내에서 구축을 한다면 해당 DB서버의 ip와 포트를 통해서 접속이 가능하도록 해야한다. :
NodePort
-
-
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페이지에서 설치를 진행한다.