Ssoon
2주차 : Istio 데이터 플레인 > The Envoy proxy : Envoy 프록시란 무엇인가요? 본문
2주차 : Istio 데이터 플레인 > The Envoy proxy : Envoy 프록시란 무엇인가요?
구구달스 2025. 4. 15. 13:24CloudNet@ 가시다님이 진행하는 Istio Hands-on Study [1기]
🚀 Envoy Proxy란 무엇일까?
Envoy Proxy는 분산 시스템에서 발생하는 복잡한 네트워크 문제를 해결하기 위해 Lyft에서 개발된 오픈 소스 프로젝트입니다. 2016년 9월에 처음 공개되었고, 2017년 9월에는 **Cloud Native Computing Foundation(CNCF)**에 합류하며 클라우드 네이티브 생태계의 중요한 일원이 되었습니다. Envoy는 **C++**로 작성되어 높은 성능과 안정성을 자랑하며, 특히 높은 부하에서도 안정적이고 예측 가능한 동작을 보장합니다.
Envoy는 **C++**로 작성된 고성능 프록시로, CNCF 소속이며 분산 시스템의 네트워크 문제를 해결합니다.
🛠️ 프록시의 역할: 네트워크의 중재자
프록시는 클라이언트와 서버 사이에 위치하여 네트워크 통신을 중재하는 중요한 구성 요소입니다. 클라이언트와 서버 간의 중간자 역할을 하며, 보안, 개인 정보 보호, 부하 분산(load balancing) 같은 추가 기능을 제공합니다. 예를 들어, 여러 서버 인스턴스로 구성된 서비스가 있을 때, 클라이언트는 어떤 인스턴스에 연결해야 할지 몰라도 프록시가 이를 대신 처리해줍니다.
프록시는 클라이언트와 서버 사이에서 중재자 역할을 하며, 보안, 부하 분산, 트래픽 관리를 지원합니다.
🌐 Envoy의 설계 원칙: 투명한 네트워크
Envoy는 **"네트워크는 애플리케이션에게 투명해야 한다"**는 철학을 바탕으로 설계되었습니다. 네트워크나 애플리케이션에 문제가 발생했을 때, 문제의 원인을 쉽게 파악할 수 있어야 합니다. 이를 위해 Envoy는 네트워크의 복잡성을 애플리케이션에서 분리하고, 개발자가 네트워크 문제에 신경 쓰지 않도록 돕습니다.
Envoy는 네트워크를 애플리케이션에 투명하게 만들어 문제를 쉽게 진단할 수 있도록 설계되었습니다.
🔄 부하 분산과 서비스 보호
Envoy는 **부하 분산(load balancing)**을 통해 트래픽을 여러 서버 인스턴스에 효율적으로 분배합니다. 클라이언트는 복잡한 백엔드 구조를 알 필요 없이 단일 프록시 주소로 요청을 보내면 됩니다. 또한, Envoy는 백엔드 인스턴스의 상태를 체크하여 health checking을 수행하고, 문제가 있는 인스턴스를 자동으로 제외해 안정적인 서비스를 제공합니다.
Envoy는 부하 분산과 health checking을 통해 클라이언트를 백엔드 복잡성으로부터 보호합니다.
📡 Layer 7 이해: 똑똑한 프록시
Envoy는 단순한 연결 레벨(L3/L4) 프록시를 넘어 Layer 7 프로토콜(애플리케이션 레벨)을 이해하는 강력한 프록시입니다. 기본적으로 HTTP/1.1, HTTP/2, gRPC 같은 프로토콜을 지원하며, 요청 타임아웃, 재시도, 회로 차단(circuit breaking) 같은 고급 기능을 제공합니다. 이러한 기능은 시스템의 **복원력(resilience)**을 높여줍니다.
Envoy는 Layer 7 프로토콜을 이해해 타임아웃, 재시도, 회로 차단 같은 고급 기능을 제공합니다.
🔧 확장 가능성: 다양한 프로토콜 지원
Envoy는 기본 지원 프로토콜 외에도 확장 가능성이 뛰어납니다. MongoDB, DynamoDB, AMQP 같은 데이터베이스 및 비동기 프로토콜을 위한 필터를 추가할 수 있습니다. 이를 통해 Envoy는 다양한 환경에서 유연하게 동작하며, 애플리케이션의 요구사항에 맞춰 커스터마이징이 가능합니다.
Envoy는 확장 가능하여 MongoDB, DynamoDB, AMQP 같은 프로토콜을 지원할 수 있습니다.
📊 텔레메트리: 시스템의 맥박 체크
Envoy는 애플리케이션 트래픽을 분석하여 텔레메트리(telemetry) 데이터를 수집합니다. 이를 통해 요청 처리 시간, 서비스의 처리량(throughput), 에러율 같은 중요한 지표를 제공합니다. 특히, 분산 시스템에서 문제가 발생했을 때 빠르게 원인을 파악하는 데 큰 도움을 줍니다.
Envoy는 텔레메트리를 통해 요청 시간, 처리량, 에러율 같은 데이터를 수집해 시스템 상태를 모니터링합니다.
🛡️ 애플리케이션 독립성: 언어와 상관없이
Envoy는 out-of-process로 실행되어 애플리케이션과 독립적으로 동작합니다. 따라서 어떤 프로그래밍 언어나 프레임워크로 작성된 애플리케이션이라도 Envoy의 기능을 활용할 수 있습니다. 마이크로서비스뿐만 아니라 모놀리스나 레거시 애플리케이션에서도 Envoy를 사용할 수 있습니다.
Envoy는 언어와 프레임워크에 독립적이며, 모든 애플리케이션에서 사용 가능합니다.
🌍 다양한 배포 패턴: 유연한 활용
Envoy는 엣지 프록시(클러스터 입구), 공유 프록시(호스트 또는 서비스 그룹), 사이드카 프록시(서비스별 프록시) 등 다양한 역할로 배포될 수 있습니다. 특히 Istio 같은 서비스 메시에서는 각 서비스 인스턴스에 Envoy를 사이드카로 배포해 최대한의 유연성과 성능을 제공합니다. 엣지와 서비스 내부에서 동일한 프록시를 사용하면 인프라 운영이 더 간단해집니다.
Envoy는 엣지, 공유, 사이드카 등 다양한 배포 패턴을 지원하며, Istio와 통합 가능합니다.
🔗 서비스 메시와의 통합
Envoy는 서비스 메시에서 중요한 역할을 합니다. 예를 들어, Istio에서는 Envoy를 사용해 트래픽을 클러스터 입구부터 개별 서비스까지 완벽히 제어하고 관찰할 수 있습니다. 이를 통해 요청의 전체 흐름을 추적하고, 시스템의 동작을 더 잘 이해할 수 있습니다.
Envoy는 서비스 메시에서 트래픽을 제어하고 관찰하며, Istio와 함께 요청 흐름을 추적합니다.
Envoy Proxy는 네트워크의 복잡성을 줄이고, 시스템의 안정성과 가시성을 높이는 강력한 도구입니다.
🚀 1. Envoy Proxy의 핵심 기능 소개
Envoy Proxy는 서비스 간 통신을 강화하는 다양한 기능을 제공하는 강력한 도구입니다.
Envoy의 핵심 개념은 Listeners, Routes, Clusters로, 이들은 애플리케이션 트래픽을 처리하는 데 핵심적인 역할을 합니다.
Envoy는 Listeners, Routes, Clusters를 통해 트래픽을 관리하며, 다양한 네트워크 기능을 제공합니다.
🔌 Listeners: 외부와의 연결 창구
Listeners는 Envoy가 외부 애플리케이션과 연결되는 포트를 여는 역할을 합니다. 예를 들어, 포트 80에 설정된 Listener는 들어오는 트래픽을 받아 설정된 동작을 적용합니다. 이는 Envoy가 외부 요청을 받아들이는 첫 번째 관문이라고 생각하면 됩니다.
Listeners는 외부 트래픽을 받아들이는 포트를 열고, 트래픽에 설정된 규칙을 적용합니다.
🛤️ Routes: 트래픽의 길잡이
Routes는 Listener를 통해 들어온 트래픽을 어떻게 처리할지에 대한 규칙을 정의합니다. 예를 들어, /catalog 경로로 들어온 요청은 catalog 클러스터로 보내도록 설정할 수 있습니다. Routes는 트래픽을 올바른 목적지로 안내하는 길잡이 역할을 합니다.
Routes는 들어온 요청을 특정 클러스터로 라우팅하는 규칙을 정의합니다.
🖥️ Clusters: 트래픽의 최종 목적지
Clusters는 Envoy가 트래픽을 보내는 실제 업스트림 서비스를 나타냅니다. 예를 들어, catalog-v1과 catalog-v2는 각각 별도의 클러스터로 설정될 수 있으며, Routes는 트래픽을 v1 또는 v2로 보낼지 결정합니다. Clusters는 Envoy가 최종적으로 트래픽을 전달하는 대상입니다.
Clusters는 트래픽이 최종적으로 도달하는 업스트림 서비스를 정의합니다.
🌐 트래픽 흐름: Downstream에서 Upstream으로
Envoy는 트래픽의 방향성을 Downstream과 Upstream으로 구분합니다. Downstream 시스템에서 Listener를 통해 요청이 들어오면, Routes를 거쳐 적절한 Cluster로 라우팅되고, 최종적으로 Upstream 시스템으로 전달됩니다. 이 흐름은 Envoy의 기본 동작 방식입니다.
Envoy는 Downstream에서 Upstream으로 트래픽을 라우팅하며, Listener → Routes → Cluster로 이어집니다.
🔍 Service Discovery: 서비스를 자동으로 찾기
Envoy는 클라이언트 측 Service Discovery를 자동으로 처리해 애플리케이션이 서비스 엔드포인트를 직접 찾지 않아도 되도록 만듭니다. 간단한 REST API를 통해 Consul, ZooKeeper, Eureka 같은 서비스 디스커버리 시스템과 연동할 수 있습니다. 특히, Envoy는 eventually consistent 방식으로 동작해 분산 시스템의 불확실성을 잘 처리합니다.
Envoy는 Service Discovery를 자동화해 애플리케이션이 엔드포인트를 직접 찾을 필요를 없앱니다.
⚖️ Load Balancing: 트래픽을 똑똑하게 분배
Envoy는 Load Balancing 알고리즘을 통해 트래픽을 효율적으로 분배합니다. 특히 Locality-aware Load Balancing은 동일 지역 내 인스턴스에 트래픽을 우선적으로 보내 장애를 줄입니다. 지원하는 알고리즘은 다음과 같습니다:
- Random
- Round Robin
- Weighted Least Request
- Consistent Hashing (Sticky)
Envoy는 Locality-aware Load Balancing을 포함한 다양한 Load Balancing 알고리즘으로 트래픽을 최적화합니다.
🚦 Traffic Routing: 정교한 트래픽 관리
Envoy는 HTTP/1.1, HTTP/2 같은 애플리케이션 프로토콜을 이해해 정교한 Traffic Routing을 지원합니다. 기본적인 Reverse Proxy 라우팅뿐만 아니라 헤더 기반 라우팅, 우선순위 기반 라우팅, 재시도, 타임아웃, 장애 주입(fault injection) 같은 고급 기능도 제공합니다.
Envoy는 Traffic Routing을 통해 헤더, 우선순위, 재시도 등 정교한 트래픽 관리 기능을 제공합니다.
🔀 Traffic Shifting & Shadowing: 안전한 배포 지원
Envoy는 Traffic Shifting을 통해 트래픽을 비율 기반으로 분배해 Canary Release 같은 배포 전략을 지원합니다. 또한, Traffic Shadowing은 실제 트래픽의 복사본을 만들어 새로운 서비스 버전에 테스트할 수 있게 해줍니다. 이는 프로덕션 트래픽에 영향을 주지 않고 테스트할 수 있는 강력한 기능입니다.
Envoy는 Traffic Shifting과 Shadowing으로 Canary Release와 안전한 테스트를 지원합니다.
🛡️ Network Resilience: 안정적인 네트워크 보장
Envoy는 네트워크 안정성을 높이는 기능을 제공합니다. 요청 타임아웃, 재시도, Circuit Breaking(Outlier Detection), 연결 수 제한 같은 Bulkheading 기능을 통해 장애를 방지합니다. 하지만 재시도 증폭 같은 문제를 피하기 위해 애플리케이션도 적절한 설정이 필요합니다.
Envoy는 타임아웃, 재시도, Circuit Breaking으로 네트워크 안정성을 강화합니다.
🌐 HTTP/2 & gRPC: 최신 프로토콜 지원
Envoy는 HTTP/2와 gRPC를 기본 지원합니다. HTTP/2는 단일 연결에서 요청 다중화, 서버 푸시, 스트리밍을 제공하며, Envoy는 HTTP/1.1과 HTTP/2 간 상호 변환도 가능합니다. gRPC는 HTTP/2 기반의 RPC 프로토콜로, Envoy가 이를 원활히 처리합니다.
Envoy는 HTTP/2와 gRPC를 지원하며, 프로토콜 간 상호 변환으로 유연성을 제공합니다.
📊 Observability: Metrics로 시스템 이해
Envoy는 시스템 상태를 이해하기 위해 다양한 Metrics를 수집합니다. Downstream, 서버, Upstream 클러스터에 대한 통계를 Counter, Gauge, Histogram 형태로 제공하며, StatsD, Datadog, Hystrix 같은 형식으로 내보낼 수 있습니다.
Envoy는 Metrics를 통해 시스템의 상태를 추적하며, 다양한 포맷으로 내보내기 가능합니다.
🔎 Distributed Tracing: 트래픽 흐름 추적
Envoy는 OpenTracing을 지원해 트래픽 흐름, 지연 시간, 호출 경로를 시각화합니다. 애플리케이션은 Zipkin 헤더를 전달해야 하지만, Envoy는 x-request-id와 초기 x-b3* 헤더를 생성해 추적을 돕습니다.
Envoy는 OpenTracing으로 트래픽 흐름을 추적하며, Zipkin 헤더를 지원합니다.
🔒 TLS Termination & Origination: 보안 강화
Envoy는 TLS Termination을 통해 클러스터 엣지나 내부 서비스에서 TLS 트래픽을 처리합니다. 또한, 애플리케이션을 대신해 TLS Origination을 수행해 언어별 TLS 설정의 복잡성을 줄입니다. Mutual TLS도 지원해 보안을 강화합니다.
Envoy는 TLS Termination과 Origination으로 보안을 강화하며, Mutual TLS를 지원합니다.
🚨 Rate Limiting: 자원 보호
Envoy는 Rate Limiting을 통해 데이터베이스, 캐시 같은 자원을 보호합니다. 연결 단위(네트워크)와 요청 단위(HTTP)로 제한을 설정해 과도한 요청을 방지하고, 공정성을 유지합니다.
Envoy는 Rate Limiting으로 자원을 보호하고, 공정한 트래픽 분배를 지원합니다.
🧩 Extending Envoy: 맞춤형 확장
Envoy는 Layer 7 프로토콜을 처리하는 엔진으로, Filter를 통해 확장 가능합니다. **C++**로 작성된 필터를 추가하거나, Lua 스크립트, **WebAssembly(Wasm)**로 간단히 확장할 수 있습니다. 이는 Envoy를 특정 용도에 맞게 커스터마이징하는 강력한 방법입니다.
Envoy는 Filter, Lua, WebAssembly로 확장 가능해 다양한 요구사항에 대응합니다.
Envoy Proxy의 다양한 기능은 네트워크를 더 안전하고, 효율적이며, 관찰 가능하게 만듭니다.
🚀 2. Envoy Proxy와 다른 프록시 비교
Envoy Proxy는 애플리케이션 간 통신을 위한 서비스 프록시로서 강력한 기능을 제공합니다. 다른 프록시들은 주로 로드 밸런서나 웹 서버에서 시작해 점차 발전했지만, Envoy는 처음부터 서비스 간 통신의 **신뢰성(reliability)**과 **관찰 가능성(observability)**을 해결하는 데 초점을 맞췄습니다.
Envoy는 서비스 프록시로 설계되어 애플리케이션 간 통신의 신뢰성과 관찰 가능성에 강점을 가집니다.
🛠️ Envoy의 강점: 애플리케이션 프록시의 최적화
Envoy는 애플리케이션 간 통신을 중재하는 서비스 프록시 역할에 최적화되어 있습니다. 다른 프록시들은 로드 밸런서나 웹 서버에서 발전하며 다양한 역할을 수행하지만, Envoy는 특히 서비스 간 통신에서 발생하는 문제를 해결하는 데 집중합니다. 이는 Envoy가 신뢰성과 관찰 가능성을 높이는 데 탁월한 이유입니다.
Envoy는 서비스 프록시로서 애플리케이션 간 통신에 최적화되어 있습니다.
🌐 Extensibility with WebAssembly: 확장의 유연성
Envoy는 **WebAssembly(Wasm)**를 활용한 확장성을 제공합니다. 이를 통해 새로운 기능을 쉽게 추가하거나 기존 기능을 커스터마이징할 수 있습니다. 다른 프록시들은 확장이 제한적이거나 복잡한 경우가 많지만, Envoy는 WebAssembly를 통해 유연하고 강력한 확장을 지원합니다.
Envoy는 WebAssembly로 쉽게 확장 가능해 다양한 요구사항에 대응합니다.
🤝 Open Community: 활발한 오픈 소스 생태계
Envoy는 오픈 소스 프로젝트로, 활발한 커뮤니티의 지원을 받습니다. 반면, 일부 프록시는 클로즈드 소스이거나 커뮤니티 활동이 느려 발전 속도가 더딥니다. Envoy의 오픈 커뮤니티는 빠른 업데이트와 다양한 기여를 통해 지속적으로 발전합니다.
Envoy는 오픈 커뮤니티를 통해 빠르고 지속적인 발전을 이룹니다.
🧩 Modular Codebase: 유지보수와 확장을 위한 설계
Envoy의 코드는 모듈화되어 있어 유지보수와 확장이 용이합니다. 이는 새로운 기능을 추가하거나 기존 코드를 수정할 때 큰 장점이 됩니다. 다른 프록시들은 모듈화가 덜 되어 있어 유지보수가 복잡할 수 있지만, Envoy는 깔끔한 코드 구조로 이러한 문제를 해결합니다.
Envoy는 모듈화된 코드베이스로 유지보수와 확장이 쉽습니다.
🌍 HTTP/2 Support: 최신 프로토콜 완벽 지원
Envoy는 HTTP/2를 업스트림과 다운스트림 모두에서 완벽히 지원합니다. 이는 요청 다중화, 서버 푸시 같은 최신 네트워크 기능을 활용할 수 있게 해줍니다. 일부 프록시는 HTTP/2 지원이 제한적이거나 불완전하지만, Envoy는 이를 기본적으로 제공합니다.
Envoy는 HTTP/2를 업스트림과 다운스트림에서 완벽히 지원합니다.
📊 Deep Protocol Metrics Collection: 깊이 있는 관찰 가능성
Envoy는 프로토콜 수준의 메트릭을 수집해 시스템 상태를 상세히 관찰할 수 있도록 돕습니다. 요청 처리 시간, 에러율, 처리량 같은 데이터를 제공해 네트워크 문제를 빠르게 진단할 수 있습니다. 다른 프록시들은 메트릭 수집이 제한적이거나 덜 세밀한 경우가 많습니다.
Envoy는 프로토콜 수준 메트릭으로 깊이 있는 관찰 가능성을 제공합니다.
⚙️ C++ / Non-Garbage-Collected: 고성능과 안정성
Envoy는 **C++**로 작성되어 Garbage Collection이 없으므로 높은 성능과 안정성을 자랑합니다. 이는 특히 높은 부하에서도 안정적인 동작을 보장합니다. 다른 프록시들은 Garbage Collection을 사용하는 언어로 작성된 경우가 많아 성능 저하가 발생할 수 있습니다.
Envoy는 **C++**로 작성되어 Garbage Collection 없이 고성능과 안정성을 제공합니다.
🔄 Dynamic Configuration: 재시작 없이 설정 변경
Envoy는 Dynamic Configuration을 지원해 프록시를 재시작하지 않고도 설정을 변경할 수 있습니다. 이는 서비스 중단 없이 빠르게 설정을 업데이트할 수 있는 큰 장점입니다. 다른 프록시들은 설정 변경 시 재시작이 필요한 경우가 많아 운영이 복잡할 수 있습니다.
Envoy는 Dynamic Configuration으로 재시작 없이 설정 변경이 가능합니다.
📝 요약: Envoy가 다른 프록시보다 뛰어난 이유
Envoy Proxy는 서비스 프록시로서 애플리케이션 간 통신에 최적화된 도구로, WebAssembly를 통한 확장성, 활발한 오픈 커뮤니티, 모듈화된 코드베이스, HTTP/2 지원, 프로토콜 메트릭 수집, C++ 기반 고성능, Dynamic Configuration 같은 강점을 가지고 있습니다. 이러한 기능들은 Envoy를 다른 프록시들과 차별화하며, 신뢰성과 관찰 가능성을 높이는 데 큰 역할을 합니다.
'Istio Hands-on Study [1기]' 카테고리의 다른 글
2주차 : Istio 데이터 플레인 > The Envoy proxy : Envoy in action (0) | 2025.04.15 |
---|---|
2주차 : Istio 데이터 플레인 > The Envoy proxy : Envoy 구성 (0) | 2025.04.15 |
1주차 : Istio 첫걸음 (7) - Traffic Routing (0) | 2025.04.12 |
1주차 : Istio 첫걸음 (6) - Resiliency (0) | 2025.04.12 |
1주차 : Istio 첫걸음 (5) - Observability (0) | 2025.04.12 |