외부에서 쿠버네티스 클러스터의 내부에 접속하는 가장 쉬운 방법은 노드포트 서비스를 이용하는것이다. 노드포트 서비스를 설정하면 모든 워커 노드의 특정 포트를 열고 여기로 오는 모든 요청을 노드포트 서비스로 전달한다. 그리고 노드포트 서비스는 해당 업무를 처리할 수 있는 파드로 요청을 전달한다.
nodeport.yaml
apiversion: v1
kind: Service
metadata:
name: np-svc
spec:
selector:
app: np-pods
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
nodePort: 30000
type: NodePort
kubectl expose deployment np-pods --type=NodePort --name np-svc-v2 --port=80
노드포트 서비스는 포트를 중복 사용할 수 없어서 1개의 노드포트에 1개의 디플로이먼트만 적용된다. 그렇기에 여러 개의 디플로이먼트가 있을 때 인그레스를 사용한다. 인그레스는 고유한 주소를 제공해 사용 목적에 따라 다른 응답을 제공할 수 있다. 인그레스 컨트롤러의 궁극적인 목적은 사용자가 접속하는 경로에 따라 다른 결괏값을 제공하는 것이다.
ingress-config.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
-http:
paths:
-path:
backend:
serviceName: hname-svc-default
servicePort: 80
-path: /ip
backend:
serviceName: ip-svc
servicePort: 80
-path: /your-directory
backend:
serviceName: your-svc
servicePort: 80
위의 연결 방식은 들어오는 요청을 모두 워커 노드의 노드포트를 통해 노드포트 서비스로 이동하고 이를 다시 쿠버네티스의 파드로 보내는 구조였다. 그러나 로드밸런서를 사용하려면 로드밸런서를 이미 구현해 둔 서비스업체의 도움을 받아 쿠버네티스 클러스터 외부에 구현해야 한다.
kubectl expose deployment ex-lb --type=LoadBalancer --name=ex-svc
MetalLB는 특별한 네트워크 설정이나 구성이 있는 것이 아니라 기존의 L2 네트워크와 L3 네트워크로 로드밸런서를 구현한다. MetalLB 컨트롤러는 작동 방식을 정의하고 EXTERNAL-IP를 부여해 관리한다. MetalLB 스피커는 정해진 작동 방식에 따라 경로를 만들 수 있도록 네트워크 정보를 광고하고 수집해 각 파드의 경로를 제공한다.
쿠버네티스는 부하량에 따라 디플로이먼트의 파드 수르르 유동적으로 관리하는 기능을 제공한다. 이를 HPA라고 한다.