[Envoy] Envoy로 시작하는 고성능 프록시 - Run Envoy

y001·2025년 4월 19일

Istio 실전 스터디

목록 보기
4/26

현대적인 마이크로서비스 아키텍처에서는 서비스 간 통신, 보안, 트래픽 제어, 관측 가능성(O11y)을 통합적으로 다루는 솔루션이 필요하다. Envoy는 이러한 요구사항을 만족시키는 고성능 L7 프록시이며, 서비스 메시 구조에서 데이터 플레인(Data Plane) 으로 자주 활용된다. Istio, AWS App Mesh, Consul Connect 등 주요 서비스 메시가 내부적으로 Envoy를 채택하고 있다.

1. Envoy란?

Envoy는 원래 Lyft에서 개발한 오픈소스 L7 프록시로, 다음과 같은 역할을 수행한다:

  • 트래픽 라우팅 및 로드 밸런싱
  • HTTP/2, gRPC, TCP 등 다양한 프로토콜 지원
  • 요청/응답에 대한 필터 체인 구성
  • Retry, Circuit Breaker, Timeout 처리
  • Metrics, 로그, 트레이싱 (예: Zipkin, Jaeger) 내장
  • TLS termination 및 mTLS 지원
  • 정적/동적 구성 지원 (XDS API 기반)

2. 설치 방법 (macOS 기준)

Homebrew를 통해 간편하게 설치할 수 있다:

brew install envoy

설치가 완료되면 다음 명령어로 버전을 확인한다:

envoy --version

3. Envoy Quickstart: 기본 구성 확인

Envoy는 YAML 기반 설정 파일을 통해 구동되며, 아래와 같은 demo.yaml 예제를 통해 기본 구조를 파악할 수 있다.

기본 demo.yaml 구성

admin:
  access_log_path: "/tmp/admin_access.log"
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 9901

static_resources:
  listeners:
    - name: listener_0
      address:
        socket_address:
          address: 0.0.0.0
          port_value: 10000
      filter_chains:
        - filters:
            - name: envoy.filters.network.http_connection_manager
              typed_config:
                "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
                stat_prefix: ingress_http
                route_config:
                  name: local_route
                  virtual_hosts:
                    - name: backend
                      domains: ["*"]
                      routes:
                        - match:
                            prefix: "/"
                          route:
                            cluster: service_1
                http_filters:
                  - name: envoy.filters.http.router
                    typed_config:
                      "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router

  clusters:
    - name: service_1
      connect_timeout: 0.25s
      type: strict_dns
      lb_policy: round_robin
      load_assignment:
        cluster_name: service_1
        endpoints:
          - lb_endpoints:
              - endpoint:
                  address:
                    socket_address:
                      address: localhost
                      port_value: 1234

설명:

  • Admin Endpoint (9901): Envoy 상태를 확인하거나 config를 덤프 받을 수 있는 내부용 HTTP 서버
  • Listener (10000): 클라이언트의 요청을 수신하는 엔트리 포인트
  • HttpConnectionManager: HTTP 요청을 처리하는 핵심 필터
  • Route 설정: 어떤 요청을 어떤 클러스터(service_1)로 보낼지 정의
  • Cluster 설정: 실제 백엔드(여기선 localhost:1234) 정의

4. Envoy 실행 및 테스트

envoy -c demo.yaml

정상적으로 실행되었다면 다음과 같이 테스트를 진행할 수 있다. 이때 3개의 터미널을 활용하면 테스트 흐름을 직관적으로 파악할 수 있다.

터미널 구성 예시

터미널 1: Envoy 실행

envoy -c demo.yaml

터미널 2: 백엔드 서버 실행 (간단한 Python HTTP 서버)

python3 -m http.server 1234

터미널 3: Envoy를 통한 요청 테스트

curl http://localhost:10000/

→ 정상적으로 Python 서버의 디렉터리 listing HTML이 응답된다면 성공이다. 이는 Envoy가 수신한 요청을 백엔드 서버(1234 포트)로 라우팅하고, 응답을 다시 클라이언트로 반환하고 있다는 것을 의미한다.

만약 curl 명령을 통해 / 루트로 요청을 보냈을 때, Directory listing for / HTML 페이지가 출력된다면 이는 Python의 기본 HTTP 서버가 정상적으로 작동하고 있으며 Envoy가 해당 요청을 제대로 전달하고 있다는 증거다.

실습 중 주의할 점

  • localhost:1234로 열리는 백엔드 서버는 반드시 Envoy 실행 이전 혹은 동시에 열어야 정상적으로 동작함
  • Admin 포트 9901은 브라우저에서 http://localhost:9901로 접근해 상태를 확인하거나 /config_dump, /stats와 같은 endpoint 호출도 가능

0개의 댓글