Envoy — edge и service proxy с открытым исходным кодом, написанный на C++. Разработан для микросервисных архитектур, где требуется управление трафиком, наблюдаемость и надёжность на уровне сервис-к-сервис коммуникаций. В отличие от Nginx, Envoy проектировался для динамической конфигурации через API без перезапуска.
Архитектура и ключевые возможности
- L3/L4/L7 проксирование: TCP, HTTP/1.1, HTTP/2, gRPC — всё на одном proxy.
- Load balancing: round-robin, least request, random, consistent hashing, zone-aware.
- Circuit breaker: автоматически изолирует unhealthy upstream при превышении порога ошибок.
- Retries и timeouts: гибкая политика повторов на уровне маршрутов и методов.
- Observability: метрики в Prometheus, распределённый трейсинг через OpenTelemetry, Zipkin, Jaeger.
- xDS API: динамическая конфигурация через gRPC — control plane обновляет routing без перезапуска Envoy.
Envoy в Kubernetes и service mesh
В service mesh Kubernetes Envoy запускается как sidecar-контейнер рядом с каждым приложением в поде. Весь входящий и исходящий трафик приложения проходит через Envoy — без изменения кода приложения обеспечивается mTLS между сервисами, распределённый трейсинг и политики доступа.
Istio использует Envoy как data plane: control plane Istio (istiod) конфигурирует все sidecar-прокси через xDS API. Consul Connect и Linkerd также используют Envoy или аналогичный подход.
История
Envoy разработан командой Lyft и выпущен как open source в сентябре 2016 года. В 2017 году передан в Cloud Native Computing Foundation (CNCF). В 2018 году получил статус Graduated проекта CNCF — третий после Kubernetes и Prometheus. К 2023 году Envoy используется как data plane в Google Cloud Service Mesh, AWS App Mesh, Azure Service Fabric Mesh и большинстве облачных платформ.
Сравнение Envoy, Nginx и HAProxy
| Параметр | Envoy | Nginx | HAProxy |
|---|---|---|---|
| Динамическая конфигурация | xDS API (без перезапуска) | Reload (с кратким downtime) | Runtime API (частично) |
| Observability | Встроенная (метрики, трейсинг) | Базовая (access log) | Статистика через socket |
| gRPC | Нативная поддержка | С модулем | Через TCP |
| Применение | Service mesh, микросервисы | Web, CDN, API gateway | TCP/HTTP балансировка |
На что обращать внимание
Envoy — мощный, но сложный инструмент. Конфигурация через YAML/JSON значительно сложнее nginx.conf. Для простых сценариев reverse proxy Nginx проще и быстрее в настройке. Envoy оправдан при наличии 10+ микросервисов, где нужен централизованный контроль трафика. Envoy потребляет около 50 МБ памяти на sidecar — в Kubernetes-кластере с сотнями подов это складывается в несколько гигабайт накладных расходов.
Практические сценарии
Envoy как API Gateway: принимает внешние запросы, выполняет JWT-аутентификацию через ext_authz фильтр, маршрутизирует к микросервисам. Rate limiting через фильтр local_ratelimit или глобально через Ratelimit Service. Для Docker Compose-окружений с 5+ сервисами Envoy может заменить Nginx в роли ingress — динамическая конфигурация без перезапуска особенно ценна при частых деплоях.