Управление трафиком с помощью Istio

Управление трафиком (traffic management) — это процедура, что позволяет контролировать трафик, который генерируется в процессе передачи данных/браузинга или вызовов API.

Например, на локальном сервере или в облаке у нас есть настроенное приложение, и трафик генерируется, когда это приложение пытается выполнить определенные вызовы API, вызовы служб других сторонних сервисов или передачу данных через интернет.

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

В этом мануале мы рассмотрим инструмент управления трафиком Istio.

Как работает Istio?

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

Istio настраивает Envoy proxy как дополнительный контейнер приложения. Он отслеживает весь трафик, который направляется к приложению и от него для  вызовов API/взаимодействия с сервисами и т. д.

Таким образом, базовая служба приложения остается незатронутой, а весь мониторинг трафика передается через дополнительный контейнер Envoy для обеспечения устойчивости и управления трафиком.

  1. Istio необходимо понимать конечные точки приложения для мониторинга трафика. Таким образом, он подключается к внутренней системе обнаружения сервисов для распознавания служб и конечных точек приложения.
  2. Когда сетевой вызов попадает в приложение, он направляется через Envoy proxy, а затем к конечной службе приложения. При этом sidecar полностью рендерит и мониторит трафик приложения.
  3. В Istio применяется модель round-robin для передачи или распределения трафика между установленными в инфраструктуре балансировщиками нагрузки.

Ресурсы управления трафиком в Istio

Разобравшись с работой Istio, давайте посмотрим на установленные в Istio ресурсы.

Virtual Service

С помощью Virtual Service можно определить правила маршрутизации трафика, которые помогают при попадании приложения в балансировщик нагрузки. Мы определяем правила и эквивалентные протоколы соответствия для конечной службы. Если правило соответствует критериям, трафик перенаправляется на конечную службу.

С помощью этой службы можно легко управлять нагрузкой трафика путем разделения запросов на обслуживание при помощи правил маршрутизации. Можно задавать и поддерживать поведение трафика для нескольких имен хостов в рамках одной конфигурации Virtual Service.

Давайте на примере разберемся в конфигурации Virtual Service.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: demo-vs
spec:
  hosts:
  - demo.vs.com
  http:
  - match:
    - headers:
        end-user:
          exact: /api
    route:
    - destination:
        host: /

Рассмотрим этот пример подробно.

  • Запись hosts включает домен или CNAME приложения.
  • Затем мы переходим к http routing и настраиваем соответствующую backend service на определенный host/destination.
  • Под разделом match находится конфигурация backend service, которая будет вызвана, как только запись host совпадет.
  • http section включает правила маршрутизации, которые перенаправляются к destination.
  • Как только веб-трафик/запрос попадает на шлюз Istio, он ищет запись своего CNAME/FQDN. При успешном совпадении он переводит трафик на Virtual Service, который направляет его на определенную k8 service.

Gateway

Gateway обеспечивает гибкость управления и мониторинга входящего и исходящего трафика на глобальном (envoy) уровне. Мы можем указать тип трафика (протокол/правила), который мы хотим пустить в Istio service mesh для дальнейшей маршрутизации к месту назначения.

Итак, как только URL-адрес приложения попадает в балансировщик нагрузки, он ищет эквивалентный gateway. Как только он находит запись, он позволяет хосту приложения войти в mesh.

Пример работы Gateway:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: demo-gtwy
spec:
  selector:
    app: demo
  servers:
  - port:
      number: 443
      name: https
      protocol: HTTPS
    hosts:
    - demo.vs.com
    tls:
      mode: SIMPLE
      credentialName: demo-tls-cert

Вот что делает эта конфигурация:

  • Как только веб-трафик попадает на балансировщик нагрузки, он направляется на Istio gateway. Gateway позволяет трафику входить в service mesh через указанный порт (в данном случае 443).
  • На этом этапе маршрутизация трафика к backend service не происходит.
  • Gateway ищет достоверность CNAME через секретный ключ TLS (учетные данные).
  • Как только gateway подтвердит и разрешит трафик от host, virtual service выполнит маршрутизацию к цели назначения.

Sidecar

С помощью Sidecar мы можем ограничивать и управлять трафиком, который поступает на Envoy proxy. В общем случае Istio настраивает Envoy Proxy, который принимает трафик через порты, связанные с Workload приложения. У sidecar есть следующие преимущества:

  • Фильтрация и управление протоколами и портами, которые должен принимать Envoy.
  • Фильтрация и запрет Envoy proxy на получение или пересылку трафика определенному набору служб.
  • Разрешение/ограничение трафика для служб в разных именных пространствах.

Теперь разберем Sidecars на примере:

apiVersion: networking.istio.io/v1alpha3
kind: Sidecar
metadata:
  name: default
  namespace: default
spec:
  egress:
  - hosts:
    - "./*"
    - "bookinfo/*"

Вот что это значит: 

  • Приведенная выше конфигурация применяет настройку sidecar к именному пространству default.
  • Эта конфигурация позволяет внешнему/исходящему трафику достигать backend сервисов только для именных пространств default и bookinfo.
  • При этом маршрутизация/доступность трафика для других именных пространств ограничивается.

Подводим итоги

На этом мы подошли к завершению данной темы. Теперь вы знаете, как работает инструмент Istio и из каких компонентов он состоит.

Читайте также: Балансировка трафика в кластере Galera

Tags:

Добавить комментарий