스터디/Istio

Istio 스터디 2주차 - <Envoy 란?>

황동리 2025. 4. 16. 09:57
반응형

CloudNet@ 가시다님이 진행하는 Istio 스터디 1기 - 2주차 정리 내용 입니다.

 

앞서 진행했던 주차를 보고 오시면 이해가 빠릅니다.

 

2025.04.07 - [스터디/Istio] - Istio 스터디 - 1주차 <서비스 메시와 Istio>

2025.04.09 - [스터디/Istio] - Istio 스터디 - 1주차


📌 Envoy 란?

Envoy는 분산 시스템을 구축할 때 발생하는 어려운 애플리케이션 네트워킹 문제를 해결하고자 개발 되었습니다.

 

Envoy는 두 가지 중요한 원칙이 있습니다.

  • 애플리케이션 네트워크는 투명해야한다.
  • 네트워크 및 애플리케이션 문제가 발생할 때는 문제의 원인 파악이 쉬워야 한다.

더 나아가 Envoy는 프록시 입니다.

여기서 프록시(Proxy)란?

 

프록시는 클라이언트와 서버 중간에 위치하여, 네트워크 아키텍처의 중개 구성요소 입니다.

 

추가적인 설명을 위해 예시를 들어보겠습니다.


위 그림 처럼 Service A가 3노드 클러스터로 구성이 되어있고, 각 노드들은 일정량의 부하를 견딜 수 있다고 가정하겠습니다.

여기서 프록시는 어떠한 일을 하는지 알아보도록 하겠습니다.

🛠️ 프록시의 역할

  • 클라이언트가 서비스와 통신할 때 알아야 할 정보를 단순화 시킵니다.
  • 즉, 클라이언트는 서비스의 인스턴스 IP를 알 필요 없이 프록시 하고만 통신을 하면 됩니다.

🛠️ 서비스 인스턴스 집합

  • 이미지에서 보면 Servie A 인스턴스는 각 7.7.7.7, 8.8.8.8, 9.9.9.9 IP 를 가지고 있는데, 프록시는 이 인스턴스들을 백엔드로 관리하고 있습니다.

🛠️ 로드 밸런싱 처리

  • 클라이언트는 프록시(IP: 2.2.2.2)에 요청을 보내고, 프록시는 해당 요청을 적절한 서비스 인스턴스로 분산 전송을 합니다.
  • 백엔드 인스턴스가 실패하거나 장애가 발생해도, 프록시는 이를 감지하고 다른 정상 인스턴스로 라우팅 해줍니다.

 

실제 Envoy 프록시가 동작 하기 위해 핵심 구성 요소를 살펴보면,

 

🛠️ 1. 리스너(Listeners)

  • 역할: 클라이언트로부터 요청을 받을 수 있는 포트 노출
  • 예시: 80번 포트에서 요청이 들어오면, Envoy가 이 요청을 받아서 내부 규칙에 따라 처리

🛠️ 2. 라우트(Routes)

  • 역할: 들어온 요청을 어떻게 처리할지 정하는 규칙
  • 예시: 요청이 들어오고, /catalog 에 일치하면, 그 트래픽을 catalog 클러스터로 보냄

🛠️ 3. 클러스터(Cluster)

  • 역할: 요청을 보낼 실제 백엔드 서버나 서비스 그룹을 정의
  • 예시: catalog-v1, catalog-v2 두 버전의 서비스가 있다면, 각각 별도의 클러스터로 묶을 수 있습니다.

이제 Envoy 프록시에 대해 자세히 알아보겠습니다.

✅ Envoy 프록시의 기능

Envoy는 고성능 L7 프록시이자 서비스 프록시로, 마이크로서비스 간의 통신을 추상화하고, 관찰 가능성, 보안, 로드 밸런싱, 장애 복구 등을 제공합니다.

 

현재는 Istio와 같은 서비스 메시(Service Mesh) 아키텍처의 핵심 컴포넌트로도 사용됩니다.

🔹 주요 특징

🔍 서비스 디스커버리 (Service Discovery)

 

Envoy는 클라이언트 애플리케이션이 직접 서비스 위치를 알아야 하는 전통적인 방식과 다르게, 자동으로 서비스 디스커버리를 수행합니다.

 

디스커버리 API를 통해 HashiCorp Consul, Eureka, Zookeeper 같은 외부 시스템과 통합할 수 있으며, Istio의 컨트롤 플레인은 이를 기본적으로 구현하고 있습니다.

 

분산 시스템에서는 모든 서비스의 상태를 실시간으로 파악하는 것이 불가능하기 때문에,
Envoy는 능동적/수동적 헬스 체크를 통해 가능한 한 "최선의 상태"를 유지하는 방식으로 설계되어 있습니다.

 

⚖️ 로드 밸런싱 (Load Balancing)

 

Envoy는 다양한 고급 로드 밸런싱 알고리즘을 기본으로 지원합니다.

  • 랜덤(Random)
  • 라운드 로빈(Round Robin) / 가중치 라운드 로빈
  • 최소 요청 기반(Least Request)
  • 일관 해싱(Consistent Hashing) – sticky 세션용

또한 지역 인식(Locality-aware) 로드 밸런싱 기능을 제공하여, 가능한 한 동일 지역 내에서 트래픽이 라우팅되도록 최적화할 수 있습니다.

 

📍 정교한 트래픽 라우팅

 

Envoy는 HTTP 1.1과 HTTP/2를 모두 지원하면서, 헤더 기반, 우선순위 기반, 경로 기반 라우팅을 매우 정교하게 설정할 수 있습니다.

 

또한 재시도, 타임아웃, 오류 주입까지도 설정 가능해, 단순 리버스 프록시 이상의 라우팅 제어가 가능합니다.

 

🔄 트래픽 전환 & 섀도잉 (Canary Release / Traffic Shadowing)

 

CD(지속적 배포)를 위한 기능도 내장되어 있습니다.

 

예를 들어, 비율 기반의 트래픽 분할로 Canary 릴리스를 쉽게 구현할 수 있고, 실제 사용자 요청의 복사본을 별도로 전송하는 "트래픽 섀도잉(shadowing)"도 가능합니다.

 

이로써 라이브 트래픽에 영향을 주지 않으면서 새로운 기능을 테스트할 수 있죠.

 

🛡️ 네트워크 복원력 (Resilience)

 

네트워크 장애에 대한 복원력도 뛰어납니다. Envoy는 다음과 같은 기능을 제공합니다.

  • 타임아웃 / 재시도 설정
  • 연결 수 제한 & 임계값 초과 시 빠른 실패 처리
  • 서킷 브레이커 및 이상값 감지(Outlier Detection) 로 장애 노드를 자동으로 격리

단, 이러한 설정은 Envoy가 자동으로 처리하는 것이 아니라 애플리케이션 개발자가 설정을 잘 조정해야 한다는 점은 주의해야 합니다.

 

🌐 HTTP/2 및 gRPC 완벽 지원

 

Envoy는 처음부터 HTTP/1.1과 HTTP/2를 모두 지원하도록 개발되었으며, 다운스트림/업스트림 간 프로토콜 변환도 자유롭습니다.

 

gRPC도 기본 지원되며, 이를 통해 스트리밍, 백프레셔 등 고급 기능을 안정적으로 사용할 수 있습니다.

 

📊 메트릭 수집과 관찰 가능성 (Observability)

 

네트워크 트래픽을 관찰(Observability) 할 수 있는 다양한 메트릭도 함께 수집합니다.

 

Envoy는 카운터, 게이지, 히스토그램 등 여러 통계를 추적하며, 이를 Prometheus 등과 연동하면 강력한 모니터링 환경을 구축할 수 있습니다.

 

🧩 분산 트레이싱을 통한 관찰 가능성 (Distributed Tracing)

 

서비스 메시 환경에서는 단일 요청이 여러 마이크로서비스를 거치며 처리됩니다.


Envoy는 이 호출 흐름을 추적하기 위해 분산 트레이싱 기능을 지원합니다.

  • Envoy는 OpenTracing 엔진(예: Zipkin, Jaeger)과 통합되어, 트레이스 스팬 정보를 자동으로 전송합니다.
  • 애플리케이션이 별도의 트레이싱 라이브러리를 설치할 필요는 없지만, 아래와 같은 헤더를 전달해줘야 트레이스를 연결할 수 있습니다.
x-b3-traceid
x-b3-spanid
x-b3-parentspanid
x-b3-sampled
x-b3-flags
  • 이를 위해 간단한 래퍼 라이브러리를 사용할 수 있고, Envoy는 요청마다 x-request-id 헤더도 생성하여 트래픽 연관성을 유지합니다.

 

🔐 자동 TLS 종료 및 시작 (Automatic TLS Termination & Origination)

 

보안 측면에서도 Envoy는 매우 강력한 기능을 제공합니다.

  • TLS 종료: Envoy는 에지에서 들어오는 TLS 트래픽을 해제(Terminate)하고 평문으로 내부 서비스에 전달할 수 있습니다.
  • TLS 시작: 반대로, Envoy가 업스트림으로 향하는 트래픽을 TLS로 전환(Originate) 할 수도 있습니다.

즉, 개발자가 직접 TLS를 구성하거나 인증서를 애플리케이션에 적용할 필요 없이, Envoy가 알아서 처리해줍니다. Istio 환경에서는 이를 기반으로 mTLS도 자동으로 적용됩니다.

 

⏱️ 속도 제한 (Rate Limiting)

 

시스템 보호를 위한 속도 제한 기능도 빼놓을 수 없습니다.

  • Envoy는 네트워크 커넥션 단위, HTTP 요청 단위 등 다양한 레벨에서 Rate Limiting을 지원합니다.
  • 특히 전역 속도 제한 서비스와 연동하여 과도한 요청을 차단하거나 리소스 보호를 위한 공정한 요청 분배를 할 수 있습니다.
  • 이는 재시도 폭주나 장애 전파 방지를 위한 복원력 확보 전략으로 매우 중요합니다.

🛠️ 엔보이 확장하기 (Extending Envoy)

 

Envoy는 고정된 기능만을 사용하는 것이 아니라, 필요에 따라 동적으로 확장할 수 있도록 설계되었습니다.

  • 필터(Filter): Envoy의 핵심은 L7 계층 트래픽을 처리하는 다양한 필터 체인입니다.
  • 필터는 C++로 작성되어 Envoy 바이너리에 컴파일됩니다.
  • 경량 확장: 루아(Lua) 스크립트와 WebAssembly(Wasm) 기반의 확장도 지원되어, 더 유연하고 덜 침습적인 방식으로 기능을 커스터마이징할 수 있습니다.

 

일반 프록시와의 차이점을 표로 알아보면 아래와 같습니다.

 

항목 일반 프록시 Envoy 프록시
계층 L3/L4 (IP, TCP 중심) L7 (HTTP, gRPC 등)
동적 구성 수동 설정 필요 xDS API를 통한 동적 구성 가능
서비스 디스커버리 없음 (고정 IP 설정) 있음 (자동 발견, 재구성 가능)
로드 밸런싱 단순 알고리즘 (라운드로빈 등 제한적) 다양한 알고리즘과 조건 기반 라우팅 지원
트래픽 제어 제한적 리트라이, 타임아웃, circuit breaker 등 고급 기능
보안 TLS 지원은 일부 mTLS 기본 지원, 인증/인가 가능
관측성 로그 수준 메트릭, 로그, 트레이싱 연동 가능 (Prometheus, Zipkin 등)
사용 예시 nginx, HAProxy Istio, Consul Connect, AWS App Mesh 등

 

위와 같은 특징들이 존재하며,

 

Envoy 프록시는 서비스 메시의 진입점으로 사용되어 클러스터에 들어오는 트래픽을 완벽히 제어하고 관찰할 수 있습니다.

📝 정리

Envoy는 단순한 프록시를 넘어서, 보안, 성능, 관찰 가능성, 확장성 등 모든 면에서 뛰어난 기능을 제공하는 프록시 입니다.

 

이러한 기능들 덕분에 Envoy는 다양한 기업 환경과 복잡한 요구사항에도 유연하게 대응할 수 있습니다.


다음 글에서는 Envoy 구성도 해보고 실습도 해보겠습니다.

 

감사합니다.

반응형