Istio — это как «сетевой мозг» для Kubernetes-платформы. Он сидит поверх кластера и управляет тем, как микросервисы разговаривают друг с другом: кто кому может стучаться, как шифруется трафик, куда утекают метрики и как именно делать rollout новых версий. Вся тяжёлая работа по сети делегируется платформе, а не вшивается в код.
Внутри Istio полагается на Envoy Proxy: в каждый pod кладётся sidecar-контейнер с Envoy, который выступает L4/L7-прокси. Все запросы внутри mesh проходят через эти sidecar’ы, а уже control plane Istio (Istiod) «разливает» им конфигурацию: маршруты, политики безопасности, сертификаты и так далее.
Плюс в том, что DevOps- и SRE-команды управляют поведением сети декларативно — через YAML-манифесты, а сами приложения остаются максимально «чистыми» от сетевой логики.
Что Istio умеет из коробки #
- mTLS — прозрачное шифрование трафика между сервисами с взаимной аутентификацией, плюс авторизация поверх этого;
- Traffic shifting — поэтапные rollout’ы: canary, blue-green, A/B-тесты, всё управляется через VirtualService/DestinationRule;
- Telemetry и наблюдаемость — метрики, трассировка и логи, обычно через Prometheus, Grafana, Jaeger и Kiali;
- Политики — доступ, rate limiting, retry, circuit breaking, timeouts, fallback-сценарии;
- Балансировка нагрузки — умные схемы распределения по инстансам, основанные на весах, заголовках, версиях и т.д.;
- Fault injection — намеренное внесение ошибок и задержек для проверки отказоустойчивости приложений.
Как выглядит архитектура Istio #
- Envoy Proxy — sidecar в каждом pod’е, по факту выполняет всю сетевую работу: маршрутизацию, шифрование, сбор телеметрии;
- Istiod — control plane, который раздаёт Envoy-конфиг через xDS, занимается сервис-дискавери и сертификатами;
- Kiali — GUI, где можно визуально посмотреть на потоки трафика, зависимости и политики;
- Prometheus / Grafana / Jaeger — уже классический стек для метрик и трассировки, с готовой интеграцией.
Пример: canary rollout через VirtualService #
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: payments
spec:
hosts:
- payments.example.com
http:
- route:
- destination:
host: payments
subset: v1
weight: 80
- destination:
host: payments
subset: v2
weight: 20
Здесь 80% трафика идёт на v1, 20% — на v2. Дальше эти веса можно крутить из CI/CD-пайплайна или вручную, постепенно повышая долю новой версии.
Почему Istio нормально живёт в проде #
- Можно управлять трафиком и безопасностью, почти не залезая в код приложений;
- Маршрутизация и безопасность задаются декларативно, через версии, заголовки, пути и т.п.;
- Шифрование трафика между сервисами становится дефолтом, что удобно для Zero Trust-архитектур;
- Масштабирование: Istio хорошо себя чувствует и на десятках сервисов, и на сотнях+;
- Наблюдаемость: mesh даёт картинку по всему трафику платформы, а не по отдельным кускам;
- Легко встраивается в GitOps: манифесты Istio — обычные YAML’ы, которые держатся в Git и катятся через Argo CD или Flux.
По-хорошему, Istio — это уже не «игрушка», а стратегический компонент платформы. Особенно для команд, которые строят управляемую и безопасную микросервисную инфраструктуру вокруг Kubernetes.
Canary-деплой: Argo Rollouts + Istio #
1. Объект Rollout (Argo) #
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: payments
spec:
replicas: 4
strategy:
canary:
steps:
- setWeight: 20
- pause: { duration: 5m }
- setWeight: 50
- pause: { duration: 10m }
- setWeight: 100
selector:
matchLabels:
app: payments
template:
metadata:
labels:
app: payments
spec:
containers:
- name: payments
image: myregistry/payments:v2
ports:
- containerPort: 8080
Argo тут сам поэтапно меняет долю трафика в сторону новой версии, делая паузы на проверку.
2. DestinationRule и VirtualService в Istio #
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: payments
spec:
host: payments
subsets:
- name: stable
labels:
app: payments
version: v1
- name: canary
labels:
app: payments
version: v2
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: payments
spec:
hosts:
- payments.example.com
http:
- route:
- destination:
host: payments
subset: stable
weight: 80
- destination:
host: payments
subset: canary
weight: 20
Во время rollout’а Argo правит веса в VirtualService, а Istio перенастраивает трафик через Envoy sidecar’ы. Приложения об этом не знают и не должны знать.
Fallback и fault injection #
Пример правила с fault injection #
http:
- route:
- destination:
host: payments
subset: stable
fault:
abort:
percentage:
value: 100
httpStatus: 503
Такой кусок конфигурации заставляет Istio всегда возвращать 503 по этому маршруту. В реальной жизни это комбинируют с rollback-логикой, чтобы убедиться, что система адекватно реагирует на сбои и умеет откатываться.
Как трафик гуляет внутри Istio #
[ User Request ]
↓
[ Istio Ingress Gateway ]
↓
[ VirtualService ]
↓
┌────────────┬────────────┐
│ Subset: v1 │ Subset: v2 │
│ (80%) │ (20%) │
│ Label: │ Label: │
│ version=v1 │ version=v2 │
└────────────┴────────────┘
↓
[ Envoy Sidecars ]
↓
[ App Container ]
Снаружи всё выглядит как обычный HTTP-запрос, но внутри кластера он проходит через gateway, VirtualService, потом попадает на нужный subset (v1/v2), а дальше уже едет через sidecar-прокси в контейнер с приложением.
Интеграция и автоматика вокруг Istio #
- Можно подвесить metrics webhook, который будет решать, откатываться или нет, по метрикам;
- Сделать webhook validation для Rollout и VirtualService, чтобы не пустить в прод откровенно кривые манифесты;
- Собирать метрики Istio вроде
request_total,request_duration_secondsчерез Prometheus и завязывать на них алерты и автоматический rollback.
