본문 바로가기
CNCF Projects/Envoy

Envoy proxy란?

by cscscs 2023. 11. 16.

이번 글에서는 istio를 쓰다 보면 항상 보이는 envoy에 대해 알아보겠습니다. 본 블로그의 글은 v1.28을 기준으로 합니다.

 


 

envoy

Lift사에서 최초 제작한 CNCF의 graduated project중 하나로 가벼운 프록시 서버 역할을 합니다.
여러 Service Mesh에서 envoy를 dataplane을 위한 sidecar로 채택하고 있으며, 예시로 istio가 해당 방식으로 동작합니다.
(*현재 istio 기본은 envoy를 sidecar로 붙이고 있지만, v1.20기준 알파 버전인 ambient 모드로 configure시 daemonset으로 동작합니다.)

envoy를 사이드카로 붙이면 hop이 늘어난다는 단점이 있지만, NginX와 비교하면 성능도 준수하고 복잡해진 MSA 간에 투명한 모니터링을 위해서는 퀀트등의 상황이 아니면 합리적인 선택으로 보입니다.
(*hop을 늘리지 않기 위해 eBPF를 이용한 celium등의 서비스 매쉬들도 있습니다.)

본 블로그의 Envoy 카테고리에서는 envoy에 대해 최대한 깊게 파고들어가볼 예정입니다.

 


envoy 정의

공식 문서에 따르면 envoy는 큰 규모의 현대 service oridented architecture들을 위한 L7(application layer) proxy이자 communication bus입니다.

envoy proxy는 아래 철학에 기반합니다.

네트워크는 어플리케이션에 투명해야 합니다. 네트워크, 어플리케이션 문제가 일어났을 때 둘 중 어디서 문제가 발생했는지 결정하는 것이 쉬워야 합니다.

사실 위 목적을 달성하는 것은 굉장히 어렵습니다. envoy는 high level features을 제공함으로써 (ㅎㄷㄷ;;)  수행하는 것을 시도하고 있습니다.  각 feature에 대해 알아보죠 ㅋ

 


Out of process architecture

Envoy는 모든 application 서버 옆에 붙어서 동작하도록 디자인된 self-contained process입니다. 모든 엔보이는 각 applicaton이 네트워크 topology를 알 필요 없이 localhost와 메세지를 주고 받으면서 통신 가능하게 하면서 투명한 communication mesh를 형성합니다. out of process architecture은 서비스에서 서비스로의 커뮤니케이션에 있어서 전통적인 library 접근법에 비해  두개의 주요한 이점을 갖고 있습니다.

  •  엔보이는 application이 어떤 언어로 작성되었는지에 무관하게 동작합니다. 단일 envoy deployment는 자바, c++, go, php, python사이에서의 mesh를 형성할 수 있습니다. service oriented architecture에서 여러 application 프레임워크와 언어를 사용하는 것은 매우 흔합니다. envoy는 투명하게 그 간격을 이어줄 수 있습니다.
  • 규모가 큰 service oriented architecture에서 작업하는 모두가 아는 것 처럼, library upgrade를 배포하는 것은 굉장히 고통스럽습니다. envoy는 전체 infrastructure을 투명하게 가로지르며 배포되고, 업그레이드 될 수 있습니다.

 


 

L3/L4 filter architecture

envoy의 core에서는 Envoy는 L3/L4 network proxy입니다. pluggable한 filter chain 메커니즘은 filter가 다른 TCP/UDP 프록시 작업을 수행하도록 작성되고 메인 서버에 주입되는 것을 가능하게 합니다. Filter들은 이미 다양한 테스크를 보완하기 위해 작성되어있습니다. (ex. TCP proxy, UDP proxy, HTTP proxy, TLS client certification authN, Redis, MongoDB, Postgres, ...)

 


 

HTTP L7 filter architecture

HTTP는 엔보이가 제공하는 현대 application architecture의 크리티컬한 컴포넌트입니다. 따라서 엔보이는 추가적인 HTTP L7 filter layer을 제공합니다. HTTP filter은 HTTP 커넥션 관리 서브시스템이 buffering, ratelimiting, routing/forwarding, 등의 다양한 작업들을 수행하도록  plug될 수 있습니다. 

 


 

각종 프로토콜 support (First class HTTP/2, HTTP/3 (alpha), gRPC)

envoy가 HTTP mdoe로 동작할 때, HTTP/1.1과 HTTP/2 둘 다 지원합니다. 이로부터 HTTP/1.1 클라이언트와 HTTP/2 타겟 서버가 bridge 될 수 있습니다. 추천되는 동작은 모든 envoy mesh내 서버와 클라가 request와 response가 multiplex될 수 있는 영구적인 connection의 mesh를 이루면서 HTTP/2 통신을 하는 것입니다. HTTP/3도 알파지만 support합니다. grpc도 HTTP/2 위에서 동작하기에 역시 동작합니다.

 


 

HTTP L7 routing

HTTP 모드에서 동작할 때, envoy는 path, authority, content type, runtime value등에 기반해서 요청들을 라우팅하거나 redirecting하는 routing subsystem을 제공합니다.이 기능은 envoy를 front/edge proxy로써 사용하는데 매우 유용합니다. service to service mesh를 구축하는데도 활용될 수 있습니다.

 


 

Service discovery and dynamic configuration

envoy는 중앙 관리를 위해 dynamic configuration API의 layer화 된 집합을 optional하게 사용합니다. 해당 레이어들은 envoy가 configuration을 dynamic update할 수 있게 해줍니다. 가능한 업데이트는 backend cluster의 호스트들, backend cluster 그 자체들, HTTP routing, listening socket, 보안적인 것들이 있습니다. 더 간단한 deployment의 경우, backend host discovery는 이후 레이어들의 static config 파일을 수정함으로써 DNS resolution을 통해 행해질 수 있습니다.

 


 

Health checking

envoy mesh를 구성하는 추청되는 방법은 service discovery를 결국 consistent process로 취급하는 것 입니다. envoy는 active upstream service cluster의 헬스체크를 optional하게 수행할 수 있는 health checking subsystem을 포함합니다. envoy는 healthy한 load balancing target을 결정하기 위해 service discovery와 helth check 정보를 둘 다 사용합니다. envoy는 또한 외부 detection subsystem을 통한 passive health checking도 지원합니다.

 


 

Advanced load balancing

분산처리 시스템에서의 다른 componenet간의 Load balancing은 복잡한 문제입니다. Envoy는 self-container proxy이기 때문에, envoy 자체에서 개선된 load balancing 기술을 구현할 수 있습니다. 해당 기술을 임의의 application에서도 접근할 수 있도록 합니다. v1.28 버전의 envoy는 자동화된 retry, circuit breaking, 외부 rate limiting service를 통한 global rate limiting, request shadowing, outlier detection을 제공합니다. request racing이 이후 계획되어 있습니다.

 


 

Front/edge proxy support

edge단에서 같은 소프트웨어를 사용하는 큰 장점이 있습니다. (observability, management, 동일한 service discovery와 loadbalancing 알고리즘 등). envoy는 대부분의 현대 웹 application 유즈 케이스에 대한 edge proxy로 동작할 수 있도록하는 feature set을 가지고 있습니다. TLS termination과 위에서 언급한  HTTP/1.1, HTTP/2, HTTP/3 지원, HTTP L7 routing을 포함합니다.

 


 

Best in class observability

위에서 언급한 것 처럼, envoy의 주된 목적은 network를 투명하게 만드는 것 입니다. 하지만 network level과 application level 둘 다 문제가 발생합니다. envoy는 모든 subsystem에 대한 robust한 통계 자료 지원을 포함합니다. 현재 statistic sink는 statsd로 제공되지만, 다른 것을 plugging 하는 것은 쉽습니다. 통계자료들은 administration port를 통해 볼 수 있습니다. envoy는 또한 thirdparty provider들을 통한 분산 추적도 지원합니다.

 


 

끝맺음

본 포스팅에서는 고성능 envoy proxy의 기본적인 철학, envoy가 목표를 이루기 위해 구현된 핵심 feature들에 대해 다루어보았습니다. envoy는 cloud native한 선택될 수 있는 proxy 서버 입니다. 다음 포스팅에서 envoy의 architecture을 뜯어보는 포스팅을 작성해보도록 하겠습니다~!