새소식

인기 검색어

Service_Mesh/Istio

[Istio-2주차] Envoy (이론)

  • -

Envoy 프록시

  • Envoy는 L7 프록시로, 분산 시스템 구축 시 어려운 애플리케이션 네트워킹 문제 해결을 위해 리프트가 개발했다.
  • 2016년 9월 오픈소스 프로젝트로 공개하였고, 1년 후(2017년 9월) CNCF 합류하였다.
  • C++로 작성되었다. (목표: 성능 향상, 높은 부하에서 더 안정적 이게끔 만들기)
  • 중요 원칙 2가지
    1. 네트워크는 투명해야 한다
    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 프로젝트 졸업 프로젝트 아님 아님 인큐베이팅

 

Contents

포스팅 주소를 복사했습니다.

이 글이 도움이 되었다면 공감 부탁드립니다.