쿠버네티스에서 Pod
를 외부로 노출시키기 위해서 NodePort Service
를 사용할 수 있다.
그런데, NodePort Service
는 Port를 중복 사용할 수 없어서 1개의 NodePort
에 1개의 Deployment
만 적용이 된다.
그렇다면 여러 개의 Deployment
가 있을 때 그 수만큼 NodePort Service
를 구동해야 할까?
쿠버네티스는 이런 경우에 Ingress
를 사용할 수 있다.
Ingress
하나만 외부로 노출시키고 별도의 추가 서비스를 노출시키지 않고도 여러 애플리케이션으로 라우팅
시킬 수 있다.L4/L7 로드밸런서
와 보안 인증서
를 처리하는 기능 제공Ingress Controller
Ingress Resource
Ingress 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 이름]
참고 자료