Service Mesh

Istio, Envoy и управление трафиком в микросервисах

Когда микросервисов становится много, появляются вопросы: как управлять трафиком между ними? Как обеспечить mTLS? Как делать канареечные релизы? Service mesh решает эти задачи на уровне инфраструктуры, а не кода.

На основе практик крупных платформ с миллионами запросов в сутки и опыта внедрения Istio.

Зачем нужен Service Mesh

В монолите межсервисное взаимодействие — это вызов функции. В микросервисах — это сетевой запрос с рядом инфраструктурных задач:

Можно реализовать всё это в коде каждого сервиса. Но тогда:

Service mesh выносит эту логику в инфраструктурный слой. Код сервиса не знает о retries, mTLS или canary — этим занимается прокси.

Архитектура: Control Plane vs Data Plane

                    +------------------+
                    |   Control Plane  |
                    |     (Istiod)     |
                    |                  |
                    | - Service        |
                    |   discovery      |
                    | - Config mgmt    |
                    | - Certificate    |
                    |   authority      |
                    +--------+---------+
                             |
            xDS API (push configs)
                             |
         +-------------------+-------------------+
         |                   |                   |
         v                   v                   v
+--------+-------+  +--------+-------+  +--------+-------+
|   Data Plane   |  |   Data Plane   |  |   Data Plane   |
|                |  |                |  |                |
| +---+ +------+ |  | +---+ +------+ |  | +---+ +------+ |
| |App| |Envoy | |  | |App| |Envoy | |  | |App| |Envoy | |
| |   |<->Proxy| |  | |   |<->Proxy| |  | |   |<->Proxy| |
| +---+ +------+ |  | +---+ +------+ |  | +---+ +------+ |
|     Pod A      |  |     Pod B      |  |     Pod C      |
+----------------+  +----------------+  +----------------+
Компонент Роль Пример
Control Plane Мозг: управляет конфигурацией, service discovery, выдаёт сертификаты Istiod, Linkerd control plane
Data Plane Руки: пропускает трафик, применяет политики, собирает метрики Envoy proxy (sidecar)

Ключевой момент: Istio сам не гоняет трафик. Он управляет конфигурацией Envoy-прокси через xDS API.

Envoy: sidecar и gateway

Ingress Gateway

Стоит на границе кластера. Это входная точка для внешнего трафика:

Sidecar Envoy

Запускается рядом с каждым подом (через Istio injection). Перехватывает весь ingress/egress трафик конкретного сервиса:

Egress Gateway

Контролирует исходящий трафик из кластера во внешние сервисы. Позволяет:

Istio: управление mesh

Istio — control plane, который программирует Envoy-прокси:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: v1
EOF

Этот конфиг направляет пользователя "jason" на v2, остальных — на v1. Без изменения кода сервисов.

Что делает Istiod

Управление трафиком

Канареечные релизы

http:
- route:
  - destination:
      host: my-service
      subset: v1
    weight: 95
  - destination:
      host: my-service
      subset: v2
    weight: 5

Circuit Breaker

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: my-service
spec:
  host: my-service
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 100
      http:
        h2UpgradePolicy: UPGRADE
        http1MaxPendingRequests: 100
    outlierDetection:
      consecutive5xxErrors: 5
      interval: 30s
      baseEjectionTime: 30s

Retries и Timeouts

http:
- route:
  - destination:
      host: my-service
  retries:
    attempts: 3
    perTryTimeout: 2s
    retryOn: 5xx,reset,connect-failure
  timeout: 10s

Когда внедрять

Service mesh нужен, если:

Service mesh избыточен, если:

Overhead: каждый sidecar Envoy потребляет ~50-100MB RAM и добавляет ~1-3ms latency. При тысячах подов это существенно. Для оценки затрат: кластер из 500 подов с sidecar'ами потребляет дополнительно 25-50 GB RAM только на прокси.
Тренд: sidecar-less mesh. Istio Ambient Mesh (с версии 1.18) предлагает альтернативу sidecar-паттерну. Вместо прокси в каждом поде используется общий L4-прокси на уровне ноды (ztunnel), а L7-обработка применяется только там, где нужна. Это значительно снижает потребление ресурсов и упрощает adoption.

Альтернативы

Решение Сложность Когда использовать
Библиотеки (Resilience4j, Polly) Низкая Один язык, мало сервисов
Linkerd Средняя Проще Istio, меньше features
Istio Высокая Полный контроль, enterprise
Cilium Высокая eBPF-based, без sidecar overhead
Связанные материалы: