Введение в Istio для Kubernetes: основы и начальная настройка
Работая DevOps‑инженером в Т1 Иннотех, я часто сталкиваюсь с необходимостью глубоко погружаться в механизмы работы контейнерных оркестраторов. Важность хорошего знания архитектуры и оптимизации управления контейнерами трудно переоценить, особенно когда речь идёт о Kubernetes. Эта технология стала неотъемлемой частью моего инструментария благодаря её возможностям в автоматизации развёртывания, масштабирования и управления контейнерными приложениями.
Однако управлять микросервисной архитектурой в Kubernetes порой весьма сложно. И здесь на помощь приходит Istio — мощная платформа, обеспечивающая сетевое взаимодействие, безопасность и наблюдаемость в кластере Kubernetes. В этой статье мы рассмотрим основы Istio и её начальную настройку.
Основные проблемы управления микросервисами в Kubernetes
Несмотря на мощные инструменты, которые предоставляет Kubernetes, управление микросервисами сопряжено с рядом сложностей:
сетевая безопасность: обеспечение защищённого взаимодействия между микросервисами;
наблюдаемость (Observability): мониторинг и трассировка запросов для диагностики и улучшения производительности;
балансировка нагрузки: распределение трафика между подами для обеспечения оптимальной производительности;
сложность конфигурирования: управление конфигурациями и секретами для различных микросервисов;
политики и контроль доступа: управление правами доступа, аутентификацией и авторизацией микросервисов.
Эти проблемы могут значительно усложнить работу с микросервисными архитектурами и требовать дополнительных инструментов и решений.
Сервисная сетка (service mesh)
Сервисная сетка — это специализированный инфраструктурный слой, который отвечает за управление сетевым взаимодействием между микросервисами. Он берёт на себя задачи, которые в традиционных системах возлагались бы на сами сервисы или платформы оркестрации. Основные функции сервисной сетки включают в себя:
управление трафиком: маршрутизация и балансировка нагрузки на уровне сетевого взаимодействия;
безопасность: шифрование трафика между сервисами, аутентификация и авторизация запросов;
наблюдаемость: сбор метрик, логов и трассировок для улучшения диагностики и мониторинга приложений;
политики и управление: централизованное управление политиками доступа и конфигурациями сетевого взаимодействия.
Одним из наиболее популярных решений для реализации сервисной сетки в Kubernetes является Istio. Оно предоставляет гибкие и мощные инструменты для управления сетевым взаимодействием, что значительно упрощает эксплуатацию микросервисных архитектур.
Что такое Istio?
Это открытая платформа для подключения, защиты, управления и наблюдения за микросервисами. Она предоставляет сервисную сетку, которая работает на уровне сетевого взаимодействия, позволяя управлять трафиком, обеспечивать безопасность и наблюдаемость микросервисов, не внося изменений в код самих приложений.
Основная цель Istio — упрощение и автоматизация задач, связанных с сетевым взаимодействием микросервисов в распределённых системах, таких как Kubernetes‑кластеры. Istio обеспечивает стандартизированный и масштабируемый способ решения проблем, которые обычно возникают при управлении микросервисами.
Вот схема, иллюстрирующая архитектуру и работу Istio:
Основные элементы:
User: пользователь, который отправляет HTTP‑запросы;
Load Balancer: балансировщик нагрузки, который принимает входящие запросы и перенаправляет их на соответствующий Envoy Proxy;
Envoy Proxy: sidecar‑прокси, который обрабатывает весь входящий и исходящий трафик микросервиса;
Service: микросервис, который обрабатывает бизнес‑логику;
Prometheus: система мониторинга, которая собирает метрики от микросервиса;
Loki: система для агрегации и хранения логов;
Jaeger: система для трассировки запросов в микросервисной архитектуре;
OPA: Open Policy Agent для проверки политик безопасности;
Redis: база данных для реализации ограничения скорости (Rate Limiting);
TLS: механизм для прерывания TLS‑соединений;
Certificate Authority: удостоверяющий центр для выдачи сертификатов.
Основные функции Istio
Маршрутизация
Маршрутизация в Istio позволяет динамически перенаправлять трафик между различными микросервисами на основе предопределённых правил. Это делается с помощью компонента Pilot, который управляет конфигурацией Envoy Proxy. Как это работает:
динамическая конфигурация: Pilot автоматически обновляет конфигурацию Envoy Proxy для маршрутизации трафика;
правила маршрутизации: можно задать условия, при которых трафик будет перенаправлен на определённый сервис, например, на основе заголовков HTTP или параметров запроса;
взвешенная маршрутизация: Istio позволяет распределять трафик между несколькими версиями одного и того же сервиса в определённых пропорциях.
Маршрутизация применяется:
в A/B‑тестировании: можно направлять трафик на разные версии сервиса для сравнения их эффективности;
в сине‑зелёном развёртывание: перенаправление трафика между «синей» и «зелёной» версиями для минимизации рисков при развёртывании.
Канареечное развёртывание
Это стратегия, при которой новая версия сервиса постепенно вводится в эксплуатацию. Istio упрощает этот процесс, позволяя перенаправлять на новую версию только часть трафика. Во время канареечного развёртывания можно использовать метрики и журналы для мониторинга поведения новой версии. Если что‑то пошло не так, можно быстро откатить изменения.
Канареечное развёртывание применяется:
в тестирование в эксплуатации: позволяет тестировать новые функции на реальных пользователях, минимизируя риски;
в постепенном внедрении: новые функции или изменения могут быть внедрены постепенно, начиная с малой доли трафика и с последующим нарастанием.
Краткий обзор ключевых компонентов Istio
Платформа состоит из нескольких основных компонентов, каждый из которых выполняет свою уникальную роль в обеспечении функциональности сервисной сетки:
Pilot;
Mixer;
Citadel;
Galley.
Pilot
Управляет конфигурацией сервисной сетки:
распространяет конфигурации маршрутизации и политики трафика на прокси‑серверы Envoy, которые работают вместе с каждым микросервисом;
балансирует нагрузку и обеспечивает отказоустойчивость;
управляет версионностью сервисов и трафиком (например, при канареечном развёртывании).
Пример: Pilot помогает маршрутизировать 80% трафика на старую версию сервиса и 20% на новую, что позволяет постепенно тестировать новую версию.
Mixer (сейчас в основном заменён на функциональность в Envoy)
Обеспечивает телеметрию и применение политик:
собирает и агрегирует метрики, журналы и трассировки для наблюдаемости;
применяет политики доступа и квоты на использование ресурсов.
Пример: Mixer может собирать метрики о количестве запросов и времени отклика для каждого сервиса, отправляя их в системы мониторинга, такие как Prometheus.
Citadel
Управляет безопасностью:
генерирует и управляет сертификатами для шифрования трафика между сервисами (mTLS);
обеспечивает аутентификацию и авторизацию.
Пример: Citadel автоматически генерирует и ротирует TLS‑сертификаты для шифрования трафика между микросервисами.
Galley (ранее использовался для управления конфигурацией)
Управляет конфигурацией:
проверяет и распределяет конфигурации для других компонентов Istio;
обеспечивает согласованность и корректность конфигураций.
Пример: Galley проверяет конфигурационные файлы на ошибки и распространяет их среди всех компонентов Istio, чтобы избежать проблем с конфигурацией.
Преимущества использования Istio
Улучшение видимости
Istio предоставляет мощные инструменты для мониторинга и трассировки запросов, что позволяет инженерам лучше понимать, как работают их микросервисы, и находить узкие места в производительности.
Примеры:
Автоматический сбор метрик о работе сервисов и их взаимодействии с помощью встроенных прокси Envoy. Эти метрики могут быть интегрированы с системами мониторинга, такими как Prometheus и Grafana.
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: istio-mesh spec: selector: matchLabels: istio: ingressgateway endpoints: - port: http-envoy-prom
Отслеживание путей запросов через микросервисы с помощью Jaeger или Zipkin, что помогает в диагностике и оптимизации производительности. Пример настроек:
apiVersion: install.istio.io/v1alpha1 kind: IstioOperator spec: components: tracing: enabled: true name: jaeger values: tracing: enabled: true provider: jaeger
Отслеживание путей запросов через микросервисы с помощью Jaeger или Zipkin, что помогает в диагностике и оптимизации производительности. Пример настроек:
apiVersion: install.istio.io/v1alpha1 kind: IstioOperator spec: components: tracing: enabled: true name: jaeger values: tracing: enabled: true provider: jaeger
Безопасность
Istio обеспечивает комплексную безопасность микросервисов, включая автоматическое шифрование трафика и управление аутентификацией и авторизацией.
Примеры:
Автоматическое шифрование всего трафика между сервисами с использованием mTLS (Mutual TLS), что защищает данные от перехвата и подделки. Пример настройки политики безопасности:
apiVersion: security.istio.io/v1beta1 kind: PeerAuthentication metadata: name: default namespace: istio-system spec: mtls: mode: STRICT
Средства для управления доступом к сервисам, включая аутентификацию пользователей и авторизацию на уровне сервисов. Пример политики авторизации:
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer spec: selector: matchLabels: app: productpage rules: - from: - source: principals: ["cluster.local/ns/default/sa/bookinfo-productpage"] to: - operation: methods: ["GET"]
Управление трафиком
Istio позволяет гибко управлять трафиком между микросервисами, что упрощает развёртывание и тестирование новых версий сервисов, а также обеспечивает отказоустойчивость и балансировку нагрузки.
Примеры:
Определение сложных правил маршрутизации, с направлением трафика на различные версии сервисов или в зависимости от условий, таких как заголовки HTTP или параметры запроса. Пример настройки маршрутизации:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: reviews spec: hosts: - reviews http: - route: - destination: host: reviews subset: v1 weight: 80 - destination: host: reviews subset: v2 weight: 20
Настройка автоматических повторных попыток и тайм‑аутов позволяет улучшить надёжность системы. Пример политики повторных попыток:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: ratings spec: hosts: - ratings http: - route: - destination: host: ratings retries: attempts: 3 perTryTimeout: 2s
Простая и быстрая установка Istio в Kubernetes
Перейдите на страницу релизов Istio и скачайте последнюю версию утилиты командной строки istioctl для вашей операционной системы. Распакуйте архив и переместите исполняемый файл istioctl в каталог, который включён в ваш PATH: export PATH=$PATH:/path/to/istioctl
.
Убедитесь, что istioctl установлена правильно, запустив команду istioctl version
.
Istio предлагает несколько профилей установки, которые можно выбрать в зависимости от ваших потребностей. Для базовой установки используйте профиль demo
, который содержит все основные компоненты Istio. Запустите команду установки, указав выбранный профиль: istioctl install --set profile=demo -y
Убедитесь, что все компоненты Istio установлены и работают корректно. Используйте команду kubectl
для проверки статуса подов и сервисов в пространстве имён istio‑system: kubectl get pods ‑n istio‑system
.
Чтобы Istio автоматически добавлял прокси Envoy в ваши поды, необходимо включить автоматический инъектор sidecar.
Затем примените метку к пространству имён, в котором находятся ваши приложения: kubectl label namespace default istio-injection=enabled
.
В этом примере метка применяется к пространству имён default
.
Вот краткое резюме команд, необходимых для установки Istio и базовой конфигурации:
Скачивание и установка istioctl:
curl -L https://istio.io/downloadIstio | sh -
cd istio-
export PATH=$PWD/bin:$PATH
Установка Istio с профилем demo
: istioctl install --set profile=demo -y
.
Проверка установки: kubectl get pods -n istio-system
.
Включение автоматического инъектора sidecar: kubectl label namespace default istio-injection=enabled
.
Основные концепции управления трафиком в Istio
Istio предоставляет мощные инструменты для управления трафиком между микросервисами, позволяя гибко настраивать маршрутизацию, балансировку нагрузки и политики отказа. Основными концепциями для управления трафиком в Istio являются VirtualService и DestinationRule.
VirtualService определяет, как запросы маршрутизируются к сервисам внутри сервисной сетки. Позволяет настроить сложные правила маршрутизации, такие как канареечные развёртывания, разделение трафика между версиями сервиса, управление тайм‑аутами и повторными попытками.
Основные поля VirtualService:
hosts
: один или несколько хостов, для которых применяются правила маршрутизации;http
,tcp
,tls
: правила маршрутизации для HTTP‑, TCP‑ и TLS‑трафика соответственно.
Пример VirtualService:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 80
- destination:
host: reviews
subset: v2
weight: 20
В этом примере 80% трафика направляется на версию v1
сервиса reviews, а 20% — на версию v2
.
DestinationRule определяет политики для подключения к целевым сервисам после применения правил маршрутизации. Позволяет настроить балансировку нагрузки, политики отказа и аутентификацию.
Основные поля DestinationRule:
host
: хост, к которому применяются правила;subsets
: подмножества для различных версий или конфигураций сервиса;trafficPolicy
: политики для управления трафиком, такие как балансировка нагрузки и повторные попытки.
Пример DestinationRule:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
В этом примере определяются два подмножества для сервиса reviews — v1 и v2, и применяется политика балансировки нагрузки ROUND_ROBIN
.
Эти шаги позволят вам настроить маршрутизацию трафика между различными версиями сервиса, обеспечивая гибкость и контроль над тем, как трафик распределяется внутри вашей сервисной сетки.
Обеспечение безопасности в Istio
Istio предоставляет комплексный набор механизмов безопасности, которые помогают защитить ваши микросервисы и данные. Основные аспекты:
автоматическое шифрование трафика между сервисами с помощью Mutual TLS (mTLS), что защищает данные от перехвата и подделки;
аутентификация на уровне сервиса и конечного пользователя, с проверкой подлинности запросов и идентификацией источников трафика;
настройка детализированных политик доступа. Контроль, какие сервисы и пользователи могут обращаться к определенным ресурсам;
управление доступом, квоты и другие ограничения, которые можно применять к сервисам.
Для настройки mTLS в Istio необходимо создать и применить политики аутентификации, которые включают в себя шифрование трафика между сервисами. Рассмотрим пример настройки.
Для включения mTLS для всех сервисов в кластере создайте PeerAuthentication
— ресурс с политикой строгого mTLS (STRICT).
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: istio-system
spec:
mtls:
mode: STRICT
Чтобы обеспечить доступ к сервисам только авторизованным сервисам или пользователям, создайте AuthorizationPolicy
. Например, чтобы разрешить доступ к сервису httpbin
только сервису sleep
:
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: httpbin-policy
namespace: default
spec:
selector:
matchLabels:
app: httpbin
rules:
- from:
- source:
principals: ["cluster.local/ns/default/sa/sleep"]
Для проверки настройки разверните поды httpbin
и sleep
. Под httpbin
будет защищён mTLS и политиками авторизации, а под sleep
будет использоваться для тестирования доступа.
Развёртывание подов:
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.10/samples/sleep/sleep.yaml
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.10/samples/httpbin/httpbin.yaml
Для проверки доступа выполните запрос из пода sleep
к сервису httpbin
:
kubectl exec ‑it $(kubectl get pod ‑l app=sleep ‑o jsonpath={.items..metadata.name}) — curl ‑sS http://httpbin.default:8000/ip
Если настроено правильно, вы получите успешный ответ. В противном случае запрос будет заблокирован политикой безопасности.
Давайте разберём ещё пару YAML‑конфигураций для Istio.
Контроль трафика с помощью HTTP‑заголовков. Этот сценарий демонстрирует, как можно использовать HTTP‑заголовки для маршрутизации трафика к различным версиям сервиса.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: header-based-routing
spec:
hosts:
- my-service
http:
- match:
- headers:
user-agent:
prefix: "Mozilla"
route:
- destination:
host: my-service
subset: v2
- route:
- destination:
host: my-service
subset: v1
Если HTTP‑заголовок User‑Agent
начинается с "Mozilla"
, то трафик будет направлен на версию v2
сервиса my‑service
. В противном случае трафик пойдёт на версию v1
.
Ограничение скорости (Rate Limiting). Этот сценарий показывает, как можно настроить ограничение скорости для сервиса:
apiVersion: "config.istio.io/v1alpha2"
kind: memquota
metadata:
name: handler
spec:
quotas:
- name: requestcount.quota.istio-system
maxAmount: 5000
validDuration: 1s
---
apiVersion: "config.istio.io/v1alpha2"
kind: QuotaSpec
metadata:
name: request-count
spec:
rules:
- quotas:
- charge: 1
quota: requestcount
maxAmount: 5000
и validDuration: 1s
ограничивают трафик до 5000 запросов в секунду.
Цепочка фильтров с использованием WASM. Этот сценарий демонстрирует, как можно использовать WebAssembly (WASM) для создания пользовательских фильтров в Envoy:
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: custom-wasm-filter
spec:
configPatches:
- applyTo: HTTP_FILTER
match:
context: SIDECAR_INBOUND
patch:
operation: INSERT_BEFORE
value:
name: envoy.filters.http.wasm
config:
config:
name: my_custom_filter
rootId: my_root_id
configuration: "..."
vmConfig:
vmId: my_vm_id
runtime: envoy.wasm.runtime.v8
code:
local: { filename: "/path/to/filter.wasm" }
Этот фильтр будет вставлен перед всеми существующими фильтрами для входящего трафика в sidecar. WASM‑фильтр my_custom_filter
будет загружен из файла /path/to/filter.wasm.
Подведение итогов
Istio значительно упрощает управление микросервисами в Kubernetes, предоставляя мощные инструменты для управления трафиком, обеспечения безопасности и улучшения видимости. Основные преимущества использования Istio:
Управление трафиком:
гибкая маршрутизация трафика между различными версиями сервисов;
балансировка нагрузки, отказоустойчивость и управление тайм‑аутами и повторными попытками.
Безопасность:
автоматическое шифрование трафика между сервисами с использованием mTLS защищает данные от перехвата и подделки;
поддержка детализированных политик аутентификации и авторизации обеспечивает безопасный доступ к сервисам.
Улучшение видимости:
предоставляет инструменты для мониторинга, сбора метрик и трассировки запросов, что упрощает диагностику и оптимизацию микросервисов;
интеграция с системами мониторинга, такими как Prometheus и Grafana, позволяет централизованно отслеживать состояние и производительность сервисов.
Заключение
Использование Istio в Kubernetes даёт значительные преимущества для управления микросервисами, повышая их безопасность, управляемость и наблюдаемость. Следуя приведённым рекомендациям, вы сможете углубить свои знания и улучшить конфигурацию Istio, что позволит вам эффективно управлять распределёнными системами и обеспечить высокую надёжность и производительность ваших приложений.