Руководство прикладного разработчика#

Термины и определения#

Термин/аббревиатура

Определение

Платформа

Платформа оркестрации приложений со средствами автоматизации и управления на основе политик, например Kubernetes

Istio SE

Настраиваемая сервисная сетка с открытым исходным кодом, служащая для взаимодействия, мониторинга и обеспечения безопасности контейнеров в кластере Kubernetes

Контрольная панель

Проект, где запущены управляющие приложения (компонент POLM)

Управление политиками / POLM

Компонент Управление политиками

Граничный прокси / IGEG

Компонент Граничный прокси

Сервисный прокси / SVPX

Компонент Сервисный прокси

Ingress Gateway

Входная точка в проект компонента IGEG

Egress Gateway

Выходная точка из проекта компонента IGEG

istio-proxy

Сервисный прокси — sidecar-контейнер, предназначенный для маршрутизации трафика

Deployment

Набор инструкций для запуска приложения в Kubernetes

Pod

Набор контейнеров внутри узла кластера Kubernetes

TLS

Transport Layer Security, протокол защиты транспортного уровня

Системные требования#

Для использования компонента Сервисный прокси необходимо выполнение следующих пререквизитов:

  1. Кластер Kubernetes (версии 1.19 и выше) развернут и настроен в соответствии с требованиями, предъявляемыми к Платформе.

  2. В проекте создана учетная запись с правами на создание конфигураций.

  3. Настроен доступ для публикации образов разрабатываемых приложений в Docker-репозиторий.

  4. На рабочей машине пользователя установлен клиент Kubernetes (kubectl) для доступа в Kubernetes c использованием консоли.

  5. На рабочей машине пользователя установлен клиент istioctl, поставляемый в дистрибутиве.

Также для подключения SVPX необходим проект, подключенный к интеграционной платформе.

Подключение и конфигурирование#

Подключение#

Чтобы запустить приложение с сервисным прокси, необходимо добавить его аннотацию в Deployment приложения.

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    metadata:
      annotations:
        sidecar.istio.io/inject: 'true'

Конфигурирование#

Сценарий 1. Управление трафиком сервисного прокси#

Конфигурационные файлы

Базовая конфигурация сервисного прокси осуществляется путем автоматического получения конфигурационного файла от компонента POLM. Администрирование компонента POLM описано в документе «Руководство по системному администрированию» POLM.

Для выполнения указанных действий пользователь Kubernetes должен иметь полномочия create на ресурсы групп networking.istio.io, security.istio.io в соответствующем namespace.

  1. Подключение к интерфейсу управления

Для подключения через веб-интерфейс Платформы выполните следующие шаги:

Шаг

Действие

Авторизуйтесь в веб-консоли Платформы

Перейдите по ссылке URL в веб-консоли нужного кластера Платформы. Введите в окне ввода учетных данных логин и пароль

Перейдите в проект

Выберите пункт меню Home/Projects и выберите из списка проект

Для подключения через консоль Платформы:

Шаг

Действие

Войдите в консольного клиента платформы

В окне командной строки в приглашении введите команды: kubectl config set-credentials /<host-alias-без-точек>: --token= kubectl config set-cluster <host-alias-без-точек>: --insecure-skip-tls-verify=true --server=https://: kubectl config set-context /<host-alias-без-точек>:/ --user=/<host-alias-без-точек>: --namespace=maximov-test --cluster=<host-alias-без-точек>: kubectl config use-context /<host-alias-без-точек>:/

  1. Установите конфигурационные файлы

Для установки через веб-интерфейс Платформы:

Шаг

Действие

Загрузите артефакты из файла <конфигурационный файл>.yaml

В правом верхнем углу окна проекта нажмите иконку с изображением значка + Import YAML. Перенесите, используя механизм drag and drop, файл из директории, содержащей конфигурационные артефакты. В открывшемся окне редактирования нажмите Create

Для установки через консоль Платформы:

Шаг

Действие

Загрузите артефакты из файла <конфигурационный файл>.yaml

В консоли выполните команду: kubectl apply -f <Конфигурационный файл>.yaml

Типы конфигурационных файлов#

Для настройки сервиса SVPX могут быть применены следующие типы конфигурационных файлов:

  • DestinationRule;

  • VirtualService;

  • ServiceEntry.

Destination Rule

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

Пример настройки политик балансировки:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: bookinfo-ratings
spec:
  host: ratings.prod.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      simple: LEAST_CONN

Можно настроить отдельные политики, для разных версий приложений, на которые ссылается общий сервис приложения "ratings". В примере ниже показано правило, применяющее тип балансировки "round robin" для всего трафика, направленного на подгруппу "testversion" и объединяющую все endpoints (Pods) с метками "version:v3":

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: bookinfo-ratings
spec:
  host: ratings.prod.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      simple: LEAST_CONN
  subsets:
  - name: testversion
    labels:
      version: v3
    trafficPolicy:
      loadBalancer:
        simple: ROUND_ROBIN

Можно определить балансировку в зависимости от портов на которые поступает трафик:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: bookinfo-ratings-port
spec:
  host: ratings.prod.svc.cluster.local
  trafficPolicy: # Apply to all ports
    portLevelSettings:
    - port:
        number: 80
      loadBalancer:
        simple: LEAST_CONN
    - port:
        number: 9080
      loadBalancer:
        simple: ROUND_ROBIN

Virtual Service

Несколько полезных терминов для понимания контекста перенаправления трафика:

Сервис — единица поведения приложения, связанная с уникальным именем в реестре служб Платформы. Сервис содержит некоторое количество сетевых конечных точек, привязанных к инстансам Deployment (Pods).

Версии сервиса (subsets) — подмножество конечных узлов (Pods) приложения определенной версии, используемое для маршрутизации трафика в зависимости от требуемой версии приложения.

Источник — клиент вызывающий сервис.

Хост(host) — адрес, используемый клиентом при попытке соединения с сервисом.

Модель доступа — приложения обращаются только к целевому сервису (host) без знания отдельных версий (подмножеств) сервисов. Фактический выбор версии определяется сервисным прокси.

VirtualService — определяет набор правил для маршрутизации трафика, адресованного на определенный host. Каждое правило имеет критерии соответствия, по которым трафик будет отправлен в нужном направлении. Источник трафика также может быть одним из критериев соответствия в правилах маршрутизации.

Следующий пример маршрутизирует HTTP трафик по умолчанию на Pods сервиса reviews версии "version: v1”, но для трафика содержащего URI с /wpcatalog/ или /consumercatalog/ будет выполнена перезапись значения URI на /newcatalog и трафик будет перенаправлен на Pods с метками “version: v2”.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews-route
spec:
  hosts:
  - reviews.prod.svc.cluster.local
  http:
  - name: "reviews-v2-routes"
    match:
    - uri:
        prefix: "/wpcatalog"
    - uri:
        prefix: "/consumercatalog"
    rewrite:
      uri: "/newcatalog"
    route:
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v2
  - name: "reviews-v1-route"
    route:
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v1

Подмножества направления маршрутизации описаны в связанном с сервисом DestinationRule:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews-destination
spec:
  host: reviews.prod.svc.cluster.local
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

Service Entry

ServiceEntry включает дополнительные записи во внутренний реестр сервисов Service Mesh так, чтобы система обнаружения сервисов имела доступ к дополнительно описанным сервисам.

ServiceEntry описывает свойство сервиса (DNS имя, порты, протоколы). Эти сервисы могут быть расположены как в кластере Kubernetes, так и вне его (baremetal, VM, и т.д.).

Следующий пример описывает несколько внешних сервисов для доступа к ним от внутренних приложений по HTTPS. Сервисный прокси проверяет значение SNI в сообщении ClientHello, чтобы направить трафик на внешний сервис.

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: external-svc-https
spec:
  hosts:
  - api.dropboxapi.com
  - www.googleapis.com
  - api.facebook.com
  location: MESH_EXTERNAL
  ports:
  - number: 443
    name: https
    protocol: TLS
  resolution: DNS

Сценарий 2. Создание и монтирование volumes в контейнер SVPX#

Для записи различных volumes используется монтирование директорий в файловую систему Pod. В Deployment приложения нужно добавить аннотацию:

sidecar.istio.io/userVolume: >-

          [ {"name": "имя volume", "volume":

          {"ключ":"значение"}} ]

sidecar.istio.io/userVolumeMount: >-

          [ {"name": "имя volume",  "mountPath":

          "заданная директория volume",  "readonly": false} ]

Теперь при инжектировании образа SVPX указанные volume добавляются в контейнер SVPX (istio-proxy).

Пример 1.#

Монтирование новых директорий в файловую систему Pod для хранения сертификатов:

sidecar.istio.io/inject: 'true' # инжектирование sidecar istio-proxy
sidecar.istio.io/proxyImage: >-
registry.ХХХ.ХХХ.ru/pprb/ci01994970/ci02320655_synapse_security/istio/proxyv2@sha256:5b76427736afcc0f9eb6d3fd0f75cf89e5007049533ebe21806d1edd0e0ae610 # указание к применению образа

sidecar.istio.io/userVolume: >-

          [ {"name": "egressgateway-certs", "secret":

          {"secretName":"istio-egressgateway-certs"}},  {"name":

          "egressgateway-ca-certs", "secret":

          {"secretName":"istio-egressgateway-ca-certs"}} ]

sidecar.istio.io/userVolumeMount: >-

          [ {"name": "egressgateway-certs",  "mountPath":

          "/etc/istio/egressgateway-certs",  "readonly": false},  {"name":

          "egressgateway-ca-certs",  "mountPath":

          "/etc/istio/egressgateway-ca-certs",  "readonly": false} ]

При отсутствии аннотации sidecar.istio.io/proxyImage образ скачивается из контрольной панели

Пример 2.#
sidecar.istio.io/userVolumeMount: '[{"name": "valgrind", "mountPath": "/tmp/valgrind"}]'
sidecar.istio.io/userVolume: '[{"name": "valgrind", "emptyDir": {"medium": "Memory"}}]

Миграция на текущую версию#

После обновления контрольной панели требуется перезапуск pod с контейнером прокси. Новая версия загрузится автоматически.

Быстрый старт#

Для получения примера конфигурации Sidecar сервисного прокси подключите его в Deployment с помощью аннотации sidecar.istio.io/inject: 'true':

kind: Deployment
apiVersion: apps/v1
spec:
  template:
    metadata:
      annotations:
        sidecar.istio.io/inject: 'true'

И далее посмотрите yaml-конфигурацию в Pod приложения.

Использование программного компонента#

Компонент Сервисный прокси используется для маршрутизации и обеспечения безопасности трафика между приложениями.

Часто встречающиеся проблемы и пути их устранения#

Проблема

Пути решения

Сервисный прокси не может подключиться к компоненту POLM, в системном журнале видно сообщение Envoy proxy is NOT ready

Проверьте корректность подключения к контрольной панели.
Обратитесь к системным администраторам контрольной панели

До прикладного приложения не доходят запросы

Проверьте access-логи сервисного прокси. Возможные варианты сообщений описаны ниже.

В access-логе сервисного прокси видно сообщение:<brNR (No route configured):
В конфигурации сервисного прокси отсутствует требуемый маршрут

Авторизуйтесь в прикладном проекте. Если вызов направлен на внутренний сервис, проверьте наличие сервиса с таким именем, проверьте корректность параметров host/порт в конфигурационных файлах прикладного проекта — Gateway, DestinationRule и VirtualService. Если вызов направлен на внешний host, проверьте наличие конфигурационного файла ServiceEntry для данного сочетания host/порт

В access-логе сервисного прокси видно сообщение:<brUO (Upstream overflow with circuit breaking):
Поставщик перегружен запросами

Авторизуйтесь в прикладном проекте. Проверьте корректность конфигурации раздела connectionPoolSettings в DestinationRule

В access-логе сервисного прокси видно сообщение:
UF (Failed to connect to upstream):
Поставщик сбросил соединение

Авторизуйтесь в прикладном проекте. Если используется автоматическая аутентификация ISTIO_MUTUAL — проверьте наличие конфликта в разделе trafficPolicy конфигурационного файла DestinationRule, относящегося к проблемному сервису, и раздела Spec/mTLS конфигурационного файла peerAuthentication. В случае указания разных режимов работы в поле tls — возможны указанные ошибки

В access-логе сервисного прокси видно сообщение:
UH (No healthy upstream):
Поставщик неработоспособен

Авторизуйтесь в прикладном проекте. Проверьте наличие вызываемого сервиса — в веб-интерфейсе Home/Networking/Services/Search_by_name найдите сервис. Проверьте наличие запущенного Pod, на который ссылается сервис — в веб-интерфейсе кликните правой кнопкой мыши на найденный сервис, выберите вкладку Pods на открывшейся странице, убедитесь, что статус Pods на данной странице имеет значение running

Если указанные пути решения не помогли, обратитесь к системным администраторам контрольной панели.