Введение в Istio для Kubernetes: основы и начальная настройка

e33a9de7717ad02f2bd9c1b1f7bcd8e0.png

Работая DevOps‑инженером в Т1 Иннотех, я часто сталкиваюсь с необходимостью глубоко погружаться в механизмы работы контейнерных оркестраторов. Важность хорошего знания архитектуры и оптимизации управления контейнерами трудно переоценить, особенно когда речь идёт о Kubernetes. Эта технология стала неотъемлемой частью моего инструментария благодаря её возможностям в автоматизации развёртывания, масштабирования и управления контейнерными приложениями.

Однако управлять микросервисной архитектурой в Kubernetes порой весьма сложно. И здесь на помощь приходит Istio — мощная платформа, обеспечивающая сетевое взаимодействие, безопасность и наблюдаемость в кластере Kubernetes. В этой статье мы рассмотрим основы Istio и её начальную настройку.

Основные проблемы управления микросервисами в Kubernetes

Несмотря на мощные инструменты, которые предоставляет Kubernetes, управление микросервисами сопряжено с рядом сложностей:

  • сетевая безопасность: обеспечение защищённого взаимодействия между микросервисами;

  • наблюдаемость (Observability): мониторинг и трассировка запросов для диагностики и улучшения производительности;

  • балансировка нагрузки: распределение трафика между подами для обеспечения оптимальной производительности;

  • сложность конфигурирования: управление конфигурациями и секретами для различных микросервисов;

  • политики и контроль доступа: управление правами доступа, аутентификацией и авторизацией микросервисов.

Эти проблемы могут значительно усложнить работу с микросервисными архитектурами и требовать дополнительных инструментов и решений.

Сервисная сетка (service mesh)

Сервисная сетка — это специализированный инфраструктурный слой, который отвечает за управление сетевым взаимодействием между микросервисами. Он берёт на себя задачи, которые в традиционных системах возлагались бы на сами сервисы или платформы оркестрации. Основные функции сервисной сетки включают в себя:

  • управление трафиком: маршрутизация и балансировка нагрузки на уровне сетевого взаимодействия;

  • безопасность: шифрование трафика между сервисами, аутентификация и авторизация запросов;

  • наблюдаемость: сбор метрик, логов и трассировок для улучшения диагностики и мониторинга приложений;

  • политики и управление: централизованное управление политиками доступа и конфигурациями сетевого взаимодействия.

Одним из наиболее популярных решений для реализации сервисной сетки в Kubernetes является Istio. Оно предоставляет гибкие и мощные инструменты для управления сетевым взаимодействием, что значительно упрощает эксплуатацию микросервисных архитектур.

Что такое Istio?

Это открытая платформа для подключения, защиты, управления и наблюдения за микросервисами. Она предоставляет сервисную сетку, которая работает на уровне сетевого взаимодействия, позволяя управлять трафиком, обеспечивать безопасность и наблюдаемость микросервисов, не внося изменений в код самих приложений.

Основная цель Istio — упрощение и автоматизация задач, связанных с сетевым взаимодействием микросервисов в распределённых системах, таких как Kubernetes‑кластеры. Istio обеспечивает стандартизированный и масштабируемый способ решения проблем, которые обычно возникают при управлении микросервисами.

Вот схема, иллюстрирующая архитектуру и работу Istio:

cc7653078a5287059e26011908b237e2.png

Основные элементы:

  • 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

Платформа состоит из нескольких основных компонентов, каждый из которых выполняет свою уникальную роль в обеспечении функциональности сервисной сетки:

  1. Pilot;

  2. Mixer;

  3. Citadel;

  4. Galley.

Pilot

Управляет конфигурацией сервисной сетки:

  • распространяет конфигурации маршрутизации и политики трафика на прокси‑серверы Envoy, которые работают вместе с каждым микросервисом;

  • балансирует нагрузку и обеспечивает отказоустойчивость;

  • управляет версионностью сервисов и трафиком (например, при канареечном развёртывании).

Пример: Pilot помогает маршрутизировать 80% трафика на старую версию сервиса и 20% на новую, что позволяет постепенно тестировать новую версию.

Mixer (сейчас в основном заменён на функциональность в Envoy)

Обеспечивает телеметрию и применение политик:

  • собирает и агрегирует метрики, журналы и трассировки для наблюдаемости;

  • применяет политики доступа и квоты на использование ресурсов.

Пример: Mixer может собирать метрики о количестве запросов и времени отклика для каждого сервиса, отправляя их в системы мониторинга, такие как Prometheus.

Citadel

Управляет безопасностью:

  • генерирует и управляет сертификатами для шифрования трафика между сервисами (mTLS);

  • обеспечивает аутентификацию и авторизацию.

Пример: Citadel автоматически генерирует и ротирует TLS‑сертификаты для шифрования трафика между микросервисами.

Galley (ранее использовался для управления конфигурацией)

Управляет конфигурацией:

  • проверяет и распределяет конфигурации для других компонентов Istio;

  • обеспечивает согласованность и корректность конфигураций.

Пример: Galley проверяет конфигурационные файлы на ошибки и распространяет их среди всех компонентов Istio, чтобы избежать проблем с конфигурацией.

ba484a44de1c1cad0af548bf2d4aad27.png

Преимущества использования 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, что позволит вам эффективно управлять распределёнными системами и обеспечить высокую надёжность и производительность ваших приложений.

© Habrahabr.ru