nginx Ingress vs ALB Ingress — L7과 L4
쿠버네티스에서 클러스터 밖 트래픽을 안으로 들이는 가장 단순한 방법은 Service 를 LoadBalancer 타입으로 만드는 겁니다. 그런데 이러면 서비스 하나당 로드밸런서가 하나씩 붙어서 서비스가 늘수록 로드밸런서 요금과 관리할 주소가 같이 늘고, 경로나 호스트로 나눠 보내는 것도 안 됩니다.
그래서 Ingress 를 쓰는데, Ingress 는 “이 호스트의 이 경로는 이 서비스로” 라는 규칙만 적어 둔 오브젝트이고 그 규칙을 실제로 처리하는 구현체는 따로 붙이니, 규칙만 적고 컨트롤러를 안 붙이면 아무 일도 일어나지 않습니다.
흔히 쓰는 구현체는 둘입니다. 클러스터 안에서 nginx 파드가 처리하는 nginx Ingress Controller, 그리고 AWS 관리형 로드밸런서인 ALB(Application Load Balancer)가 처리하는 ALB Ingress 입니다. 둘 다 외부 트래픽을 받아 서비스로 넘긴다는 점은 같지만, 트래픽을 받는 자리부터 다릅니다.
트래픽을 받는 곳이 안이냐 밖이냐
nginx Ingress Controller 는 라우팅을 클러스터 안에서 하고 ALB Ingress 는 클러스터 밖에서 합니다.
nginx 쪽은 Pod 자체가 클러스터 안에서 돌면서 경로와 호스트 기반 라우팅을 직접 하는 반면, ALB 쪽 Controller 는 라우팅에 관여하지 않습니다. Ingress 리소스를 보고 ALB 를 생성하고 설정하는 역할만 하고 실제 트래픽을 받아 라우팅하는 건 클러스터 밖의 AWS ALB 입니다.
| 항목 | nginx Ingress | ALB Ingress |
|---|---|---|
| 트래픽 받는 곳 | 클러스터 안 (nginx Pod) | 클러스터 밖 (AWS ALB) |
| L7 라우팅 담당 | nginx | AWS ALB |
| Controller 역할 | 라우팅 직접 실행 | ALB 생성·설정만 |
| 클라우드 종속성 | 없음 | AWS 전용 |
Ingress는 L7 전용 — NLB는 Service로
Ingress 는 HTTP L7 라우팅만 표현할 수 있다는 말을 자주 봤고, 스펙을 열어 보면 정말로 그렇게 생겼습니다.
kind: Ingress
spec:
rules:
- host: app.example.com # HTTP 호스트
http: # http만 있음
paths:
- path: /api
host 와 http.paths 만 있고 TCP·UDP 를 표현할 방법은 스펙에 없습니다.
그래서 NLB(L4, TCP/UDP)는 Ingress 가 아니라 Service 로 노출합니다.
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:
type: LoadBalancer # Ingress 아님, Service임
ports:
- port: 443
protocol: TCP
| 리소스 | 레이어 | 무엇이 만들어지나 |
|---|---|---|
| Ingress | L7 (HTTP/HTTPS) | nginx Ingress Controller 면 nginx 파드, ALB Ingress 면 ALB |
Service type: LoadBalancer |
L4 (TCP/UDP) | AWS Load Balancer Controller 가 NLB 생성 |
AWS Load Balancer Controller 는 Ingress 를 보고 ALB 를, Service 를 보고 NLB 를 만들지만, 반대로 Service 로 ALB 를 만들 수는 없습니다.
TCP 트래픽을 Ingress 로 어떻게 넣을지 고민하고 있다면 스펙에 그걸 적을 자리 자체가 없으니
방향이 틀렸습니다. nginx Ingress Controller 처럼 컨트롤러가 자체 확장(tcp-services
ConfigMap)으로 따로 열어 주긴 합니다만, 그건 컨트롤러가 얹은 기능이라 Ingress 스펙 바깥입니다.
nginx Ingress 를 쓰는데 라우팅이 이상하면 nginx Pod 의 로그를 보고, ALB Ingress 면 클러스터 안에는 볼 게 없으니 AWS 콘솔에서 ALB 의 리스너와 타겟 그룹을 봅니다. L4 가 필요하면 Ingress 를 뒤지지 말고 Service 를 LoadBalancer 로 만들어 NLB 를 붙입니다.
댓글 0