Раскройте магию архитектуры сервисной сетки и узнайте, как она улучшает ваши распределенные системы.
Погрузитесь в Istio, суперзвезду сервисной сетки, и узнайте, как она управляет вашим кластером Kubernetes до совершенства.
Монолитные приложения превратились в более мелкие, независимые сервисы. Этот сдвиг приобрел огромную популярность благодаря облачным вычислениям и архитектуре микросервисов. Такие инструменты, как Docker и Kubernetes, ускорили эту тенденцию.
Микросервисы на таких платформах, как Kubernetes, предлагают множество преимуществ, но также создают сложности. Управление связью между этими распределенными сервисами требует тщательного учета поиска, маршрутизации, повторных попыток и аварийного переключения.
Дополнительные проблемы включают безопасность и наблюдаемость.
Встраивание возможностей связи в каждый сервис занимает много времени, особенно по мере расширения ландшафта сервисов. Вот где сияет Service Mesh. Он обрабатывает всю связь между сервисами в распределенной системе.
Service Mesh достигает этого за счет использования сетевых прокси-серверов. Запросы между сервисами направляются через эти прокси, которые находятся вне сервисов на уровне инфраструктуры:
Эти прокси образуют ячеистую сеть для сервисов, отсюда и название. Service Mesh контролирует каждый аспект связи между сервисами, что позволяет ему справляться с восемью заблуждениями распределенных вычислений.
Раскройте весь потенциал ваших сервисов с помощью Service Mesh! Узнайте, как этот волшебный инструмент может изменить ландшафт ваших приложений.
Давайте разберем магию на три основные способности: магия трафика, железная безопасность и кристально чистая видимость.
Service Mesh — ваш главный регулировщик дорожного движения, управляющий взаимодействием сервисов с предельной точностью. Наслаждайтесь динамической маршрутизацией, интеллектуальным обнаружением и потрясающими функциями, такими как shadowing трафика и разделение трафика для бесшовных canary-релизов и A/B-тестирования.
Попрощайтесь с ненадежными соединениями! Service Mesh окутывает ваши сервисы уютным одеялом надежности, предлагая повторные попытки, тайм-ауты, ограничение скорости и автоматические выключатели, чтобы защитить ваши приложения от хаоса.
Охраняйте свои сервисы неприступной крепостью! Service Mesh шифрует все коммуникации с помощью надежного MTLS, проверяет личности со строгой аутентификацией и применяет правила доступа для максимальной защиты.
Откройте для себя скрытые суперспособности безопасности! Изолируйте сервисы, отслеживайте каждое движение для аудита и создавайте безопасный периметр вокруг вашего приложения с помощью Service Mesh.
Легко ориентируйтесь в сложностях вашей распределенной системы! Service Mesh обеспечивает беспрецедентную прозрачность внутренней работы вашего приложения благодаря распределенной трассировке.
Раскройте ценную информацию с помощью множества метрик, журналов и данных о производительности. Оптимизируйте свои сервисы и устраняйте неполадки, как профессионал, с помощью Service Mesh.
Istio, сервисная сетка с открытым исходным кодом, созданная IBM, Google и Lyft, незаметно улучшает распределенные приложения с помощью управления трафиком, безопасности и анализа производительности.
Istio, гибко развертываемая локально, в облаке, внутри Kubernetes или на виртуальных машинах, отлично работает с микросервисами на Kubernetes. Несмотря на то, что она не зависит от платформы, она идеально подходит для контейнеризированных сред.
По сути, Istio развертывает прокси Envoy в качестве sidecar-контейнеров вместе с каждым микросервисом:
Эта сеть прокси-серверов формирует плоскость данных Istio, управляемую плоскостью управления:
Плоскость управления, мозговой центр Istio, наделяет прокси-серверы Envoy возможностями обнаружения, настройки и управления сертификатами.
Раскройте потенциал Istio с помощью множества взаимосвязанных микросервисов, где sidecar-прокси создают надежную инфраструктуру сервисной сетки:
Адаптивность Istio проявляется в бесшовной интеграции с внешними системами журналирования, телеметрии и политик.
Архитектура Istio — это динамичный дуэт: плоскость данных и плоскость управления. Вместе они управляют магией, стоящей за возможностями Istio. Давайте погрузимся в основные компоненты, лежащие в основе этой исключительной платформы.
Приготовьтесь изучить сложные детали основных компонентов Istio.
Плоскость данных Istio — это, по сути, усиленная версия прокси-сервера Envoy. Это чудо с открытым исходным кодом справляется с сетевыми сложностями, позволяя приложениям сосредоточиться на своей основной деятельности. Приложения взаимодействуют без сбоев, не обращая внимания на сложную сетевую инфраструктуру.
По сути, Envoy — это сетевой мастер, работающий на 3-м и 4-м уровнях модели OSI. Он умело управляет соединениями, используя цепочку адаптируемых сетевых фильтров. Более того, фильтр уровня L7 Envoy позволяет ему с легкостью обрабатывать HTTP-трафик. И это еще не все — он отлично работает с протоколами HTTP/2 и gRPC.
Многие из выдающихся возможностей Istio на самом деле являются суперспособностями, унаследованными от встроенных возможностей Envoy:
Истинный потенциал Envoy раскрывается в сочетании с Istio. Его расширяемость, основанная на WebAssembly, меняет правила игры в области обеспечения пользовательских политик и телеметрии. Кроме того, API песочницы Proxy-Wasm Istio открывает двери для еще большей настройки Envoy.
Знакомьтесь, istiod, дирижер оркестра плоскости управления Istio. Этот маэстро преобразует высокоуровневые правила маршрутизации и директивы управления трафиком в удобные для Envoy конфигурации, плавно распределяя их по sidecar-контейнерам.
Помните раннюю архитектуру Istio с ее отдельными компонентами? Что ж, чтобы упростить ситуацию, эти компоненты были объединены в единый istiod. Но не бойтесь, основные функции остались нетронутыми.
В основе своей istiod использует тот же код и API, что и его предшественники. Pilot, например, продолжает оставаться маэстро обнаружения сервисов, переводя специфические для платформы детали на универсальный язык, понятный sidecar-контейнерам. Эта гибкость позволяет Istio гармонично взаимодействовать с различными средами, такими как Kubernetes и виртуальные машины.
istiod также берет на себя ответственность за безопасность, устанавливая надежную аутентификацию между сервисами и конечными пользователями с помощью встроенной системы управления идентификацией и учетными данными. С легкостью применяйте детальные политики безопасности на основе идентификации сервиса. Более того, istiod функционирует как доверенный центр сертификации (CA), выдавая сертификаты для безопасной связи между сервисами с использованием взаимной аутентификации TLS (MTLS).
Мы рассмотрели типичные функции сервисной сетки и разобрали архитектуру Istio и ее основные компоненты. Теперь давайте выясним, как Istio реализует эти функции, используя свои основные компоненты.
Мы вернемся к тем же категориям функций, которые мы рассматривали ранее.
API управления трафиком Istio предлагает детальный контроль над трафиком сервисной сетки. Настройте конфигурации трафика с помощью этих API и определите ресурсы API с помощью пользовательских определений ресурсов Kubernetes (CRD). Ключевыми ресурсами API для маршрутизации трафика являются виртуальные сервисы и правила назначения:
Виртуальный сервис диктует, как запросы направляются к сервису в сетке Istio. Он состоит из одного или нескольких правил маршрутизации, которые оцениваются последовательно. После маршрутизации виртуальных сервисов применяются правила назначения для управления трафиком к месту назначения, например, группировка экземпляров сервиса по версиям.
Безопасность Istio основана на строгих идентификаторах для каждого сервиса. Агенты Istio вместе с каждым прокси-сервером Envoy взаимодействуют с istiod для автоматизации ротации ключей и сертификатов:
Istio поддерживает два типа аутентификации: аутентификацию узла и аутентификацию запроса. Аутентификация узла обеспечивает безопасность связи между сервисами с помощью решения Istio для взаимной аутентификации TLS. Аутентификация запроса обрабатывает аутентификацию конечного пользователя посредством проверки JSON Web Token (JWT) с использованием пользовательского поставщика аутентификации или поставщика OpenID Connect (OIDC).
Istio обеспечивает контроль доступа к сервисам путем применения политик авторизации. Эти политики регулируют входящий трафик в прокси-сервере Envoy, позволяя контролировать доступ на уровне сетки, пространства имен и сервиса.
Istio генерирует комплексную телеметрию, включая метрики, распределенные трассировки и журналы доступа, для всей связи между сервисами в сетке. Эта телеметрия включает метрики уровня прокси, сервисно-ориентированные метрики и метрики плоскости управления.
Раньше Mixer был центральным компонентом в архитектуре телеметрии Istio. Однако Telemetry v2 заменяет функции Mixer плагинами прокси-сервера Envoy:
Istio создает распределенные трассировки через прокси-серверы Envoy и поддерживает различные серверные части трассировки, такие как Zipkin, Jaeger, Lightstep и Datadog. Частота выборки генерации трассировки настраивается. Кроме того, Istio генерирует журналы доступа для трафика сервиса в настраиваемых форматах.
Достаточно теории, давайте увидим Istio в действии! Мы установим Istio на кластер Kubernetes и используем простое приложение микросервисов, чтобы продемонстрировать его мощь.
Istio можно установить различными способами, но проще всего загрузить и распаковать последнюю версию для вашей ОС (например, Windows). Распакованный пакет включает в себя клиент istioctl в папке bin. Используйте istioctl для установки Istio в вашем кластере Kubernetes:
istioctl install --set profile=demo -y
Это устанавливает компоненты Istio в кластере Kubernetes по умолчанию с использованием демонстрационного профиля. Замените 'demo' на другой профиль, специфичный для поставщика, если необходимо.
Затем укажите Istio автоматически внедрять прокси sidecar Envoy при развертывании приложений в этом кластере Kubernetes:
kubectl label namespace default istio-injection=enabled
Здесь мы используем kubectl, предполагая, что у вас настроен кластер Kubernetes (например, Minikube) и CLI Kubernetes kubectl.
Представьте себе простое приложение для онлайн-заказов для этой демонстрации. Оно состоит из трех микросервисов, которые работают вместе для выполнения заказов:
Мы не будем вдаваться в подробности микросервисов, но их легко создать с помощью Spring Boot и REST API. Очень важно создать образы Docker для этих микросервисов для развертывания в Kubernetes.
Развёртывание контейнеризированных рабочих нагрузок в кластерах Kubernetes, таких как Minikube, просто. Используйте ресурсы Deployment и Service для объявления и доступа к нагрузке. Обычно их определяют в YAML-файле:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: order-service
namespace: default
spec:
replicas: 1
template:
metadata:
labels:
app: order-service
version: v1
spec:
containers:
- name: order-service
image: kchandrakant/order-service:v1
resources:
requests:
cpu: 0.1
memory: 200
---
apiVersion: v1
kind: Service
metadata:
name: order-service
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
name: http
selector:
app: order-service
Это базовое определение Deployment и Service для order-service. Создайте похожие YAML-файлы для inventory-service и shipping-service.
Легко разверните эти ресурсы с помощью kubectl:
kubectl apply -f booking-service.yaml -f inventory-service.yaml -f shipping-service.yaml
Поскольку мы включили автоинъекцию побочных прокси Envoy для пространства имён по умолчанию, всё уже настроено. Или вручную внедрите побочные прокси Envoy с помощью команды kube-inject от istioctl.
Istio в основном обрабатывает трафик внутри mesh. По умолчанию трафик в mesh и из него блокируется. Istio использует шлюзы для управления входящим и исходящим трафиком mesh, давая вам точный контроль над тем, что входит и выходит. Istio предлагает предварительно настроенные развертывания прокси-шлюзов: istio-ingressgateway и istio-egressgateway.
Создайте Gateway и Virtual Service для вашего приложения:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: booking-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: booking
spec:
hosts:
- "*"
gateways:
- booking-gateway
http:
- match:
- uri:
prefix: /api/v1/booking
route:
- destination:
host: booking-service
port:
number: 8080
Здесь мы используем контроллер входа Istio по умолчанию. Кроме того, мы определили виртуальный сервис для маршрутизации запросов к booking-service.
Вы также можете определить egress-шлюз для исходящего трафика mesh.
Мы развернули простое приложение в Kubernetes с Istio. Давайте исследуем мощные возможности Istio и увидим, как они могут усилить наше приложение.
Представьте, что разворачиваете несколько версий микросервиса, такого как shipping-service. Вы стремитесь постепенно вводить новые функции, не затрагивая всех пользователей. Request routing позволяет направить часть трафика на последнюю версию.
Используйте правила маршрутизации виртуальных сервисов, чтобы достичь этого.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: shipping-service
spec:
hosts:
- shipping-service
http:
- route:
- destination:
host: shipping-service
subset: v1
weight: 90
- destination:
host: shipping-service
subset: v2
weight: 10
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: shipping-service
spec:
host: shipping-service
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
Правила маршрутизации могут также фильтровать трафик на основе заголовков или других атрибутов. Поле destination указывает целевой сервис для соответствующих запросов.
Предотвратите каскадные отказы с помощью circuit breakers. Этот подход обнаруживает ошибки и временно прекращает трафик к неисправным сервисам, защищая общее состояние вашего приложения.
DestinationRule в Istio позволяет настроить поведение circuit breaking для сервисов, таких как inventory-service.
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: inventory-service
spec:
host: inventory-service
trafficPolicy:
connectionPool:
tcp:
maxConnections: 1
http:
http1MaxPendingRequests: 1
maxRequestsPerConnection: 1
outlierDetection:
consecutive5xxErrors: 1
interval: 1s
baseEjectionTime: 3m
maxEjectionPercent: 100
Ограничивая максимальные соединения, ожидающие запросы и запросы на соединение, вы эффективно управляете трафиком и предотвращаете перегрузки.
Mutual TLS обеспечивает безопасное общение между сервисами, требуя аутентификации от обеих сторон. Istio автоматически включает mutual TLS для сервисов, использующих его прокси.
Хотя Istio применяет mutual TLS между проксируемыми сервисами, нешифрованный трафик всё ещё может достичь сервисов без прокси. Используйте политики PeerAuthentication, чтобы обеспечить mutual TLS во всём вашем mesh.
apiVersion: "security.istio.io/v1beta1"
kind: "PeerAuthentication"
metadata:
name: "default"
namespace: "istio-system"
spec:
mtls:
mode: STRICT
Вы можете применять mutual TLS на уровне mesh, namespace или сервиса. Политики, специфичные для сервисов, переопределяют настройки на уровне namespace.
JSON Web Tokens (JWT) — стандарт для безопасной передачи информации о пользователях. Они широко используются для аутентификации и авторизации.
AuthorizationPolicy в Istio позволяет контролировать доступ к сервисам, таким как booking-service, на основе утверждений JWT.
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: require-jwt
namespace: default
spec:
selector:
matchLabels:
app: booking-service
action: ALLOW
rules:
- from:
- source:
requestPrincipals: ["[email protected]/[email protected]"]
Требуйте валидные JWT с определёнными утверждениями для авторизованного доступа. Istio создаёт атрибут requestPrincipal из полей issuer и subject в JWT.
Istio упрощает управление общими задачами в распределённых микросервисных архитектурах. Однако его сложность может добавить накладные расходы к развёртыванию. Как и любой инструмент, Istio не является волшебным решением и требует тщательного рассмотрения.
Хотя service mesh предлагает преимущества, стоит учитывать и следующие недостатки:
Service mesh предлагает преимущества, но тщательная оценка сложности вашего приложения имеет решающее значение. Взвесьте плюсы против дополнительной сложности.
Istio — популярный service mesh, поддерживаемый лидерами индустрии, но это не единственный вариант. Вот краткий обзор Linkerd и Consul.
Linkerd — Kubernetes-нативный, open-source service mesh, набирающий популярность. Это инкубационный проект CNCF и работает аналогично Istio, используя TCP-прокси. Rust-микропрокси Linkerd называется Linkerd-proxy.
Linkerd обычно проще Istio благодаря своему фокусу на Kubernetes. Однако его функциональность тесно напоминает возможности Istio, а основная архитектура схожа. Linkerd включает пользовательский интерфейс, data plane и control plane.
Consul — open-source service mesh от HashiCorp, который интегрируется с другими инфраструктурными инструментами HashiCorp. Data plane Consul поддерживает как прокси, так и нативные модели интеграции. Он предлагает встроенный прокси, но также может работать с Envoy.
Consul функционирует за пределами Kubernetes, поддерживая платформы вроде Nomad. Он использует агентов на каждом узле для проверки состояния и связывается с серверами Consul для хранения и репликации данных. Хотя он предлагает стандартные функции service mesh, Consul сложнее в развёртывании и управлении.
Это руководство раскрыло основы архитектуры service mesh и мощь возможностей Istio. Глубокое погружение в структуру, компоненты и практическое применение Istio открывает новые перспективы. Теперь становится понятным, как установить и эффективно использовать Istio в типичных сценариях.
Отзывы клиентов
Следующие отзывы были собраны на нашем веб-сайте.
Есть вопросы? Найдите ответы ниже!
Наиболее часто задаваемые вопросы