Istio service mesh: Sidecar, mTLS
Istio переносит поперечные задачи микросервисов — шифрование, retry, circuit breaking, трассировку — на уровень инфраструктуры. Каждый под получает sidecar Envoy, который управляет трафиком без изменения кода приложения. Цена: ~50 МБ RAM и ~0.5 vCPU на каждый sidecar.
Когда микросервисов становится много, поперечные задачи начинают дублироваться в каждом сервисе. Istio переносит их на уровень инфраструктуры: в Kubernetes каждый под получает sidecar-контейнер Envoy, который перехватывает весь трафик и применяет политики без изменения кода.
Key Takeaways
STRICTmTLS отклоняет незашифрованный трафик между подами; сертификаты ротируются автоматически каждые 24 часа- VirtualService управляет canary деплоем на уровне процентов трафика или HTTP-заголовков
outlierDetectionв DestinationRule реализует circuit breaker: при 5xx ошибках инстанс исключается из ротации- Kiali визуализирует топологию сервисов в реальном времени с метриками latency и error rate
- Ambient mode (Istio 1.22+) убирает sidecar, снижая overhead до ~10 МБ на ноду вместо ~50 МБ на под
Архитектура
Data plane — Envoy sidecar в каждом поде. Перехватывает входящий и исходящий трафик через iptables rules.
Control plane (istiod) — управляет конфигурацией Envoy: распределяет сертификаты, синхронизирует маршруты, хранит политики.
# Установка через Helm
helm repo add istio https://istio-release.storage.googleapis.com/charts
helm install istio-base istio/base -n istio-system --create-namespace
helm install istiod istio/istiod -n istio-system --wait
helm install istio-ingressgateway istio/gateway -n istio-system
# Включить автоинъекцию sidecar в namespace
kubectl label namespace production istio-injection=enabled
# Проверить что sidecar инжектируется
kubectl get namespace production --show-labels
mTLS
По умолчанию Istio работает в режиме PERMISSIVE, принимает и шифрованный, и открытый трафик. STRICT требует mTLS от всех:
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: production
spec:
mtls:
mode: STRICT
Теперь любой незашифрованный запрос между подами в namespace production отклоняется. Сертификаты автоматически ротируются istiod каждые 24 часа.
Traffic Management
VirtualService управляет маршрутизацией. Canary деплой без изменения кода:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: api
spec:
hosts: [api]
http:
# Canary по заголовку: разработчики тестируют v2
- match:
- headers:
x-canary:
exact: "true"
route:
- destination:
host: api
subset: v2
# Основной трафик: 90% v1, 10% v2
- route:
- destination:
host: api
subset: v1
weight: 90
- destination:
host: api
subset: v2
weight: 10
DestinationRule с circuit breaker:
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: api
spec:
host: api
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
http:
http1MaxPendingRequests: 50
maxRequestsPerConnection: 1
outlierDetection:
consecutive5xxErrors: 5 # исключить после 5 ошибок подряд
interval: 30s
baseEjectionTime: 30s # держать вне ротации 30 секунд
maxEjectionPercent: 50 # исключать не более 50% инстансов
Retry и timeout на уровне сетевого слоя:
http:
- route:
- destination:
host: api
timeout: 3s
retries:
attempts: 3
perTryTimeout: 1s
retryOn: 5xx,gateway-error,connect-failure,retriable-4xx
AuthorizationPolicy
Управление доступом между сервисами:
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: api-policy
namespace: production
spec:
selector:
matchLabels:
app: api
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/production/sa/frontend"]
to:
- operation:
methods: ["GET", "POST"]
paths: ["/v1/*"]
- from:
- source:
principals: ["cluster.local/ns/monitoring/sa/prometheus"]
to:
- operation:
ports: ["9090"]
Observability
Istio автоматически собирает метрики, трассировку и логи доступа без изменений в приложениях:
# Установить стек наблюдаемости
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.21/samples/addons/prometheus.yaml
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.21/samples/addons/grafana.yaml
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.21/samples/addons/jaeger.yaml
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.21/samples/addons/kiali.yaml
# Открыть Kiali -- граф трафика между сервисами
istioctl dashboard kiali
# Открыть Jaeger -- распределённые трейсы
istioctl dashboard jaeger
Kiali визуализирует топологию сервисов в реальном времени: какие сервисы общаются, сколько ошибок, latency на каждом ребре графа.
# Включить distributed tracing с sampling 1%
apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
name: tracing-default
namespace: istio-system
spec:
tracing:
- randomSamplingPercentage: 1.0
providers:
- name: jaeger
Debugging
# Проверить конфигурацию sidecar
istioctl analyze -n production
# Proxy-статус для конкретного пода
istioctl proxy-status my-pod.production
# Детальная конфигурация Envoy
istioctl proxy-config all my-pod.production
# Проверить mTLS статус между подами
istioctl x check-inject -n production
# Логи доступа Envoy
kubectl logs my-pod -c istio-proxy -n production
Ambient mode
С Istio 1.22 появился ambient mode — без sidecar-контейнеров:
# Установить с ambient mode
helm install istiod istio/istiod --set profile=ambient
# Включить для namespace (без перезапуска подов)
kubectl label namespace production istio.io/dataplane-mode=ambient
Overhead снижается с ~50 МБ на под до ~10 МБ на ноду. Функциональность mTLS и базовая маршрутизация сохраняются.
Подводные камни
Istio добавляет ~50 мс к латентности при первом запросе (mTLS handshake) и потребляет ~0.5 vCPU на sidecar. В кластере из 50 подов это 25 дополнительных vCPU только на Envoy. Для сервисов с жёсткими требованиями к latency рассмотрите Linkerd с его Rust-прокси.
Итог
Istio — мощный инструмент для команд с серьёзными требованиями к безопасности и observability. mTLS по умолчанию, детальное управление трафиком через VirtualService, circuit breaking, автоматические метрики и трейсы. Цена — операционная сложность и ресурсный overhead.
Следующий шаг — Linkerd как лёгкая альтернатива Istio.