ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ALB vs NLB 개념, 차이점, 쿠버네티스 연동 정리
    AWS & GCP 2026. 4. 10. 16:27

    1. 개요

    AWS에는 크게 세 가지 로드밸런서가 있습니다. 이 중 현재 가장 많이 쓰이는 두 가지가 ALB(Application Load Balancer)NLB(Network Load Balancer) 입니다.

    로드밸런서 출시 OSI 계층 주요 프로토콜
    CLB (Classic LB) 2009 4 / 7 HTTP, HTTPS, TCP
    ALB (Application LB) 2016 7계층 (애플리케이션) HTTP, HTTPS, gRPC
    NLB (Network LB) 2017 4계층 (전송) TCP, UDP, TLS

    CLB는 레거시로 신규 사용은 권장되지 않습니다.


    2. ALB (Application Load Balancer)

    개념

    ALB는 OSI 7계층(애플리케이션 계층) 에서 동작하는 로드밸런서입니다. HTTP 요청의 내용(URL 경로, 헤더, 메서드, 쿼리스트링 등)을 분석하여 트래픽을 라우팅합니다. 흔히 "AWS 위의 NGINX" 라고 표현하기도 합니다.

    주요 특징

    • 콘텐츠 기반 라우팅: URL 경로(/api/*, /web/*), 호스트명, HTTP 헤더, 메서드, 쿼리 파라미터 기반 라우팅
    • AWS WAF 통합: 웹 방화벽을 연결하여 악성 트래픽 차단 가능
    • 인증 지원: Amazon Cognito, OpenID Connect(OIDC) 기반 인증 처리
    • SSL/TLS 종료(Termination): 로드밸런서에서 HTTPS를 복호화하고 내부는 HTTP로 전달
    • Lambda 대상(Target) 지원: EC2, IP, Lambda 함수를 대상으로 설정 가능
    • 고정 응답 / 리다이렉트: 별도 서버 없이 301/302 리다이렉트, 고정 응답 반환 가능
    • WebSocket, HTTP/2, gRPC 지원

    동적 IP (주의사항)

    ALB는 고정 IP 주소를 제공하지 않습니다. DNS 이름(CNAME)을 통해 접근하며, 내부 IP는 동적으로 변경될 수 있습니다.


    3. NLB (Network Load Balancer)

    개념

    NLB는 OSI 4계층(전송 계층) 에서 동작하는 로드밸런서입니다. 패킷의 IP 주소와 포트만 보고 라우팅하므로 HTTP 내용을 분석하지 않습니다. 초저지연(Ultra-low Latency)고처리량(High Throughput) 이 핵심입니다.

    주요 특징

    • 초저지연: 패킷을 거의 그대로 전달하므로 처리 시간이 매우 짧습니다.
    • 고처리량: 초당 수백만 건의 요청 처리 가능
    • 정적 IP 지원: 가용 영역(AZ)별로 고정 IP 주소 또는 Elastic IP 할당 가능
    • 소스 IP 보존: 클라이언트의 실제 IP를 백엔드까지 그대로 전달
    • 다양한 프로토콜: TCP, UDP, TLS 지원 (HTTP가 아닌 모든 프로토콜)
    • AWS PrivateLink 지원: VPC 간 안전한 서비스 노출에 사용
    • WAF 미지원: 7계층을 보지 않으므로 WAF 연동 불가

    4. 핵심 차이점 비교

    항목 ALB NLB
    OSI 계층 7계층 (애플리케이션) 4계층 (전송)
    프로토콜 HTTP, HTTPS, gRPC TCP, UDP, TLS
    라우팅 방식 경로, 헤더, 호스트, 메서드 등 콘텐츠 기반 IP + Port 기반 (콘텐츠 무관)
    지연 시간 낮음 매우 낮음 (훨씬 빠름)
    처리량 높음 매우 높음 (초당 수백만 요청)
    정적 IP 미지원 (DNS 기반) 지원 (AZ별 고정 IP)
    소스 IP 보존 미지원 (X-Forwarded-For 헤더 사용) 지원
    WAF 통합 지원 미지원
    인증 (Cognito, OIDC) 지원 미지원
    Lambda 대상 지원 미지원
    SSL 종료 지원 지원 (Pass-through도 가능)
    PrivateLink 미지원 지원
    월 비용 (기본) ~$23.90 ~$22.46

    5. 언제 사용하는가

    ALB를 선택하는 경우

    • 일반 웹 애플리케이션 (HTTP/HTTPS 기반)
    • 마이크로서비스 / 컨테이너 환경 — 하나의 ALB로 경로별 다수 서비스 라우팅
    • 서버리스(Lambda) 와 연동이 필요한 경우
    • WAF, Cognito 인증 등 보안 기능이 필요한 경우
    • SSL 종료 를 로드밸런서에서 처리하고 싶은 경우
    • 요약: HTTP 기반 대부분의 서비스에 기본 선택

    NLB를 선택하는 경우

    • TCP/UDP 기반 프로토콜 사용 (게임 서버, IoT, 데이터베이스 프록시 등)
    • 극저지연 이 필요한 실시간 서비스 (주가 데이터, 실시간 스트리밍 등)
    • 정적 IP 가 필요한 경우 (방화벽 화이트리스트 등록 등)
    • 소스 IP 보존 이 필요한 경우 (클라이언트 IP를 그대로 받아야 하는 경우)
    • AWS PrivateLink 를 통해 서비스를 외부에 노출할 경우
    • 예측 불가능한 트래픽 급증 — NLB는 예열(Pre-warming) 없이 즉시 스케일
    • 요약: 비HTTP, 고성능, 고정 IP, PrivateLink가 필요한 경우

    6. 쿠버네티스(EKS) 환경에서의 ALB / NLB

    AWS Load Balancer Controller (LBC)

    EKS(Kubernetes)에서 AWS 로드밸런서를 자동으로 프로비저닝해주는 컨트롤러입니다. Kubernetes 리소스 타입에 따라 ALB 또는 NLB 가 자동 생성됩니다.

    Kubernetes 리소스 → AWS Load Balancer Controller → AWS 로드밸런서 생성
    Kubernetes 리소스 생성되는 AWS 로드밸런서
    Ingress ALB (Application Load Balancer)
    Service (type: LoadBalancer) NLB (Network Load Balancer)
    Gateway (v2.14.0+) ALB (Gateway API 지원)

    v2.5 이후부터 type: LoadBalancer 서비스는 기본적으로 NLB가 생성됩니다. (기존 Classic LB 대체)


    ALB 설정 — Ingress 리소스

    Ingress 리소스를 생성하면 ALB가 자동으로 프로비저닝됩니다. ingressClassName: alb 와 어노테이션으로 동작을 제어합니다.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-ingress
      annotations:
        alb.ingress.kubernetes.io/scheme: internet-facing       # 인터넷 공개 여부 (internal | internet-facing)
        alb.ingress.kubernetes.io/target-type: ip               # 대상 타입 (ip | instance)
        alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:...  # HTTPS 인증서
        alb.ingress.kubernetes.io/healthcheck-path: /health     # 헬스체크 경로
        alb.ingress.kubernetes.io/wafv2-acl-arn: arn:aws:wafv2:...  # WAF 연동
    spec:
      ingressClassName: alb
      rules:
      - host: api.example.com
        http:
          paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: api-service
                port:
                  number: 80
          - path: /web
            pathType: Prefix
            backend:
              service:
                name: web-service
                port:
                  number: 80

    주요 ALB 어노테이션

    어노테이션 설명
    alb.ingress.kubernetes.io/scheme internet-facing (공개) / internal (내부)
    alb.ingress.kubernetes.io/target-type ip (Pod 직접 타겟) / instance (노드 경유)
    alb.ingress.kubernetes.io/certificate-arn ACM SSL 인증서 ARN
    alb.ingress.kubernetes.io/healthcheck-path 헬스체크 경로
    alb.ingress.kubernetes.io/wafv2-acl-arn AWS WAF ACL ARN
    alb.ingress.kubernetes.io/group.name 여러 Ingress를 하나의 ALB로 통합
    alb.ingress.kubernetes.io/listen-ports 리스너 포트 설정 (예: [{"HTTP":80},{"HTTPS":443}])

    NLB 설정 — Service (LoadBalancer) 리소스

    type: LoadBalancer인 Service를 생성하면 NLB가 자동으로 프로비저닝됩니다.

    apiVersion: v1
    kind: Service
    metadata:
      name: my-nlb-service
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: "external"           # LBC가 처리
        service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"      # Pod IP 직접 타겟
        service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"  # 인터넷 공개
        service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: "true"
    spec:
      type: LoadBalancer
      loadBalancerClass: service.k8s.aws/nlb   # v2.5+에서 명시적 지정
      selector:
        app: my-app
      ports:
      - port: 3306
        targetPort: 3306
        protocol: TCP

    주요 NLB 어노테이션

    어노테이션 설명
    service.beta.kubernetes.io/aws-load-balancer-type external (LBC 관리) / nlb
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type ip (Pod 직접) / instance (노드 경유)
    service.beta.kubernetes.io/aws-load-balancer-scheme internet-facing / internal
    service.beta.kubernetes.io/aws-load-balancer-eip-allocations Elastic IP 할당 (정적 IP)
    service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled 크로스 존 로드밸런싱 활성화

    Target Type: ip vs instance

    항목 ip 모드 instance 모드
    트래픽 경로 LB → Pod (직접) LB → 노드 NodePort → Pod
    네트워크 홉 1회 2회
    Fargate 지원 가능 불가
    소스 IP 보존 가능 kube-proxy 설정 필요
    권장 여부 권장 레거시 호환

    7. 아키텍처 흐름

    ALB + Ingress (HTTP 멀티 서비스)

    인터넷
      ↓
    ALB (L7) — /api → api-service Pod
             — /web → web-service Pod
             — /admin → admin-service Pod

    NLB + LoadBalancer Service (TCP/고성능)

    인터넷
      ↓
    NLB (L4) — TCP:3306 → MySQL Pod

    8. 요약

    상황 선택
    일반 HTTP/HTTPS 웹 서비스 ALB
    URL 기반 멀티 서비스 라우팅 (MSA) ALB
    WAF / 인증 / Lambda 연동 필요 ALB
    TCP/UDP 기반 서비스 NLB
    초저지연, 고처리량 필요 NLB
    정적 IP / Elastic IP 필요 NLB
    PrivateLink 서비스 노출 NLB
    Kubernetes Ingress 리소스 ALB 자동 생성
    Kubernetes Service (LoadBalancer) NLB 자동 생성

    기본 원칙: HTTP 서비스라면 ALB부터 시작합니다. 비HTTP 프로토콜, 극저지연, 정적 IP 등 특수 요건이 생기면 NLB로 전환합니다.



    9. GKE (Google Kubernetes Engine) 환경에서의 로드밸런서

    개요

    GKE는 AWS EKS와 마찬가지로 Kubernetes 리소스 타입에 따라 GCP의 로드밸런서를 자동으로 생성합니다. 단, EKS와 달리 로드밸런서 컨트롤러가 GKE 관리형 서비스에 내장되어 있어 별도로 설치할 필요가 없습니다.

    Kubernetes 리소스 생성되는 GCP 로드밸런서 OSI 계층 AWS 대응
    Ingress Application Load Balancer (ALB) 7계층 ALB
    Service (type: LoadBalancer) Passthrough Network Load Balancer 4계층 NLB
    Gateway (권장, GA) Application Load Balancer (ALB) 7계층 ALB

    GKE vs EKS 핵심 차이: GKE는 컨트롤러가 내장되어 별도 설치 불필요. EKS는 AWS Load Balancer Controller를 직접 설치해야 합니다.


    GKE L7 Application Load Balancer — Ingress / Gateway

    Ingress (유지보수 모드 — 신규는 Gateway 권장)

    GKE에서 Ingress 리소스를 생성하면 Google Cloud Application Load Balancer (L7) 가 자동으로 프로비저닝됩니다. kubernetes.io/ingress.class 어노테이션으로 외부/내부를 구분합니다.

    ingress.class 생성 로드밸런서
    미설정 또는 gce 외부 ALB (인터넷 공개, 글로벌)
    gce-internal 내부 ALB (VPC 내부 전용)
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-ingress
      annotations:
        kubernetes.io/ingress.class: "gce"           # 외부 ALB (기본값)
        # kubernetes.io/ingress.class: "gce-internal"  # 내부 ALB
        kubernetes.io/ingress.global-static-ip-name: "my-static-ip"  # 고정 IP
    spec:
      rules:
      - host: api.example.com
        http:
          paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: api-service
                port:
                  number: 80
          - path: /web
            pathType: Prefix
            backend:
              service:
                name: web-service
                port:
                  number: 80

    GKE Ingress는 현재 유지보수 모드입니다. 신규 기능은 추가되지 않으며, Gateway API로 마이그레이션을 권장합니다.

    Gateway API (현재 권장)

    GatewayClass 를 지정하여 로드밸런서 유형을 결정합니다.

    GatewayClass 설명
    gke-l7-global-external-managed 외부 글로벌 ALB (권장)
    gke-l7-regional-external-managed 외부 리전 ALB
    gke-l7-rilb 내부 ALB
    gke-l4-netlb 외부 L4 NLB
    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: my-gateway
    spec:
      gatewayClassName: gke-l7-global-external-managed
      listeners:
      - name: https
        protocol: HTTPS
        port: 443
        tls:
          certificateRefs:
          - kind: Secret
            name: my-tls-secret
    ---
    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: my-route
    spec:
      parentRefs:
      - name: my-gateway
      rules:
      - matches:
        - path:
            type: PathPrefix
            value: /api
        backendRefs:
        - name: api-service
          port: 80

    주요 ALB (GKE) 특징

    • 글로벌 분산: Google의 엣지 네트워크(Google Front End)에서 글로벌하게 트래픽 처리
    • Container-Native Load Balancing: NEG(Network Endpoint Group)를 통해 노드를 거치지 않고 Pod IP로 직접 트래픽 전달 → 불필요한 네트워크 홉 제거
    • BackendConfig CRD: 헬스체크, Cloud Armor(WAF), 타임아웃 등 고급 설정을 별도 리소스로 분리 관리 (AWS의 어노테이션 방식과 차이)
    apiVersion: cloud.google.com/v1
    kind: BackendConfig
    metadata:
      name: my-backend-config
    spec:
      healthCheck:
        checkIntervalSec: 15
        port: 8080
        type: HTTP
        requestPath: /health
      cdn:
        enabled: true
      securityPolicy:
        name: my-cloud-armor-policy   # Cloud Armor (WAF)
      timeoutSec: 40

    GKE L4 Network Load Balancer — Service (LoadBalancer)

    type: LoadBalancer Service를 생성하면 Passthrough Network Load Balancer (L4) 가 자동으로 생성됩니다. 패킷을 변경 없이 그대로 전달하므로 소스 IP 보존이 가능합니다.

    외부 NLB (External)

    apiVersion: v1
    kind: Service
    metadata:
      name: my-nlb-service
      annotations:
        cloud.google.com/l4-rbs: "enabled"   # 백엔드 서비스 기반 NLB (권장)
    spec:
      type: LoadBalancer
      externalTrafficPolicy: Local            # 소스 IP 보존
      selector:
        app: my-app
      ports:
      - port: 80
        targetPort: 8080
        protocol: TCP

    내부 NLB (Internal)

    apiVersion: v1
    kind: Service
    metadata:
      name: my-internal-nlb
      annotations:
        networking.gke.io/load-balancer-type: "Internal"  # 내부 NLB
    spec:
      type: LoadBalancer
      selector:
        app: my-app
      ports:
      - port: 3306
        targetPort: 3306
        protocol: TCP

    주요 NLB (GKE) 어노테이션

    어노테이션 설명
    networking.gke.io/load-balancer-type: "Internal" 내부 NLB 지정
    cloud.google.com/l4-rbs: "enabled" 백엔드 서비스 기반 외부 NLB (권장)
    networking.gke.io/weighted-load-balancing: pods-per-node Pod 수 기반 가중 분산
    networking.gke.io/transparent-health-checker 투명 헬스체크 활성화

    externalTrafficPolicy 동작 방식

    동작 소스 IP 보존
    Cluster (기본) 모든 노드에 분산, 노드 간 재전달 가능 미보존
    Local Pod가 있는 노드에만 전달 보존

    EKS vs GKE 로드밸런서 주요 비교

    항목 AWS EKS Google GKE
    컨트롤러 설치 별도 설치 필요 (AWS LBC) GKE 관리형 내장
    L7 리소스 Ingress → ALB Ingress / Gateway → ALB
    L4 리소스 Service (LoadBalancer) → NLB Service (LoadBalancer) → NLB
    설정 방식 어노테이션 중심 어노테이션 + BackendConfig CRD
    Pod 직접 타겟 ip 모드 (NEG와 유사) NEG (Network Endpoint Group)
    기본 공개 여부 internal (내부) external (외부)
    WAF 연동 AWS WAF (Ingress 어노테이션) Cloud Armor (BackendConfig CRD)
    인증서 관리 ACM (외부 발급) ManagedCertificate (자동 발급)
    L7 권장 방식 Ingress (안정) Gateway API (권장, Ingress는 유지보수 모드)

    참고 자료

    댓글