Кратко о том, что такое Service Mesh.
Service Mesh - это паттерн, идея или можно назвать это подходом. Когда мы говорим, что хотели бы сделать Service Mesh, стоит уточнять для чего и как мы хотим его реализовывать. Разные реализации Service Mesh имеют разный набор фич, свойств, особенностей.
Service Mesh - это подход к построению управляемого транспортного слоя для взаимодействия между сервисами в SOA или микро-сервисной архитектуре.
Service Mesh позволяет вынести из приложения на уровень транспорта такие вещи как:
набор фич, реализуемых конкретной реализацией Service Mesh стоит уточнять в документации этой реализации.
Т.е. 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 компонент и управлять трафиком внутри него. Такой подход более уязвим к отказам, но реализуется из-за значительного потребления ресурсов сайдкарами в системах с большим количеством сервисов.
Сетевое взаимодействие между сервисами - это один из аспектов, на который обращает свое внимание информационная безопасность. Все довольно просто если мы можем открывать и закрывать порты в файерфолах на или между виртуальными машинами или выделенными серверами. Но как быть если мы живем в Kubernetes и у нас много сервисов?
Service Mesh предоставляет полностью настраиваемый транспортный слой между сервисами в рамках Kubernetes (не обязательно только в K8s), что полностью может закрыть наши потребности:
Все это предоставляется на уровне транспорта и не требует изменения в защищаемых сервисов. Может поддерживаться отдельной командой безопасности.
Разные реализации идей Service Mesh имеют разный набор фич и могут иметь очень разную архитектуру. Для примера я возьму одну из популярных реализаций.
реализации Service Mesh - это довольно спорное утверждение, так как нет стандарта на то, что такое Service Mesh и каждая из "реализации идей Service Mesh" имеет свое представление о том, что такое Service Mesh.
Data Plane в Istio - это envoy прокси, который ставится в виде сайдкара .
Control Plane - управление конфигурациями для envoy прокси в виде istiod. Introducing istiod.
Pilot - Конфигурирование, обслуживание Envoy прокси, получение информации из K8s API.
Citadel - Выпуск и управление сертификатами.
Galley - Проверка (валидация) конфигураций. После проверки конфигурация направляется в Pilot.
Authentication:
Authorization. Правила доступа к сервисам (Authorization Policies):
Больше деталей в разделе документации про безопасность Istio
Добавление сайдкаров к сервисам может быть выполнено несколькими способами.
istioctl kube-inject -f original-k8s-cfg.yaml > k8s-cfg-with-istio-sidecars.yaml
Требует K8s 1.9 или выше.
Для определенного неймспейса мы можем настроить автоматическое добавление сайдкар прокси и применять оригинальные конфигурации сервисов.
kubectl label namespace our-namespace istio-injection-enabled
kubectl create -n our-namespace -f original-k8s-cfg.yaml
Linkerd & Linkerd2 Менее функционален чем Istio но экономичнее.
Consul Connect - Consul :)
netramesh Децентрализован - нет control plane. Может объединять трасы по любому http заголовку. X-Request-Id например.
Istio в разрезе: что умеет и не умеет самый популярный Service Mesh (А. Половов, DevOpsConf 2023)
Ambient Mesh
Istio Service Mesh в федеративных топологиях Kubernetes / Максим Чудновский (Сбертех)
Istio Service Mesh Beyond Kubernetes
Proxyless Service Mesh в gRPC Java-сервисах
How to monitor Istio, the Kubernetes service mesh
Бенчмаркинг Linkerd и Istio. [2021]
Performance Benchmark Analysis of Istio and Linkerd. [2019]
Отличный инструмент для организации контролируемого транспортного слоя микросервисов. Вместе с плюсами добавляет сложности и потребляет ресурсы. При большом количестве микросервисов может потреблять больше памяти чем сами сервисы.