Envoy Proxy вместо HAProxy: реальный кейс
Мы сталкивались с ситуацией, когда HAProxy не справлялся с динамическим обнаружением сервисов в Kubernetes. Retries с jitter были недоступны, а конфигурацию приходилось перезагружать вручную. Тогда мы внедрили Envoy как data plane — и получили гибкость, которой не хватало. Envoy — это не просто прокси, а полноценная платформа для микросервисных архитектур. Он умеет динамическое обнаружение upstream-сервисов через xDS API, трассировку запросов из коробки, circuit breaking с outlier detection, retries с jitter. И весь конфиг обновляется без перезапуска. Именно поэтому Envoy стоит внутри Istio, Consul Connect и AWS App Mesh. Наши инженеры с 5+ годами опыта и 30+ проектами в DevOps обеспечивают качественное внедрение. Закажите настройку Envoy для вашей инфраструктуры. Стоимость проекта рассчитывается индивидуально после аудита.
Статическая конфигурация: запуск без control plane
Для старта без сервис-меша достаточно статического конфига. Вот пример минимальной настройки с retry-политикой:
# envoy.yaml
static_resources:
listeners:
- name: listener_0
address:
socket_address:
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
codec_type: AUTO
route_config:
name: local_route
virtual_hosts:
- name: backend
domains: ["*"]
routes:
- match:
prefix: "/api/"
route:
cluster: api_service
prefix_rewrite: "/"
timeout: 30s
retry_policy:
retry_on: "5xx,connect-failure"
num_retries: 3
retry_host_predicate:
- name: envoy.retry_host_predicates.previous_hosts
host_selection_retry_max_attempts: 3
- match:
prefix: "/"
route:
cluster: app_service
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
clusters:
- name: api_service
connect_timeout: 5s
type: STRICT_DNS
lb_policy: LEAST_REQUEST
load_assignment:
cluster_name: api_service
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: api-service
port_value: 8080
- name: app_service
connect_timeout: 5s
type: STRICT_DNS
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: app_service
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: app-service
port_value: 3000
- endpoint:
address:
socket_address:
address: app-service-2
port_value: 3000
admin:
address:
socket_address:
address: 0.0.0.0
port_value: 9901
Запуск через Docker:
docker run -d \
-p 10000:10000 \
-p 9901:9901 \
-v ./envoy.yaml:/etc/envoy/envoy.yaml \
envoyproxy/envoy:v1.29-latest \
-c /etc/envoy/envoy.yaml Circuit breaking: предотвращение каскадных отказов
Отметим: когда один сервис начинает тормозить или падать, клиенты (другие микросервисы) могут накапливать запросы в очередях. Это вызывает каскадный отказ всей системы. Circuit breaker в Envoy отслеживает состояние upstream и останавливает отправку запросов к проблемному хосту. Конфигурация:
clusters:
- name: payment_service
connect_timeout: 2s
circuit_breakers:
thresholds:
- priority: DEFAULT
max_connections: 1000
max_pending_requests: 500
max_requests: 1000
max_retries: 3
track_remaining: true
outlier_detection:
consecutive_5xx: 5
interval: 10s
base_ejection_time: 30s
max_ejection_percent: 50
consecutive_gateway_failure: 3
enforcing_consecutive_5xx: 100
Outlier Detection: если хост выдаёт 5 ошибок 5xx подряд, он эжектируется из пула на 30 секунд. После этого Envoy отправляет пробный запрос — при успехе хост возвращается.
Как outlier detection повышает отказоустойчивость?
Outlier detection в Envoy отслеживает не только 5xx, но и gateway failures, connection failures, а также время отклика. При превышении порога хост исключается из балансировки на заданное время. Это предотвращает каскадные сбои и снижает MTTR. В сравнении с HAProxy, где требуется ручное скриптование, Envoy предоставляет готовое решение с настройкой через YAML.
Сравнение с альтернативами: Envoy против HAProxy и nginx
Envoy предоставляет в 3 раза больше метрик, чем nginx, но уступает HAProxy по сырой производительности (~200k req/s на ядро против ~300k). Однако гибкость и наблюдаемость делают его предпочтительным для сложных микросервисных сетей.
| Параметр | Envoy | HAProxy | nginx |
|---|---|---|---|
| Динамическая конфигурация | xDS API, без перезапуска | Только через Lua-скрипты | Только перезагрузка |
| Circuit breaking | Встроенный + outlier detection | Ручное скриптование | Нет |
| Трассировка | Zipkin, Jaeger, Datadog из коробки | Нет | Через модули |
| Количество метрик | 1000+ через admin endpoint | 200+ | 100+ |
| Производительность (req/s) | ~200k на ядро | ~300k на ядро | ~150k на ядро |
Circuit breaking в Envoy работает в 2 раза эффективнее, чем ручное решение на HAProxy, а трассировка доступна сразу без дополнительных модулей. Для индивидуального проекта свяжитесь с нами.
Envoy как sidecar в Kubernetes
Классический паттерн — Envoy рядом с каждым pod:
# kubernetes deployment (фрагмент)
spec:
containers:
- name: app
image: myapp:latest
ports:
- containerPort: 8080
- name: envoy
image: envoyproxy/envoy:v1.29-latest
args:
- "-c"
- "/etc/envoy/envoy.yaml"
ports:
- containerPort: 10000
name: proxy
- containerPort: 9901
name: admin
volumeMounts:
- name: envoy-config
mountPath: /etc/envoy
volumes:
- name: envoy-config
configMap:
name: envoy-config
Без Istio sidecar настраивается вручную. С Istio Envoy инжектируется автоматически через MutatingWebhookConfiguration, конфигурация прилетает от Istiod через xDS.
Как xDS упрощает управление конфигурацией?
Для продакшн-инфраструктуры с десятками сервисов статический конфиг не масштабируется. xDS API позволяет control plane (Consul, Pilot в Istio) динамически обновлять конфигурацию без перезапуска:
# envoy-dynamic.yaml — только bootstrap, остальное через xDS
dynamic_resources:
lds_config:
resource_api_version: V3
api_config_source:
api_type: GRPC
transport_api_version: V3
grpc_services:
- envoy_grpc:
cluster_name: xds_cluster
cds_config:
resource_api_version: V3
api_config_source:
api_type: GRPC
transport_api_version: V3
grpc_services:
- envoy_grpc:
cluster_name: xds_cluster
static_resources:
clusters:
- name: xds_cluster
connect_timeout: 5s
type: STATIC
load_assignment:
cluster_name: xds_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: control-plane.example.com
port_value: 18000
С xDS можно менять маршруты, добавлять upstream-сервисы и обновлять политики без перезапуска. Это особенно важно для canary-деплоев и A/B тестирования.
Процесс внедрения Envoy
Мы работаем поэтапно:
- Аудит текущей архитектуры (1-2 дня).
- Проектирование конфигурации с учётом circuit breaking и трассировки.
- Реализация на staging с нагрузочным тестированием.
- Деплой на production с постепенным переключением трафика.
- Документация и обучение команды.
В результате вы получаете готовую инфраструктуру Envoy (статическую или через xDS), интеграцию с Istio, Consul или другим control plane, мониторинг и алертинг (Prometheus + Grafana, дашборды), runbook по эксплуатации и поддержку 2 недели после сдачи. Сертифицированные инженеры гарантируют стабильность и производительность.
Сроки
| Задача | Срок |
|---|---|
| Аудит и проектирование | 1-2 дня |
| Статический конфиг, базовый прокси | 1 день |
| Circuit breaking + трассировка | 1-2 дня |
| xDS с Consul/Pilot, динамическая конфигурация | 2-3 дня |
| Полный сервис-меш + мониторинг + документация | 4-7 дней |
Бюджет проекта рассчитывается индивидуально после аудита. Получите консультацию — свяжитесь с нами, и мы подготовим предварительную оценку.







