
쿠버네티스에서 Pod를 외부로 노출시키기 위해서 NodePort Service를 사용할 수 있다.
그런데, NodePort Service는 Port를 중복 사용할 수 없어서 1개의 NodePort에 1개의 Deployment만 적용이 된다.
그렇다면 여러 개의 Deployment가 있을 때 그 수만큼 NodePort Service를 구동해야 할까?
쿠버네티스는 이런 경우에 Ingress를 사용할 수 있다.
Ingress 하나만 외부로 노출시키고 별도의 추가 서비스를 노출시키지 않고도 여러 애플리케이션으로 라우팅 시킬 수 있다.L4/L7 로드밸런서와 보안 인증서를 처리하는 기능 제공Ingress ControllerIngress ResourceIngress Resource는 HOST나 Path 기반의 라우팅 룰을 정의하는 파일이고, Ingress Controller는 Ingress Resource에서 정의된 라우팅 룰을 반영하는 주체이다.
다양한 Ingress Controller가 있지만, 쿠버네티스에서 프로젝트로 지원하는 NGINX Ingress Controller를 대표적으로 살펴보겠다.
둘다 Pod을 외부로 노출시키는 역할은 같다.
하지만 Ingress를 사용하는 것이 장점이 더 많다.
1. 하나의 로드밸런서만으로도 서빙 가능
2. Access Log를 하나의 Ingress에서 수집 가능
필자는 Path 기반의 라우팅을 실습해봤다.
아래 사이트에 접속 -> YAML 파일 다운로드 -> 쿠버네티스 클러스터 적용
https://github.com/kubernetes/ingress-nginx/blob/main/README.md#readme
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/baremetal/deploy.yaml
kubectl get pods -n ingress-nginx
다운받은 deploy.yaml을 살펴보면, namespace가 ingress-nginx로 설정되어 있다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx-example
rules:
- host: [도메인 이름]
http:
paths:
- path: /aa
pathType: Prefix
backend:
service:
name: app1 // 쿠버네티스 DNS에 등록된 서비스 이름
port:
number: 8001
- path: /bb
pathType: Prefix
backend:
service:
name: app2 // 쿠버네티스 DNS에 등록된 서비스 이름
port:
number: 8002
kubectl describe ingresses.networking.k8s.io --namespace=ingress-nginx [Ingress 이름]
참고 자료