Введение в Istio и Service Mesh
1. Зачем нужен Service Mesh? (Ingress vs Service Mesh)
До появления Service Mesh мы использовали два основных способа направить трафик в кластер:
- NodePort / LoadBalancer: Создает внешний IP для каждого сервиса. Это сложно масштабировать, когда сервисов сотни (управление сотнями IP и DNS-записей становится кошмаром).
- Ingress Controller (например, Nginx): Единая точка входа. Работает на уровне L7 (HTTP/HTTPS), позволяет делать роутинг по доменам и путям.
Почему этого мало? Ingress-контроллер управляет только входящим (North-South) трафиком. Он не видит, что происходит внутри (East-West) кластера между самими подами. Service Mesh (Istio) берет под контроль всё: и вход (Ingress), и выход (Egress), и взаимодействие между микросервисами внутри.
2. Архитектура Istio: Sidecar и Control Plane
Istio работает по принципу Sidecar-контейнера. В каждый под рядом с вашим приложением подселяется "сосед" — прокси-контейнер (Envoy).
- Data Plane (Envoy Proxy): Все запросы в под и из пода проходят через этот прокси. Он перехватывает трафик с помощью правил
iptables, которые настраиваются специальнымinit-контейнеромпри старте пода. - Control Plane (istiod): "Мозг" системы. Он хранит конфигурации и рассылает их всем прокси-контейнерам в кластере.
Как происходит перехват трафика?
- Init-контейнер: Настраивает
iptablesвнутри сетевого пространства (network namespace) пода. - Mutating Webhook: Специальный компонент Kubernetes, который видит запрос на создание пода в "помеченном" namespace и автоматически добавляет в YAML пода описание контейнера
istio-proxy.
3. Основные возможности Istio
| Функция | Описание |
| Traffic Management | Канареечные релизы (Canary), Blue-Green деплой, разделение трафика по процентам (например, 90% на старую версию, 10% на новую). |
| Observability | Полная визуализация трафика. С помощью инструментов Kiali и Jaeger можно увидеть карту зависимостей всех микросервисов и время ответа каждого из них. |
| Security (mTLS) | Автоматическое шифрование трафика между всеми подами. Даже если злоумышленник попадет внутрь кластера, он не сможет "прослушать" данные. |
| Resilience | Повторные попытки (Retries), тайм-ауты и Circuit Breakers (предохранители), чтобы один упавший сервис не обрушил всю систему. |
4. Установка и компоненты визуализации
Установка чаще всего выполняется через бинарный файл istioctl с использованием профилей (например, demo, default).
После установки в namespace istio-system появляются важные инструменты (Add-ons):
- Prometheus: Собирает метрики (кол-во запросов, ошибки).
- Kiali: Визуальный интерфейс для просмотра графа трафика кластера.
- Jaeger: Инструмент для трассировки (просмотр пути конкретного запроса через все сервисы).
5. Настройка трафика: Gateway и VirtualService
В Istio вместо стандартного Ingress используются свои ресурсы (CRD):
- Gateway: Описывает "входную дверь" — порты (80, 443), протоколы и хосты, которые должен слушать Istio Ingress Gateway.
- VirtualService: Описывает логику маршрутизации — куда именно отправить запрос, пришедший на конкретный хост (на какой внутренний Service).
# Пример связи ресурсов
Gateway (слушает хост app.com) -> VirtualService (направляет на сервис app-svc)
Практические заметки:
- Включение Istio: Чтобы в поды начал добавляться sidecar, нужно пометить namespace меткой:
kubectl label namespace default istio-injection=enabled - Tracing: Если в Kiali вы видите "Unknown" источник трафика, значит запрос пришел в обход Istio Gateway (например, через NodePort). Для полной видимости трафик должен входить через Ingress Gateway.