nginx Ingress vs ALB Ingress — L7과 L4

네트워킹40분조회 –

쿠버네티스에서 클러스터 밖 트래픽을 안으로 들이는 가장 단순한 방법은 Service 를 LoadBalancer 타입으로 만드는 겁니다. 그런데 이러면 서비스 하나당 로드밸런서가 하나씩 붙어서 서비스가 늘수록 로드밸런서 요금과 관리할 주소가 같이 늘고, 경로나 호스트로 나눠 보내는 것도 안 됩니다.

그래서 Ingress 를 쓰는데, Ingress 는 “이 호스트의 이 경로는 이 서비스로” 라는 규칙만 적어 둔 오브젝트이고 그 규칙을 실제로 처리하는 구현체는 따로 붙이니, 규칙만 적고 컨트롤러를 안 붙이면 아무 일도 일어나지 않습니다.

흔히 쓰는 구현체는 둘입니다. 클러스터 안에서 nginx 파드가 처리하는 nginx Ingress Controller, 그리고 AWS 관리형 로드밸런서인 ALB(Application Load Balancer)가 처리하는 ALB Ingress 입니다. 둘 다 외부 트래픽을 받아 서비스로 넘긴다는 점은 같지만, 트래픽을 받는 자리부터 다릅니다.

트래픽을 받는 곳이 안이냐 밖이냐

nginx Ingress Controller 는 라우팅을 클러스터 안에서 하고 ALB Ingress 는 클러스터 밖에서 합니다.

클러스터 안클러스터 안외부 요청LB ServiceL4nginx PodL7 라우팅Pod외부 요청AWS ALBL7 라우팅 · 클러스터 밖ServicePodnginx IngressALB Ingress
L7 라우팅이 클러스터 안이냐 밖이냐

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 를 붙입니다.

  1. 불러오는 중