Envoy 프록시
- Envoy는 L7 프록시로, 분산 시스템 구축 시 어려운 애플리케이션 네트워킹 문제 해결을 위해 리프트가 개발했다.
- 2016년 9월 오픈소스 프로젝트로 공개하였고, 1년 후(2017년 9월) CNCF 합류하였다.
- C++로 작성되었다. (목표: 성능 향상, 높은 부하에서 더 안정적 이게끔 만들기)
- 중요 원칙 2가지
- 네트워크는 투명해야 한다
- 원인 파악이 쉬워야 한다.
- 텔레메트리를 제공해준다. 문제 원인을 파악하기 쉬워야하므로 메트릭이 기본적으로 제공이 되어야 하는 원칙을 가지고 있다.
(이로 인해 개발자가 별도 작업없이 원인 파악 및 최적화 등이 가능하며, 편리하다.)
- 프록시다.
Client-Proxy-Service
- 클라이언트-서버 간 통신 중간에 위치하여, 네트워크 Arch에서 중개 구성 요소이다.
- 클라이언트는 서비스 인스턴스의 IP를 직접 알 필요 없이 프록시와만 통신하면 된다.
(ex. Client에서 Service A와 통신하려면, 직접 IP 확인 없이 프록시인 2.2.2.2 IP로만 요청. 이후 프록시가 라우팅)
- 프록시는 여러 서비스 인스턴스를 백엔드로 관리하며, 로드 밸런싱을 통해 트래픽을 적절히 분산하고, 장애가 발생한 인스턴스를 자동으로 감지해 다른 정상 인스턴스로 라우팅한다.
- 중간에 위치함으로서 보안, 프라이버시, 정책 수행 가능하다. (envoy에서 접속 제한, 프록시 제한 걸 수 있다.)
- 리버스 프록시로서 로드 밸런싱 처리 간 인스턴스 상태 검사 및 실패/오동작 백엔드 인스턴스 우회 라우팅이 가능하다.
- 사실 envoy 에서 가능한 기능을 통해 istio의 기능이 제공되는 것 (서비스 간 통신을 중계하고, 네트워크 트래픽의 관찰 가능성(Observability), 보안, 로드 밸런싱, 장애 복구 등)
- Envoy는 위와 같은 이유로 Istio와 같은 서비스 메시(Service Mesh) 환경에서 핵심 컴포넌트로 사용된다.
Envoy의 핵심 구성 요소
Envoy 구성 요소
Envoy의 트래픽 흐름은 다운스트림(클라이언트) → 리스너 → 라우트 → 클러스터 → 업스트림(백엔드 서비스) 순으로 진행된다.
- 리스너(Listeners): 클라이언트로부터 요청을 받을 포트를 노출한다.
(ex. 80번 포트에서 요청 인입 시, Envoy가 이 요청을 받아서 내부 규칙에 의거하여 처리)
- 라우트(Routes): 들어온 요청을 어떻게 처리할지 결정하는 규칙을 정의한다.
(요청의 경로가 /catalog 면 그 트래픽을 catalog 클러스터로 전달)
- 클러스터(Clusters): 실제 백엔드 서버나 서비스 그룹을 정의한다.
(catalog-v1, catalog-v2 두 개 버전 서비스가 있을 시 개별 클러스터로 그룹화 가능)
Envoy 프록시의 주요 기능
- 서비스 디스커버리
- 디스커버리 API를 통해 외부 시스템(Consul, Eureka, Zookeeper 등)과 통합하여 서비스 위치를 자동으로 탐지한다.
- Istio 컨트롤 플레인은 이를 기본적으로 구현하고 있다.
- 분산 시스템에서는 모든 서비스의 상태를 실시간으로 파악하는 것이 불가능하다.
(Envoy는 능동적/수동적 헬스 체크를 통해 가능한 한 최선의 상태를 유지하는 방식으로 설계된다.)
- 로드 밸런싱
- 랜덤, 라운드로빈, 최소 요청 기반, 일관 해싱(Sticky session 지원 용도) 등 다양한 고급 로드밸런싱 알고리즘을 지원한다.
- 지역 인식(Locality-aware) 로드 밸런싱 기능을 제공하여, 가능한 한 동일 지역 내에서 트래픽이 라우팅되도록 최적화된다.
- 정교한 트래픽 라우팅
- HTTP 1.1과 HTTP/2를 모두 지원하면서, 헤더 기반, 우선순위 기반, 경로 기반 라우팅을 매우 정교하게 설정할 수 있다.
- 재시도, 타임아웃, 오류 주입 설정이 가능하여, 단순한 리버스 프록시 이상의 라우팅 제어가 가능하다.
- 트래픽 전환 및 섀도잉
- Canary 릴리스, 트래픽 섀도잉 등 CD(지속적 배포)를 지원한다.
- 네트워크 복원력
- 타임아웃, 재시도, 서킷 브레이커, 이상값 감지 등 관리자가 장애 대응이 가능하도록 설정을 조정할 수 있다.
- HTTP/2 및 gRPC 지원: 다양한 프로토콜을 완벽하게 지원한다.
- HTTP/1.1과 HTTP/2를 모두 지원하도록 개발되었으며, 다운스트림/업스트림 간 프로토콜 변환도 자유롭다.
- gRPC도 기본 지원되며, 이를 통해 스트리밍, 백프레셔 등 고급 기능을 안정적으로 사용할 수 있다.
- 관찰 가능성: 네트워크 트래픽에 대한 다양한 메트릭을 수집한다. 로그, 분산 트레이싱을 통해 트래픽을 모니터링할 수 있다.
- 카운터, 게이지, 히스토그램 등 여러 통계를 추적한다.
- Prometheus 등과 연동하여 강력한 모니터링 환경 구축이 가능하다.
- 보안
- mTLS, 자동 TLS 종료 및 시작 등을 직접 처리하여 강력한 보안 기능을 제공한다.
- 속도 제한
- 네트워크 및 HTTP 요청 단위로 Rate Limiting을 지원한다.
- 확장성
- C++ 기반 필터, Lua, WebAssembly(Wasm) 등 다양한 방식으로 기능 확장이 가능하다.
Envoy 설정 방식
Envoy는 두 가지 방식으로 설정할 수 있다.
방식 |
장점 |
단점 |
적합한 환경 |
정적 설정 |
간단한 구성, 쉬운 관리 |
변경 시 재시작 필요 |
소규모, 변화가 적은 환경 |
동적 설정 |
실시간 설정 변경, 유연성 높음 |
관리 복잡성 증가 |
대규모, 잦은 변경 환경 |
- 정적 설정은 YAML/JSON 파일로 구성한다.
- 동적 설정은 xDS API를 통해 런타임에 실시간으로 변경할 수 있다.
- Istio에서는 istiod가 xDS API를 구현하여 Envoy 설정을 일관되게 동적으로 관리한다.
Envoy vs 다른 프록시 솔루션 비교
기능 |
Envoy |
NGINX |
HAProxy |
Traefik |
프로그래밍 언어 |
C++ |
C |
C |
Go |
동적 구성 |
xDS API 통한 동적 구성 |
제한적 |
제한적 |
지원 |
서비스 디스커버리 |
자동 발견, 재구성 가능 |
플러그인 필요 |
제한적 |
내장 |
로드 밸런싱 |
다양한 알고리즘과 조건 기반 라우팅 지원 |
기본 알고리즘(Round Robin, Least Connections) |
고급 알고리즘(Round Robin, Least Connections, Source IP Hash 등) |
기본 알고리즘(Round Robin 등) |
트래픽 제어 |
Retry, Timeout, Circuit breaking 등 고급 기능 |
Rate limiting, Timeout |
Rate limiting, Connection 제어 |
Circuit breaking, Retry |
관찰 가능성 |
메트릭, 로그, 트레이싱 연동 가능 (Prometheus, Zipkin 등) |
제한적 |
기본 |
강력 |
분산 추적 |
내장 |
플러그인 필요 |
플러그인 필요 |
지원 |
L7 프록시 |
다양한 프로토콜 |
HTTP 중심 |
HTTP 중심 |
HTTP 중심 |
커뮤니티 |
빠르게 성장 |
매우 큼 |
큼 |
성장 중 |
CNCF 프로젝트 |
졸업 프로젝트 |
아님 |
아님 |
인큐베이팅 |