Envoy Proxy: настройка circuit breaking, xDS, трассировка

Когда микросервисная архитектура растёт, статические прокси перестают справляться с динамическим обнаружением сервисов и требуют ручных перезагрузок. Мы настраиваем Envoy Proxy как data plane, внедряем circuit breaking, xDS API и трассировку, чтобы ваша инфраструктура адаптировалась к изменениям без простоев. Наша команда реализует проект под ключ — от аудита до последующей поддержки, обеспечивая надёжную работу в Kubernetes и Service Mesh.
Часто задаваемые вопросы

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. Аудит текущей архитектуры (1-2 дня).
  2. Проектирование конфигурации с учётом circuit breaking и трассировки.
  3. Реализация на staging с нагрузочным тестированием.
  4. Деплой на production с постепенным переключением трафика.
  5. Документация и обучение команды.

В результате вы получаете готовую инфраструктуру Envoy (статическую или через xDS), интеграцию с Istio, Consul или другим control plane, мониторинг и алертинг (Prometheus + Grafana, дашборды), runbook по эксплуатации и поддержку 2 недели после сдачи. Сертифицированные инженеры гарантируют стабильность и производительность.

Сроки

Задача Срок
Аудит и проектирование 1-2 дня
Статический конфиг, базовый прокси 1 день
Circuit breaking + трассировка 1-2 дня
xDS с Consul/Pilot, динамическая конфигурация 2-3 дня
Полный сервис-меш + мониторинг + документация 4-7 дней

Бюджет проекта рассчитывается индивидуально после аудита. Получите консультацию — свяжитесь с нами, и мы подготовим предварительную оценку.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1393
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    815
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139