Кратко о том, что такое Service Mesh.
Service Mesh
Service Mesh - это паттерн, идея или можно назвать это подходом. Когда мы говорим, что хотели бы сделать Service Mesh, стоит уточнять для чего и как мы хотим его реализовывать. Разные реализации Service Mesh имеют разный набор фич, свойств, особенностей.
Идея
Service Mesh - это подход к построению управляемого транспортного слоя для взаимодействия между сервисами в SOA или микро-сервисной архитектуре.
Service Mesh позволяет вынести из приложения на уровень транспорта такие вещи как:
набор фич, реализуемых конкретной реализацией Service Mesh стоит уточнять в документации этой реализации.
- Retry
- Circuit breaker
- Управление таймаутами
- Распределенная трассировка
- Логирование
- Балансировка нагрузки
- Сбор метрик
- Контроль доступа
- Шифрование трафика
Т.е. Service Mesh может взять на себя все проблемы порождаемые коммуникациями между сервисами, но дать возможность приложениям влиять на транспортный слой через конфигурацию.
Также, Service Mesh может обеспечить изоляцию некоторого подмножества сервисов и правила взаимодействия (доступности) между сервисами.
Service Mesh - это про tcp,http,rest, а не про сообщения, брокеры сообщений и т.п.
Реализация идеи
Как правило, Service Mesh разбивается на две части: Control Plane и Data Plane:
Control Plane - это инструменты конфигурирования Data Plane. Отвечает за доставку политик в Data Plane, управление маршрутизацией, балансировку запросов, распространение ключей. Включает в себя компоненты для сбора метрик.
Data Plane - компоненты управляющие трафиком между сервисами. Отвечает за исполнение сетевых политик, политик безопасности и сбор телеметрии. Обычно это прокси, стоящий перед сервисом и реализующий правила и функции Service Mesh. Data Plane часто реализуют как Sidecar паттерн, где к сервису добавляется еще один компонент в виде sidecar контейнера, который является реализацией настраиваемого прокси, перехватывающего входящий и исходящий трафик сервиса и управляющего им. Data Plane может быть реализован как с помощью Sidecar паттерна, так и другими способами. Например, с помощью одного прокси на часть кластера K8s.
Service Mesh - это про P2P коммуникации между сервисами. Обычно это реализуется через добавление компонента к каждому сервису для управления трафиком. В последнее время есть попытки сделать один Data Plane компонент и управлять трафиком внутри него. Такой подход более уязвим к отказам, но реализуется из-за значительного потребления ресурсов сайдкарами в системах с большим количеством сервисов.
Service Mesh и безопасность
Сетевое взаимодействие между сервисами - это один из аспектов, на который обращает свое внимание информационная безопасность. Все довольно просто если мы можем открывать и закрывать порты в файерфолах на или между виртуальными машинами или выделенными серверами. Но как быть если мы живем в Kubernetes и у нас много сервисов?
Service Mesh предоставляет полностью настраиваемый транспортный слой между сервисами в рамках Kubernetes (не обязательно только в K8s), что полностью может закрыть наши потребности:
- Шифрование трафика
- Ограничение взаимодействия между сервисами. Можно запретить все коммуникации кроме разрешенных.
- Авторизация. Включая валидацию JWT с валидацией подписавшего токен, также внешнии провайдеры авторизации.
- Логирование
- Метрики
- Зеркалирование трафика. Для анализа в системах мониторинга трафика
Все это предоставляется на уровне транспорта и не требует изменения в защищаемых сервисов. Может поддерживаться отдельной командой безопасности.
Istio как реализация Service Mesh идей
Разные реализации идей Service Mesh имеют разный набор фич и могут иметь очень разную архитектуру. Для примера я возьму одну из популярных реализаций.
реализации Service Mesh - это довольно спорное утверждение, так как нет стандарта на то, что такое Service Mesh и каждая из "реализации идей Service Mesh" имеет свое представление о том, что такое Service Mesh.