기존 reverse proxy는 백엔드 주소를 설정 파일에 적어 두고, 변경이 생기면 설정을 다시 읽어 들인다. 이 모델은 백엔드 IP가 자주 바뀌지 않는 환경에서 자연스럽게 동작한다.

컨테이너 오케스트레이션 환경에서는 다르다. Kubernetes Pod는 IP가 바뀌고, autoscaling으로 인스턴스가 분 단위로 추가·제거된다. 매번 설정 파일을 다시 쓰고 reload를 거치면 변경 반영이 느려지고 연결도 끊긴다.

Envoy는 이 환경을 전제로 다시 설계된 reverse proxy다. 설정을 API로 받고, 변경을 hot reload 없이 반영하며, L7 트래픽을 세밀하게 제어한다.

정적 reverse proxy

기존 reverse proxy는 cloud-native 환경에서 네 가지 한계에 부딪힌다.

  1. 수동 reload — 설정 변경 시 SIGHUP 등으로 reload를 호출한다. 변경 빈도가 높으면 운영 부담이 커지고, reload 과정에서 일시적인 연결 중단이 생기기도 한다.
  2. 정적 upstream — 백엔드 주소를 설정 파일에 명시한다. Kubernetes Service처럼 동적으로 변하는 endpoint를 표현하려면 외부 도구가 설정 파일을 다시 써 줘야 한다.
  3. 빈약한 L7 observability — 요청 단위의 통계, 분산 추적, 자세한 access log가 기본 동작에서 부족하다. 별도 모듈이나 외부 도구로 보완한다.
  4. 제한된 L7 라우팅 표현력 — host와 path 기반 라우팅은 표현 가능하지만, header나 메타데이터 기반의 복잡한 라우팅, retry, timeout, circuit breaker 같은 정책을 유연하게 표현하기 어렵다.

xDS API

Envoy는 설정을 API로 받는다. xDS (Discovery Service)라고 부르는 gRPC(HTTP/2 기반 RPC 프레임워크) API 묶음이 listener, cluster, route, endpoint, secret을 동적으로 전달한다.

각 종류는 별도 API로 갈린다.

  • LDS (Listener Discovery Service) — Envoy가 어느 포트에서 어떤 프로토콜로 받을지
  • CDS (Cluster Discovery Service) — upstream cluster 묶음 (logical backend)
  • EDS (Endpoint Discovery Service) — 각 cluster의 실제 endpoint (IP/port)
  • RDS (Route Discovery Service) — host/path → cluster 라우팅 규칙
  • SDS (Secret Discovery Service) — TLS 인증서 같은 비밀 값
sequenceDiagram
    participant CP as Control Plane
    participant Envoy as Envoy (data plane)
    participant Backend
    Envoy->>CP: gRPC stream subscribe (LDS/CDS/RDS/EDS)
    CP-->>Envoy: Listener / Cluster / Route / Endpoint
    Note over Envoy: Hot reload 없이 즉시 반영
    Backend->>CP: Pod 추가/제거 이벤트
    CP-->>Envoy: EDS push (endpoint 변경)

control plane은 Envoy에 변경을 push하고, Envoy는 hot reload 없이 즉시 반영한다. 한 메커니즘이 수동 reload와 정적 upstream 두 한계를 동시에 해소한다.

control plane의 형태는 Envoy 자체에 종속되지 않는다. Istio의 Istiod, AWS App Mesh, Contour, go-control-plane으로 직접 구현한 control plane 모두 xDS API 규약만 따르면 된다.

Filter Chain

Envoy의 요청 처리는 filter chain으로 표현된다. listener가 연결을 받으면 network filter chain이 동작하고, HTTP 요청은 HTTP filter chain으로 이어진다.

flowchart LR
    Conn[연결 도착] --> L[Listener]
    L --> NF[Network Filter Chain]
    NF --> HCM[HTTP Connection Manager]
    HCM --> HF[HTTP Filter Chain]
    HF --> R[Router]
    R --> C[Upstream Cluster]

HTTP filter chain에는 라우팅, 인증, rate limit, retry, timeout, circuit breaker, header 변환 같은 정책이 filter 하나씩 배치된다. 정책을 조합해서 표현하는 모델은 nginx의 디렉티브 기반 설정보다 표현력이 풍부하다. 라우팅 복잡도를 filter chain의 표현력이 흡수한다.

filter는 C++로 작성된 built-in 외에 WebAssembly (Wasm) 모듈로 동적 로딩이 가능하다. 자체 정책을 별도 빌드 없이 주입하는 길이 열려 있다.

Observability

Envoy는 stats, distributed tracing, access log를 기본 동작에 포함한다.

stats는 Prometheus 호환 포맷으로 노출된다. 요청 수, 지연, 응답 코드 분포 같은 표준 지표를 cluster, route, listener 단위로 자동 수집한다. tracing은 OpenTelemetry, Zipkin, Jaeger와 연동된다. access log는 JSON 등 구조화 포맷으로 stdout이나 파일에 기록된다.

세 가지 모두 별도 모듈 설치 없이 설정으로 활성화한다. observability가 기본 동작에 포함되어 있다.

Control Plane 과 설정 복잡도

Envoy가 동적으로 동작하려면 control plane이 있어야 한다. 단독 reverse proxy로 띄울 수도 있지만, xDS의 가치는 control plane과 함께 발휘된다. 운영 입장에서 control plane이 별도 시스템이 된다.

설정 표현도 nginx보다 복잡하다. listener, cluster, route, endpoint 각 객체를 따로 다루고, filter chain의 순서가 동작에 영향을 준다. 단순한 정적 트래픽 처리에는 과한 도구다.

Service Mesh Data Plane

Envoy의 등장 이후 service mesh의 data plane 자리에 자주 채택된다. Istio, Consul Connect, Kuma, AWS App Mesh가 Envoy를 data plane으로 쓰고, control plane은 각자 만든다.

flowchart TB
    subgraph CP[Control Plane]
        Istiod[Istiod / Consul / App Mesh]
    end
    subgraph DP[Data Plane]
        E1[Envoy sidecar]
        E2[Envoy sidecar]
        E3[Envoy sidecar]
    end
    Istiod -.xDS.-> E1
    Istiod -.xDS.-> E2
    Istiod -.xDS.-> E3
    E1 <--> E2
    E2 <--> E3

Pod마다 Envoy sidecar가 함께 뜨고, control plane이 모든 sidecar의 설정을 관리한다. mTLS(mutual TLS), retry, traffic shifting 같은 정책이 애플리케이션 코드 변경 없이 적용된다.

같은 Envoy를 ingress 또는 API Gateway로 단독으로 쓸 수도 있다. Contour, Emissary-ingress, Gloo가 그런 사례다.

마무리

정적 reverse proxy는 백엔드 주소가 안정적이고 라우팅이 단순한 환경에서 가볍게 동작한다. cloud-native 환경에서 백엔드가 자주 바뀌고 L7 정책이 세밀해지면 동적 모델이 필요해진다.

Envoy는 xDS와 filter chain으로 그 동적 모델을 구현한다. 도구 선택은 트래픽이 얼마나 동적인지에 따라 갈린다.

참고