Установка EVPC#

Порядок установки EVPC#

Порядок установки компонента EVPC зависит от способа развертывания компонента.

Способы развертывания компонента:

  • целевая: ручная установка с использованием Ansible;

  • опциональная: автоматическая установка с использованием Jenkins.

Ручная установка с использованием Ansible#

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

  1. Заполнить файлы в директории inventories. Подробнее описано в разделе Подготовка окружения EVPC, подраздел «Настройка inventory для EVPC».

  2. Выполнить шифрование пароля. Подробнее описано в разделе Использование утилиты «ansible-vault» для шифрования паролей.

  3. Заполнить параметры в файле vars.yml. Пример заполнения файла vars.yml описан в разделе Подготовка окружения EVPC, подраздел «Пример заполненного файла vars.yml для EVPC».

  4. Выполнить ручную установку EVPC с использованием Ansible. Подробнее описано в подразделе «Ручная установка EVPC с использованием Ansible».

Автоматическая установка с использованием Jenkins#

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

  1. Заполнить файлы в директории inventories. Подробнее описано в разделе Подготовка окружения EVPC, подраздел «Настройка inventory для EVPC».

  2. Создать задания в Jenkins для автоматической установки EVPC. Подробнее описано в разделе Подготовка окружения EVPC, подраздел «Создание Jenkins Job для автоматической установки EVPC».

  3. Выполнить шифрование пароля. Подробнее описано в разделе Использование утилиты «ansible-vault» для шифрования пароле.

  4. Заполнить параметры в файле vars.yml. Пример заполненния файла vars.yml описан в разделе Подготовка окружения EVPC, подраздел «Пример заполненного файла vars.yml для EVPC».

  5. Выполнить автоматическую установку EVPC с использованием Jenkins. Подробнее описано в подразделе «Автоматическая установка EVPC с использованием Jenkins».

Дополнительные настройки и функции#

Дополнительно при установке (ручной/автоматической) могут быть использованы следующие настройки и функции:

  1. Установка EVPC с использованием Jenkins Job «SynapseInstaller». Подробнее описано в подразделе «Установка EVPC с использованием Jenkins Job «SynapseInstaller»».

  2. Настройка интеграции компонента EVPC с сервисными системами. Подробнее описано в подразделе «Настройка интеграции EVPC с сервисными системами».

  3. Настройка интеграции компонента EVPC с Istio. Подробнее описано в подразделе «Настройка интеграции EVPC с Istio».

  4. Подготовка базы данных для работы с хранением окон агрегации. Подробнее описано в подразделе «Подготовка базы данных для работы с хранением окон агрегации для EVPC».

  5. Настройка конфигурации EVPC для работы с Граничным прокси (IGEG). Подробнее описано в подразделе «Конфигурирование EVPC для работы с Граничным прокси (IGEG)».

  6. Масштабирование количества pods. Подробнее описано в подразделе «Масштабирование количества pods».

Задание константных значений конфигурационным параметрам#

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

Для задания константных значений необходимо:

  • создать файл preferred_ansible_vars.yml в директории Pipeline, которая размещается в скриптах установки;

  • указать в файле preferred_ansible_vars.yml необходимые параметры с константными значениями. Параметры необходимо указывать в том же формате, как и в файле vars.yml в inventories.

Структура заполненного файла vars.yml приведена в разделе Подготовка окружения EVPC, подраздел «Пример заполненного файла vars.yml для EVPC».

Логика приоритетов:

  • При наличии файла preferred_ansible_vars.yml в директории Pipeline значения, указанные в нем, применяются как самые приоритетные и не могут быть изменены через inventories;

  • При наличии файла preferred_ansible_vars.yml в директории Pipeline и попытке изменить значения параметров в файле vars.yml новые заданные параметры не применятся — остается приоритет у данных из файла preferred_ansible_vars.yml;

  • При отсутствии файла preferred_ansible_vars.yml все параметры применяются из файла vars.yml.

Функциональность приоритетных параметров можно использовать при работе с Jenkins Job для EVPC - SYN_custom_EVPC_cloud.

Ручная установка EVPC с использованием Ansible#

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

  2. Подготовьте конфигурацию потока обработчика и конфигурацию трансформации. Подробнее описано в документе «Руководство пользователя EVPC», раздел «Создание новых конфигураций обработчиков».

  3. Заполните соответствующие inventory. Подробнее описано в разделе Подготовка окружения EVPC, подраздел «Настройка inventory для EVPC».

  4. В директории Ansible создайте директорию helm.

  5. Распакуйте дистрибутив ./EVPC-cfg-{version}-distrib.zip. Убедитесь, что появилась директория conf.

  6. В директорию Ansible/helm скопируйте содержимое директории conf/helm/application/eventprocessflowakka.

  7. Перенесите библиотеку encryptor-cli-(version)-fatjar.jar из директории ./package/bh в корень директории Ansible.

  8. Запустите установку командой в терминале из папки Ansible:

ansible-playbook -i inventories/<ID>/inventory <PLAYBOOK>.yml --ask-vault-pass

, где ID — имя недавно созданного inventory.

Список возможных PLAYBOOKS:

  • epf.yml — устанавливает EVPC.

  1. Проверьте работоспособность сервиса:

  • убедиться, что установка завершена без ошибок;

  • убедиться, что в логах pod нет информации об ошибках.

Автоматическая установка EVPC с использованием Jenkins#

1. Запуск создания конфигурационного дистрибутива с помощью Jenkins#

  1. Запустить задание Jenkins «evpc_image_create» с помощью пункта меню Собрать с параметрами. Процесс создания задания Jenkins «evpc_image_create» приведен в разделе Подготовка окружения EVPC, подраздел «Создание Jenkins Job evpc_image_create».

  2. Заполнить необходимые параметры. Использование задания Jenkins «evpc_image_create» и заполнение параметров описано подробно в документе «Руководство администратора», раздел «Создание конфигурационных дистрибутивов».

  3. Нажать кнопку Собрать.

  4. По запросу Jenkins загрузить архив с конфигурационными файлами.

  5. Дождаться окончания выполнения задания Jenkins.

  6. Проверить, что дистрибутив собрался и опубликовался в Nexus.

2. Запуск установки с помощью Jenkins#

  1. Запустить задание Jenkins для установки с помощью пункта меню Собрать с параметрами (название задания Jenkins задается при создании задания, например, может быть задано как «SYN_custom_EVPC_cloud»). Процесс создания задания Jenkins «SYN_custom_EVPC_cloud» приведен в разделе Подготовка окружения EVPC, подраздел «Создание Jenkins Job для установки EVPC в Openshift».

  2. Выбрать необходимый inventory.

  3. Заполнить параметр nexusHelmUrl ссылкой на конфигурационный дистрибутив с helm chart EVPC, полученный с помощью задания Jenkins «evpc_image_create» (см.п.1 «Запуск создания конфигурационного дистрибутива с помощью Jenkins»).

  4. Нажать кнопку Собрать.

  5. Дождаться окончания выполнения задания Jenkins.

  6. Проверить работоспособность сервиса:

    • убедиться, что установка завершена без ошибок;

    • убедиться, что в логах pod нет информации об ошибках.

Установка EVPC с использованием Jenkins Job «SynapseInstaller»#

Для установки компонента EVPC можно воспользоваться универсальным Jenkins Job «SynapseInstaller». Об инициировании создания Jenkins Job «SynapseInstaller» подробнее описано в разделе Подготовка окружения EVPC, подраздел «Создание универсального Jenkins Job «SynapseInstaller»».

  1. Перед установкой компонента EVPC с помощью Jenkins Job «SynapseInstaller» необходимо создать файл values.yaml.

Все параметры для установки компонента EVPC с помощью Jenkins Job «SynapseInstaller» хранятся в конфигурационном репозитории в файле values.yaml, размещенном по пути: <имя_namespace>/package/conf/helm/eventprocessflowakka/values.yaml.

  1. Особенности заполнения файла values.yaml:

2.1. Все содержимое блока epf (с текущими настройками) из файла vars.yaml для Ansible необходимо перенести в файл values.yaml на первый уровень.

2.2. Содержимое блока epf_defaults из файла vars.yaml для Ansible необходимо перенести в файл values.yaml в блок defaults.

Пример блоков epf и epf_defaults из файла vars.yaml:

epf:
  registry: "example.registry.address"
  registry_path: "example_repo/example_path"
  replicas: 1
  pullImage: regcred
  serviceAccountName: default

epf_defaults:
  kafka_example:
    type: kafka
    bootstrap.servers: example1.ru:9092,example2.ru:9092

Соответствующий пример заполнения файла values.yaml:

registry: "example.registry.address"
registry_path: "example_repo/example_path"
replicas: 1
pullImage: regcred
serviceAccountName: default

defaults:
  kafka_example:
    type: kafka
    bootstrap.servers: example1.ru:9092,example2.ru:9092

2.3. Не используется Ansible-синтаксис {% raw %}:

Пример для Ansible:

vault.hashicorp.com/agent-inject-template-key.pem: |
    {%- raw %}
    {{- with secret "PKI/issue/role_name" "common_name=evpc.sbt" "format=pem" "ttl=20h" "private_key_format=pkcs8" -}}
    {{ .Data.private_key }}
    {{- end }}
    {%- endraw %}

Соответствующий пример файла values.yaml:

vault.hashicorp.com/agent-inject-template-key.pem: |
    {{- with secret "PKI/issue/role_name" "common_name=evpc.sbt" "format=pem" "ttl=20h" "private_key_format=pkcs8" -}}
    {{ .Data.private_key }}
    {{- end }}
  1. Далее для установки компонента EVPC необходимо:

  • запустить Jenkins Job «SynapseInstaller» с помощью пункта меню Собрать с параметрами. Об особенностях работы с Jenkins Job «SynapseInstaller» и заполяемых параметрах запуска для установки подробно описано в документации компонента «DevOps инструменты Service Mesh» (SMDL) продукта Platform V Synapse Service Mesh (SSM) в документе «Руководство оператора» раздел «SynapseInstaller»;

  • нажать кнопку Собрать и дождаться окончания выполнения задания Jenkins Job.

Настройка интеграции EVPC с сервисными системами#

Ниже описана процедура интеграции с рекомендованным АО «СберТех» продуктами:

  • Platform V Audit SE (компонент AUDT);

  • Platform V Monitor (компонент LOGA);

  • Platform V Synapse Event Transfer Service (компонент EVTA);

  • Platform V Synapse Streaming Event Processing (компонент EVPT).

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

Элементы дистрибутива, содержащие файлы скриптов развертывания и управления, описаны в разделе Состав дистрибутива и информация о дистрибутиве EVPC.

Настройка интеграции со смежными сервисами происходит в процессе конфигурации параметров в файле vars.yml. Подробнее в разделе Подготовка окружения EVPC, подраздел «Пример заполненного файла vars.yml для EVPC»

Интеграция с компонентом SMBX продукта Platform V Synapse Messaging напрямую не осуществляется. При необходимости, можно настроить взаимодействие с компонентом SMBX через компонент EVTA.

1. Интеграция с компонентом AUDT продукта Platform V Audit SE#

Настройка интеграции компонента EVPC с компонентом AUDT продукта Platform V Audit SE производится в файле vars.yml, блок настроек:

epf:
  audit: # блок настроек аудита
   service:
#    type: log # Вариант отправки событий аудита (http или log)
      type: http # Вариант отправки событий аудита (http или log)
      url.base: "http://ext-http.audit.example.ru"
      url.event.path: "/v1/event"
      url.metamodel.path: "/v1/metamodel"
      ssl.enabled: "false"
      ssl.keystore: "keystore.jks"
      ssl.keystore.password: "password"
      ssl.key.password: "password"
      ssl.truststore: "truststore.jks"
      ssl.truststore.password: "password"
      ssl.protocol: "TLSv1.2"
      ssl.verify.hostname: "false"

      send.metamodel: "true"
      metamodel.module: EVPC Stream Processor
      metamodel.version: 1.0

      redelivery.enabled: "true"
      add.redelivery.headers: "true"
      redelivery.buffers: "in-memory-buffer"
      redelivery.in-memory-buffer.type: "queue"
      redelivery.in-memory-buffer.max.size: "10k"
      redelivery.in-memory-buffer.clear.logger.name: "memory"
      request.timeout.ms: "30000"

2. Интеграция с компонентом LOGA продукта Platform V Monitor#

Настройка интеграции компонента EVPC с компонентом LOGA продукта Platform V Monitor производится в файле vars.yml, блок настроек:

epf:
  logback: # блок настроек журналирования
    level: info # Уровень вывода логов
#    loggers: # Настройка логгеров
#      - name: "ru.example.cep" # Наименование логгера
#        level: debug # Уровень логирования. Возможные значения: info/warn/debug
#      - name: "org.apache.kafka" # Наименование логгера
#        level: warn # Уровень логирования. Возможные значения: info/warn/debug
#      - name: "com.typesafe.akka" # Наименование логгера
#        level: debug # Уровень логирования. Возможные значения: info/warn/debug
    kafka:
      topic: logstash
      retries: 3 # Количество переиницилизаций продюсера
      interval: 1000 # Интервал между переиницилизациями
      multiplier: 1 # Множитель интервала переинициализации
      never_block: true # блокировка работы приложения при недоступности Kafka (при true недоставленные сообщения в kafka отбрасываются)
      discarding_threshold: 20 # процент свободного места в очереди отправки сообщений при достижении которого будут удаляться сообщения уровня TRACE, DEBUG, INFO
      queue_size: 512 # размер очереди для отправки в Кафку
      properties:
        "bootstrap.servers": "hostname-1:9092,hostname-2:9092"
        "client.id": "epf-cluster-test"
        "config.providers": decode
        "config.providers.decode.class": ru.sbt.ss.kafka.DecryptionConfigProvider
        "config.providers.decode.param.security.encoding.key": file:ssl/secret.pass
        "config.providers.decode.param.security.encoding.class": ru.sbt.ss.password.BaseEncryptor

        "security.protocol": SSL
        "ssl.endpoint.identification.algorithm": ""
        "ssl.keystore.location": "ssl/epf.jks"
        "ssl.truststore.location": "ssl/epf.jks"

        "ssl.keystore.password": <password>
        "ssl.truststore.password": <password>
        "ssl.key.password": <password>

3. Интеграция с компонентом Apache Kafka продукта Platform V Synapse Event Transfer Service#

Настройка интеграции производится в файле vars.yml, блок настроек:

epf_defaults: # Блок настроек прессетов транспорта для обработчика, данные настройки будут использоваться в конфигурации обработчика по имени прессета
  kafka_example:
    type: kafka
    bootstrap.servers: example1.ru:9092,example2.ru:9092
    security.protocol: SSL
    ssl.endpoint.identification.algorithm: "" # Отключение проверки хостнейма в сертификате, обязательно для стендов Kafka
    ssl.keystore.location: ${vault:ssl.keystore.location} # при использовании Vault
    ssl.keystore.password: ${vault:ssl.keystore.password}
    ssl.key.password: ${vault:ssl.key.password}
    ssl.truststore.location: ${vault:ssl.keystore.location}
    ssl.truststore.password: ${vault:ssl.keystore.password}
    config.providers.vault.class: ru.sbt.ss.kafka.VaultConfigProvider
    config.providers.vault.param.security.encoding.class: ru.sbt.ss.password.BaseEncryptor
    config.providers.vault.param.security.encoding.key: file:ssl/secret.pass
    config.providers.vault.param.ssl.vault.address: https://vault_address
    config.providers.vault.param.ssl.vault.tls.enable: "true"
    config.providers.vault.param.ssl.vault.tls.keystore.location: ssl/vault-client.jks
    config.providers.vault.param.ssl.vault.tls.keystore.password: "{{ jks_password }}"
    config.providers.vault.param.ssl.vault.tls.key.password: "{{ jks_password }}"
    config.providers.vault.param.ssl.vault.tls.truststore.location: ssl/vault-client.jks
    config.providers.vault.param.ssl.vault.tls.truststore.password: "{{ jks_password }}"
    config.providers.vault.param.ssl.endpoint.identification.algorithm: ""
    config.providers.vault.param.ssl.vault.auth.type: approle
    config.providers.vault.param.ssl.vault.auth.role.id: 669dc918-***-158abc0247ac
    config.providers.vault.param.ssl.vault.auth.secret.id: 298bde51-***-ba0f2ceced13
    config.providers.vault.param.ssl.vault.pki.role.name: pki-role
    config.providers.vault.param.ssl.vault.pki.common.name: evpc-dev
    config.providers.vault.param.ssl.keystore.location: /tmp/vault-keystore.jks
    config.providers.vault.param.ssl.truststore.location: /tmp/vault-truststore.jks
    config.providers.vault.param.ssl.vault.secret.path: kv1/certstore
    config.providers.vault.param.ssl.vault.engine.version: 1
    config.providers.vault.param.ssl.vault.secret.key: key
    config.providers.vault.param.ssl.vault.secret.keystore: <secret.keystore>
    config.providers.vault.param.ssl.vault.secret.truststore: <secret.truststore>
    config.providers.vault.param.ssl.vault.pki.email: email@example.com
    config.providers.vault.param.ssl.vault.namespace: my_namespace

4. Интеграция с компонентом EVTA продукта Platform V Synapse Event Transfer Service#

Настройка интеграции компонента EVPC с компонентом EVTA продукта Platform V Synapse Event Transfer Service производится обязательно в двух файлах vars.yml (для компонента EVPC и компонента EVTA):

  1. В файле vars.yml компонента EVPC, блок настроек:

epf_defaults:
  grpc_fpss_example: # используется для параметра ${defaults.grpc_fpss_example} из *.conf
    type: grpc
    url: fpss://k2_simple.common.segment/system/testevent/1 # точка подключения в fpss формате (fpss://домен.федерация.сегмент/система/имя_события/версия)
    host: reactive-stream-adapter-epfegress # имя сервиса egress адаптера
    port: 8081 # порт сервиса egress адаптера
  1. В файле vars.yaml компонента EVTA, обязательный набор параметров в блоке настроек:

reactive_stream_adapter:
   # EVPC соединяется только по протоколу GRPC
  type: grpc
   # отключение механизма автоматического коммита сообщения при вычитке адаптером
  autoCommit: false
   # Включить механизм подтверждения получения/обработки сообщения со стороны EVPC
  needInfoAboutAcknowledge: true
   # Отключение механизма остановки консьюмера при простое потока
  useStorageTime: false

5. Получение значений параметров ansible из HashiCorp Vault#

Также возможно реализовать получение значений параметров ansible из HashiCorp Vault. Для этого при указании параметров в файле vars.yml вместо значений параметров используется специальный синтаксис. Например:

ansible_password: "{{ lookup('hashi_vault', 'url=*** namespace=*** auth_method=approle role_id=*** secret_id=*** secret=*** validate_certs=0') }}"

, где:

  • url – URL для подключения к HashiCorp Vault. Например: https://my.vault.address;

  • namespace – используемый namespace;

  • auth_method – метод аутентификации. Например: approle;

  • role_id – используемый role.id;

  • secret_id – используемый secret.id;

  • secret – путь: ключ для получаемого секрета. Например: kv1/company/secret_keys:jks_password;

  • validate_certs – проверка доверия сертификата HashiCorp Vault.

Параметры подключения и аутентификации запрашиваются у администраторов HashiCorp Vault.

В результате значение переменной ansible_password будет получено из HashiCorp Vault при запуске установки.

6. Интеграция с компонентом EVPT продукта Platform V Synapse Streaming Event Processing#

Настройка интеграции компонента EVPC с компонентом EVPT производится в файле vars.yml, блок настроек:

scheduler:
  url: "localhost:8080" # Url, на котором запущен EVPT, в который будут добавляться задачи на срабатывание агрегации
  timeout: 5000 # Тайм-аут ожидания ответа
  flow.port: 9090 # Порт, на котором запущен сервер, принимающий вызовы от EVPT, для последующего срабатывания триггера
  flow.host: 0.0.0.0 # Хост, на котором запущен сервер, принимающий вызовы от EVPT, для последующего срабатывания триггера
  flow.advertisedPort: 9090 # Порт сервиса для callback от EVPT
  flow.advertisedHost: localhost # Имя сервиса для callback от EVPT

Для того, чтобы вызов EVPT был защищенным, возможно использование параметров с префиксом scheduler..

Аналогично, чтобы внутренний сервер, принимающий вызовы от EVPT, для последующего срабатывания триггера был запущен с SSL-контекстом возможно использование параметров с префиксом scheduler.flow..

Настройка интеграции EVPC с Istio#

Для работы EVPC с Istio возможно указание параметров в конфигурационном файле vars.yml.

В аннотации развертывания (поле annotations файла vars.yml) необходимо добавить:

sidecar.istio.io/inject: 'true'

Блок настроек файла vars.yml, относящихся к Istio, представлен в файле example_istio.

Получение сертификатов из Vault#

В блоке параметров для работы с Istio некоторые значения являются сертификатами, находящимися в egress/ingress контейнерах. Данные сертификаты могут быть получены из Vault.

Для этого в развертывании указанных контейнеров необходимо добавить аннотации для работы с Vault:

Аннотация

Описание

Значение

vault.hashicorp.com/role

Используемая для аутентификации роль

Роль

vault.hashicorp.com/namespace

Используемое пространство имен, которое будет использоваться при запросе секретов из Vault

Namespace

vault.hashicorp.com/agent-inject

Включение инъекции Vault Agent Sidecar

true/false

vault.hashicorp.com/agent-init-first

Должны ли быть получены секреты до старта самого контейнера приложения

false

vault.hashicorp.com/agent-pre-populate

Включать ли контейнер init для предварительного заполнения тома общей памяти секретами перед запуском контейнеров

true/false

vault.hashicorp.com/preserve-secret-case

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

true/false

vault.hashicorp.com/agent-limits-cpu

Настраивает ограничения на использование CPU в контейнерах Vault Agent

По умолчанию 500m, пустая строка отключает ограничения

vault.hashicorp.com/agent-requests-cpu

Настраивает ограничения на запрос CPU в контейнерах Vault Agent

По умолчанию 250m, пустая строка отключает ограничения

vault.hashicorp.com/agent-limits-mem

Настраивает ограничения на использование памяти в контейнерах Vault Agent

По умолчанию 128Mi, пустая строка отключает ограничения

vault.hashicorp.com/agent-requests-mem

Настраивает ограничения на запрос памяти в контейнерах Vault Agent

По умолчанию 64Mi, пустая строка отключает ограничения

vault.hashicorp.com/agent-inject-secret-<имя_файла>

Секрет, полученный из хранилища, будет добавлен в контейнер с указанным именем файла. Если используется agent-inject-template, то для того, чтобы полученный секрет был записан в файл, необходимо указать данную аннотацию с любым значением (будет переписано шаблоном)

true/false (рекомендовано) или путь до KV хранилища, где находится секрет

vault.hashicorp.com/secret-volume-path-<имя_файла>

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

В какую директорию будет записан полученный секрет

vault.hashicorp.com/agent-inject-template-<имя_файла>

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

Шаблон для получения секрета

Пример аннотаций для выгрузки KV секрета:#

  annotations:
    vault.hashicorp.com/agent-inject-secret-test.yml: 'true'
    vault.hashicorp.com/secret-volume-path-test.yml: /vault/test
    vault.hashicorp.com/namespace: namespace
    vault.hashicorp.com/role: role
    vault.hashicorp.com/agent-inject: 'true'
    vault.hashicorp.com/agent-init-first: 'false'

После запуска в контейнере в директории /vault/test появится файл test.yml. В файле будут содержаться ключи и значения секрета PATH/TO/KV/test. Предположим, что в секрете содержатся следующие значения: key1 -> value1 и key2 -> value2, тогда содержимое файла будет:

sh-4.4$ cat /vault/test/test.yml
key: value1
keystore: value2

Если необходимо получить конкретное значение:

  annotations:
    vault.hashicorp.com/agent-inject-secret-test.yml: 'true'
    vault.hashicorp.com/secret-volume-path-test.yml: /vault/test
    vault.hashicorp.com/agent-inject-template-test.yml: |
      {%- raw %}
      {{- with secret "PATH/TO/KV/test" -}}
      {{ index .Data "key1" }}
      {{- end }}
      {%- endraw %}
    vault.hashicorp.com/namespace: namespace
    vault.hashicorp.com/role: role
    vault.hashicorp.com/agent-inject: 'true'
    vault.hashicorp.com/agent-init-first: 'false'

После запуска в контейнере в директории /vault/test появится файл test.yml. В файле будет содержаться значения key1 секрета PATH/TO/KV/test:

sh-4.4$ cat /vault/test/test.yml
value1

Пример аннотаций для выпуска сертификата через Vault:#

  annotations:
    vault.hashicorp.com/agent-inject-secret-ca.cert: 'true'
    vault.hashicorp.com/secret-volume-path-ca.cert: /vault/test
    vault.hashicorp.com/agent-inject-template-ca.cert: >
      {{- with secret "PKI/issue/role" "common_name=test" -}}

      {{ .Data.issuing_ca }}

      {{- end }}
    vault.hashicorp.com/agent-inject-secret-server.key: 'true'
    vault.hashicorp.com/secret-volume-path-server.key: /vault/test
    vault.hashicorp.com/agent-inject-template-server.key: >
      {{- with secret "PKI/issue/role" "common_name=test" -}}

      {{ .Data.private_key }}

      {{- end }}
    vault.hashicorp.com/namespace: namespace
    vault.hashicorp.com/role: role
    vault.hashicorp.com/agent-inject: 'true'
    vault.hashicorp.com/agent-init-first: 'false'
    vault.hashicorp.com/agent-inject-secret-server.cert: 'true'
    vault.hashicorp.com/secret-volume-path-server.cert: /vault/test
    vault.hashicorp.com/agent-inject-template-server.cert: >
      {{- with secret "PKI/issue/role" "common_name=test" -}}

      {{ .Data.certificate }}

      {{- end }}

После запуска в контейнере в директории /vault/test появится три файла: server.cert, server.key, ca.cert.

Пример аннотаций для получения сертификата через Vault:#

  annotations:
    vault.hashicorp.com/agent-inject-secret-ca.cert: 'true'
    vault.hashicorp.com/secret-volume-path-ca.cert: /vault/test
    vault.hashicorp.com/agent-inject-template-ca.cert: >
      {{- with secret "PATH/TO/KV/cert" -}}

      {{ base64Decode (index .Data "ca.cert") }}

      {{- end }}
    vault.hashicorp.com/agent-inject-secret-server.key: 'true'
    vault.hashicorp.com/secret-volume-path-server.key: /vault/test
    vault.hashicorp.com/agent-inject-template-server.key: >
      {{- with secret "PATH/TO/KV/cert" -}}

      {{ base64Decode (index .Data "server.key") }}

      {{- end }}
    vault.hashicorp.com/namespace: namespace
    vault.hashicorp.com/role: role
    vault.hashicorp.com/agent-inject: 'true'
    vault.hashicorp.com/agent-init-first: 'false'
    vault.hashicorp.com/agent-inject-secret-server.cert: 'true'
    vault.hashicorp.com/secret-volume-path-server.cert: /vault/test
    vault.hashicorp.com/agent-inject-template-server.cert: >
      {{- with secret "PATH/TO/KV/cert" -}}

      {{ base64Decode (index .Data "server.cert") }}

      {{- end }}

После запуска в контейнере в директории /vault/test появится три файла: server.cert, server.key, ca.cert.

Настройка egress/ingress для работы с Vault#

Ниже приведены примеры шаблонов, которые необходимы для настройки работы контейнеров, использующих egress/ingress с Vault:

Service:

apiVersion: v1
kind: Service
metadata:
  name: egressgateway-svc
  labels:
    egress: {{.Values.istio.egress.projectName}}
spec:
  ports:
    - name: http-{{ .Values.istio.egress.egressPort }}
      port: {{ .Values.istio.egress.egressPort }}
      protocol: TCP
    - name: tls-8550
      protocol: TCP
      port: 8550
      targetPort: 8550
      {{- range .Values.istio.egress.services_ports }}
    - name: tcp-{{.}}
      protocol: TCP
      port: {{.}}
      targetPort: {{.}}
      {{- end }}
  selector:
    app: egressgateway-{{ .Values.istio.egress.projectName }}
    istio: egressgateway-{{ .Values.istio.egress.projectName }}

Gateway:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: egress-secman-gw
  labels:
    egress: {{.Values.istio.egress.projectName}}
spec:
  selector:
    istio: egressgateway-{{ .Values.istio.egress.projectName }}
  servers:
    - hosts:
        - {{ .Values.istio.egress.secmanHost }}
      port:
        name: tls-8550
        number: 8550
        protocol: TLS
      tls:
        mode: PASSTHROUGH

VirtualService:

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  namespace: {{ .Values.istio.egress.projectName }}
  name: egress-secman-vs
  labels:
    egress: {{.Values.istio.egress.projectName}}
spec:
  exportTo:
    - .
  gateways:
    - egress-secman-gw
    - mesh
  hosts:
    - {{ .Values.istio.egress.secmanHost }}
  tls:
    - match:
        - gateways:
            - mesh
          port: 443
          sniHosts:
            - {{ .Values.istio.egress.secmanHost }}
      route:
        - destination:
            host: egressgateway-svc.{{ .Values.istio.egress.projectName }}.svc.cluster.local
            port:
              number: 8550
    - match:
        - gateways:
            - egress-secman-gw
          port: 8550
          sniHosts:
            - {{ .Values.istio.egress.secmanHost }}
      route:
        - destination:
            host: {{ .Values.istio.egress.secmanHost }}
            port:
              number: 443

ServiceEntry:

apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: egress-secman-se
  namespace: {{ .Values.istio.egress.projectName }}
  labels:
    egress: {{.Values.istio.egress.projectName}}
spec:
  exportTo:
    - .
  hosts:
    - {{ .Values.istio.egress.secmanHost }}
  location: MESH_EXTERNAL
  ports:
    - name: tls-443
      number: 443
      protocol: TLS
  resolution: DNS

PeerAuthentication:

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: egress-pa
  namespace: {{ .Values.istio.egress.projectName }}
  labels:
    egress: {{.Values.istio.egress.projectName}}
spec:
  portLevelMtls:
    '8550':
      mode: DISABLE
  selector:
    matchLabels:
      app: egressgateway-{{ .Values.istio.egress.projectName }}

DestinationRule:

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: egress-secman-dr
  namespace: {{ .Values.istio.egress.projectName }}
  labels:
      egress: {{ .Values.istio.egress.projectName }}
spec:
  exportTo:
    - .
  host: egressgateway-svc.{{ .Values.istio.egress.projectName }}.svc.cluster.local
  trafficPolicy:
    outlierDetection:
      consecutive5xxErrors: 7
      interval: 5m
      baseEjectionTime: 15m
      maxEjectionPercent: 10
    portLevelSettings:
      - port:
          number: 8550
        tls:
          mode: DISABLE

Здесь в параметрах блока outlierDetection задается настройка автоматического выключателя, которая отслеживает состояние каждого отдельного host в вышестоящей службе. Применимо как к службам HTTP и TCP:

  • для HTTP-сервисов hosts, которые постоянно возвращают ошибки 5xx для вызовов API, выбрасываются из пула на заранее определенный период времени;

  • для TCP-сервисов тайм-ауты соединения или сбои соединения с данным host считаются ошибкой при измерении последовательной метрики ошибок.

Подготовка базы данных для работы с хранением окон агрегации для EVPC#

Предусловия#

  1. Предварительно необходимо заполнить параметры в конфигурационном файле vars.yml в блоке db. Ознакомиться с примером можно в разделе Подготовка окружения EVPC, подраздел «Пример заполненного файла vars.yml для EVPC».

  2. При ручной настройке базы данных необходимо:

  • разархивировать архив ./EVPC-dbinit-[version]-distrib.zip в папку files;

  • перенести библиотеку encryptor-cli-2.4.0-fatjar.jar из директории ./package/bh в корень директории Ansible.

Ручной способ с помощью Ansible#

Запустите настройку базы данных командой в терминале из папки Ansible:

ansible-playbook -i inventories/<ID>/inventory <PLAYBOOK>.yml --ask-vault-pass

где:

  • ID — имя недавно созданного inventory;

  • PLAYBOOK — playbook для настройки базы дынных: db.yml.

При помощи Jenkins#

Для настройки базы данных с помощью Jenkins используйте задание Jenkins db_action с выбором playbook db.yml без указания тегов. Процесс создания задания Jenkins db_action приведен в разделе Подготовка окружения EVPC, подраздел «Создание Jenkins Job db_action».

Настраиваемые параметры:

  • job_config_renew — перенастройка задания Jenkins. Данный параметр используется, если был добавлен новый inventory. Меняет значения по умолчанию всех параметров. Сохраняет предыдущее состояние параметров inventories_repo, inventories_branch, inventories_path;

  • inventory — имя inventory для установки;

  • nexusUrl — полный путь до дистрибутива (можно указать несколько через запятую);

  • db_action — выбор действия, которое необходимо выполнить: update;

  • jenkins_slave — выбор jenkins slave;

  • jdk_tool — указание Jenkins Tool с нужной версией JDK, конкретное значение необходимо получить у администратора Jenkins;

  • ansible_branch — используется для работы с несколькими ветками скриптов развертывания. Работает только при значении Branch Specifier (blank for „any“) равным ${ansible_branch};

  • ansible_version — указание Jenkins Tool с необходимой версией Ansible. Конкретное значение необходимо получить у администратора Jenkins;

  • nexus_user_cred — ID credential типа username with password для выкачивания дистрибутива компонента из Nexus. Чтобы получить username и password для Nexus из SecMan, необходимо заполнить параметр secman_url в формате: JenkinsCredID |SecManPath:SecManKeys|SecManParams, где:

    • JenkinsСredID — Jenkins Vault App Role Credential ID c реквизитами для подключения к SecMan;

    • SecManPath — путь к секретам в SecMan;

    • SecManKeys — имена полей для username и password в SecMan (через запятую);

    • SecManParams — параметры для подключения к SecMan (через точку с запятой). Если данные параметры по умолчанию, то пропускаются вместе с «|». Примеры:

      • SecManAppRoleCred|/CI01994970_CI02618129_ES/A/DEV/APP/JEN/KV/nexus:username,password

      • SecManAppRoleCred|/CI01994970_CI02618129_ES/A/DEV/APP/JEN/KV/nexus:username,password|engineVersion:2

  • vault_cred — ID credential типа secret file со строкой для расшифровки паролей ansible vault (можно указывать несколько через запятую). Чтобы получить ansible vault password из SecMan, необходимо заполнить параметр secman_url в формате: JenkinsСredID|SecManPath:SecManKey|SecManParams, где:

    • JenkinsСredID — Jenkins Vault App Role Credential ID с реквизитами для подключения к SecMan;

    • SecManPath — путь к секрету в SecMan;

    • SecManKey — имя поля для ansible vault password в SecMan;

    • SecManParams — параметры для подключения к SecMan (через точку с запятой). Если данные параметры по умолчанию, то пропускаются вместе с «|» (в качестве пароля можно использовать не строку, а файл в base64 формате и секрет в SecMan с именем, оканчивающимся на «Base640», например: myVaultBase64). Примеры:

      • SecManAppRoleCred|/CI01994970_CI02618129_ES/A/DEV/APP/JEN/KV/vault:ansible_vault_password

      • SecManAppRoleCred|/CI01994970_CI02618129_ES/A/DEV/APP/JEN/KV/vault:ansible_vault_password|engineVersion:2

      • SecManAppRoleCred1|/CI01994970_CI02618129_ES/A/DEV/APP/JEN/KV/vault:ansible_vault_password1,SecManAppRoleCred2|/CI01994970_CI02618129_ES/A/DEV/APP/JEN/KV/vault:ansible_vault_password2

      • SecManAppRoleCred1|/CI01994970_CI02618129_ES/A/DEV/APP/JEN/KV/vault:ansible_vault_password1|engineVersion:2,SecManAppRoleCred2|/CI01994970_CI02618129_ES/A/DEV/APP/JEN/KV/vault:ansible_vault_password2|engineVersion:2

  • secman_url — URL для подключения к HashiCorp Vault;

  • ssl_verify — проверка, являются ли сертификаты HashiCorp Vault/Nexus доверенными;

  • second_hand_approve — подтверждение запуска другим администратором (контроль «второй рукой»). Двухэтапное подтверждение запуска, требующее действия другого администратора для запуска задания Jenkins Job. При активации этой опции одному администратору будет недоступна возможность запуска задания Jenkins Job без подтверждения со стороны другого администратора;

  • inventories_repo — репозиторий с inventory (ssh://);

  • inventories_branch — ветка репозитория;

  • inventories_path — путь до inventories от корня репозитория.

Конфигурирование EVPC для работы с Граничным прокси (IGEG)#

Описание работы с транспортом Kafka#

Для работы компонента EVPC с компонентом Граничный прокси (IGEG) продукта Platform V Synapse Service Mesh необходимо в файле vars.yml в блоке istio заполнить параметры в блоках annotations и kafka.

Пример заполнения блока annotations#

За выпуск сертификатов для подключения отвечает vault-agent по параметрам из аннотаций, которые указываются в блоке istio.egress.deployment.annotations файла vars.yml.

annotations:
  sidecar.istio.io/inject: "true" # Включение интеграции с Сервисным прокси SVPX/ istio

Пример заполнения блока istio#

Компонент EVPC подключается к внутренним hosts Kafka без пртокола TLS по PLAINTEXT, терминация трафика происходит на Граничном прокси (IGEG).

Для перечисления hosts брокеров кластера Kafka необходимо использовать блок istio.kafka.

  istio: # настройки манифестов Istio
    egress:
      deployment:
        create: true
        name: evpc-egressgateway
        resources:
          limits:
            cpu: 0.5
            memory: 128M
          requests:
            cpu: 0.3
            memory: 64M
        annotations: # Заполнить аннотации для выпуска сертификатов
          sidecar.istio.io/inject: "true" # Включение интеграции с Сервисным прокси SVPX/ istio
          vault.hashicorp.com/namespace: TEST
          vault.hashicorp.com/role: test-role
        labels:
          secman-injector: enabled # Лейбл для активации интеграции с secman vault agent injector
        istioDiscoveryService: istiod-syn-cp # сервис по которому доступен istiod
        istioControlPlane: syn-cp # имя контролькой панели Istio
        proxyImage: <ссылка на образ istio-proxy для граничного прокси>
    peerAuthentication:
      create: true
      name: peer-auth-0-test
      mtls_mode: STRICT # UNSET (default) | DISABLE | PERMISSIVE | STRICT
    egressService: # параметры сервиса Egress
      name: "egressgateway0-svc-test" # имя сервиса Egress
      create: true # создавать ли манифест сервиса
      internalPort: 15021 # внутренний порт Egress
      internalPortName: status-port # имя внутреннего порта Egress
      internalPortProtocol: TCP # протокол внутреннего порта Egress
      selector: # содержимое поля spec.selector в манифесте сервиса
        app: evpc-egressgateway
        istio: egressgateway
    gateway: # параметры манифеста Gateway для Istio Egress
      name: egressgateway0-gw-test # имя манифеста
      create: true # создавать ли манифест
      selector: # содержимое поля spec.selector в манифесте
        app: evpc-egressgateway
        istio: egressgateway
      destinationRule:
        name: egressgateway0-dr-test
        create: true
    kafka: # параметры для направления kafka трафика через istio egressgateway. Можно указать список bootstrap серверов кафки
     - hosts: bootstrap.server1.host:9093,bootstrap.server2.host:9093 # хост и порт bootstrap серверов кафки. Если кластер, можно указать несколько. Разделитель ","
       gwPort: 10092 # порт сервиса egressgateway по которому будет доступна кафка изнутри неймспейса
       gwTls:
         mode: ISTIO_MUTUAL # Валидные значения: "PASSTHROUGH", "SIMPLE", "MUTUAL", "AUTO_PASSTHROUGH", "ISTIO_MUTUAL", "OPTIONAL_MUTUAL"
       destinationRule: # параметры для манифеста DestinationRule Istio для кафки
         create: true # создавать ли манифест
         outlierDetection:
           consecutive5xxErrors: 5
           interval: 5m
           baseEjectionTime: 5m
           maxEjectionPercent: 50
         tls:
           mode: MUTUAL
           clientCertificate: /path/to/egress/certificates/ca-chain.cert.pem
           privateKey: /path/to/egress/certificates/tls.crt
           caCertificates: /path/to/egress/certificates/tls.key
       virtualService: # параметры для манифеста VirtualService для кафки
         create: true # создавать ли манифест
    vault: # параметры для интеграции с HashiCorp Vault
      host: hostname # хост сервиса HashiCorp Vault
      port: 8443 # порт сервиса HashiCorp Vault для обращения из pod'а
      externalPort: 8443 # порт сервиса HashiCorp Vault
      # Порты и протоколы ниже используются в манифестах VirtualService, Gateway, Gateway Service
      # Поддерживаемые gwSvc протоколы - "SCTP", "TCP", "UDP"
      gwPort: 9447 # порт на egressGateway
      gwProtocol: TLS # протокол на egressGateway
      gwSvcProtocol: TCP # протокол на service egressGateway
      gwTls:
        mode: PASSTHROUGH # Валидные значения: "PASSTHROUGH", "SIMPLE", "MUTUAL", "AUTO_PASSTHROUGH", "ISTIO_MUTUAL", "OPTIONAL_MUTUAL"
      destinationRule: # параметры для манифеста DestinationRule Istio
        name: epf-vault-dr-test # имя манифеста
        create: false # создавать ли манифест
        outlierDetection:
          consecutive5xxErrors: 5
          interval: 5m
          baseEjectionTime: 5m
          maxEjectionPercent: 50
      virtualService: # параметры для манифеста VirtualService
        name: epf-vault-vs-test # имя манифеста
        protocol: tls # протокол для создания virtual service. Валидные значения: http, tls, tcp
        create: true # создавать ли манифест VirtualService
    serviceEntry:
      - host: hostname
        resolution: DNS
        port:
          name: HTTPS-vault
          number: 8443
          protocol: HTTPS
    epf_defaults:
        kafka: # Указываются параметры подключения к кафке без параметров ssl
            type: kafka
            bootstrap.servers: example.ru:10092 # необходимо указать внутренний адрес сервиса из блока istio.egressService.name
            group.id: kafka_js_demo
            enable.idempotence: "false"

Блок istio.serviceEntry предназначен для соединений отличных от Kafka.

При запуске создаются:

  • манифест Deployment «evpc-eggressgateway» с Istio proxy;

  • манифесты Istio для маршрутизации трафика от EVPC через Deployment «evpc-eggressgateway» в Kafka.

Описание работы с базой данных#

Для работы компонента EVPC с компонентом Граничный прокси (IGEG) продукта Platform V Synapse Service Mesh необходимо в файле vars.yaml в блоке istio заполнить параметры в блоках annotations и postgres.

Пример заполнения блока annotations#

За выпуск сертификатов для подключения отвечает vault-agent по параметрам из аннотаций, которые указываются в блоке istio.egress.deployment.annotations файла vars.yml.

annotations:
  sidecar.istio.io/inject: "true" # Включение интеграции с Сервисным прокси SVPX/ istio

Пример заполнения блока istio#

Компонент EVPC подключается к внутренним hosts базы данных без пртокола TLS по PLAINTEXT, терминация трафика происходит на Граничном прокси (IGEG).

Для перечисления hosts базы данных необходимо использовать блок istio.postgres.

  istio: # настройки манифестов Istio
    egress:
      deployment:
        create: true
        name: evpc-egressgateway
        resources:
          limits:
            cpu: 0.5
            memory: 128M
          requests:
            cpu: 0.3
            memory: 64M
        annotations: # Заполнить аннотации для выпуска сертификатов
          sidecar.istio.io/inject: "true" # Включение интеграции с Сервисным прокси SVPX/ istio
          vault.hashicorp.com/namespace: TEST
          vault.hashicorp.com/role: test-role
        labels:
          secman-injector: enabled # Лейбл для активации интеграции с secman vault agent injector
        istioDiscoveryService: istiod-syn-cp # сервис по которому доступен istiod
        istioControlPlane: syn-cp # имя контролькой панели Istio
        proxyImage: <ссылка на образ istio-proxy для граничного прокси>
    peerAuthentication:
      create: true
      name: peer-auth-0-test
      mtls_mode: STRICT # UNSET (default) | DISABLE | PERMISSIVE | STRICT
    egressService: # параметры сервиса Egress
      name: "egressgateway0-svc-test" # имя сервиса Egress
      create: true # создавать ли манифест сервиса
      internalPort: 15021 # внутренний порт Egress
      internalPortName: status-port # имя внутреннего порта Egress
      internalPortProtocol: TCP # протокол внутреннего порта Egress
      selector: # содержимое поля spec.selector в манифесте сервиса
        app: evpc-egressgateway
        istio: egressgateway
    gateway: # параметры манифеста Gateway для Istio Egress
      name: egressgateway0-gw-test # имя манифеста
      create: true # создавать ли манифест
      selector: # содержимое поля spec.selector в манифесте
        app: evpc-egressgateway
        istio: egressgateway
      destinationRule:
        name: egressgateway0-dr-test
        create: true
    postgres: # настройки манифестов Istio для работы с базой данных
      - host: postgres.host # хост сервиса Postgres; указывать валидный SAN из сертификата
        port: 5432 # порт сервиса Postgres для обращения из pod'а
        externalPort: 5432 # порт сервиса Postgres
        # Порты и протоколы ниже используются в манифестах VirtualService, Gateway, Gateway Service
        # Поддерживаемые gwSvc протоколы - "SCTP", "TCP", "UDP"
        gwPort: 9445 # порт на egressGateway
        gwProtocol: TCP # протокол на egressGateway
        gwSvcProtocol: TCP # протокол на service egressGateway
        gwTls:
          mode: ISTIO_MUTUAL # Валидные значения: "PASSTHROUGH", "SIMPLE", "MUTUAL", "AUTO_PASSTHROUGH", "ISTIO_MUTUAL", "OPTIONAL_MUTUAL"
        destinationRule:
          create: false # создавать ли манифест
          tls:
            mode: MUTUAL # DISABLE | SIMPLE | MUTUAL (own certs) | ISTIO_MUTUAL (control plane certs)
            caCertificates: /path/to/egress/certificates/ca-chain.cert.pem
            clientCertificate: /path/to/egress/certificates/tls.crt
            privateKey: /path/to/egress/certificates/tls.key
          outlierDetection:
            consecutive5xxErrors: 5
            interval: 5m
            baseEjectionTime: 5m
            maxEjectionPercent: 50
        virtualService: # параметры для манифеста VirtualService
          create: false # создавать ли манифест VirtualService
    vault: # параметры для интеграции с HashiCorp Vault
      host: hostname # хост сервиса HashiCorp Vault
      port: 8443 # порт сервиса HashiCorp Vault для обращения из pod'а
      externalPort: 8443 # порт сервиса HashiCorp Vault
      # Порты и протоколы ниже используются в манифестах VirtualService, Gateway, Gateway Service
      # Поддерживаемые gwSvc протоколы - "SCTP", "TCP", "UDP"
      gwPort: 9447 # порт на egressGateway
      gwProtocol: TLS # протокол на egressGateway
      gwSvcProtocol: TCP # протокол на service egressGateway
      gwTls:
        mode: PASSTHROUGH # Валидные значения: "PASSTHROUGH", "SIMPLE", "MUTUAL", "AUTO_PASSTHROUGH", "ISTIO_MUTUAL", "OPTIONAL_MUTUAL"
      destinationRule: # параметры для манифеста DestinationRule Istio
        name: epf-vault-dr-test # имя манифеста
        create: false # создавать ли манифест
        outlierDetection:
          consecutive5xxErrors: 5
          interval: 5m
          baseEjectionTime: 5m
          maxEjectionPercent: 50
      virtualService: # параметры для манифеста VirtualService
        name: epf-vault-vs-test # имя манифеста
        protocol: tls # протокол для создания virtual service. Валидные значения: http, tls, tcp
        create: true # создавать ли манифест VirtualService
    serviceEntry:
      - host: hostname
        resolution: DNS
        port:
          name: HTTPS-vault
          number: 8443
          protocol: HTTPS
    epf_defaults:
        kafka: # Указываются параметры подключения к кафке без параметров ssl
            type: kafka
            bootstrap.servers: example.ru:10092 # необходимо указать внутренний адрес сервиса из блока istio.egressService.name
            group.id: kafka_js_demo
            enable.idempotence: "false"

Блок istio.serviceEntry предназначен для соединений отличных от базы данных.

При запуске создаются:

  • манифест Deployment «evpc-eggressgateway» с Istio proxy;

  • манифесты Istio для маршрутизации трафика от EVPC через Deployment «evpc-eggressgateway» в базе данных.

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

  1. Service — сервис для Deployment «evpc-eggressgateway»:

kind: Service
apiVersion: v1
metadata:
  name: egressgateway0-svc-test
  namespace: namespace
  labels:
    app: eventprocessflowakka-evpc-js
    app.kubernetes.io/managed-by: Helm
    appVersion: version
    istio: egressgateway
    version: 3.0.0-14
spec:
  clusterIP:
  ipFamilies:
    - IPv4
  ports:
    - name: status-port
      protocol: TCP
      port: 15021
      targetPort: 15021
    - name: tcp-vault-9447
      protocol: TCP
      port: 9447
      targetPort: 9447
    - name: kafka-10092
      protocol: TCP
      port: 10092
      targetPort: 10092
  internalTrafficPolicy: Cluster
  clusterIPs:
  type: ClusterIP
  ipFamilyPolicy: SingleStack
  sessionAffinity: None
  selector:
    app: evpc-egressgateway
    istio: egressgateway
  1. ServiceEntry — запись для доступа к брокерам Kafka вне ServiceMesh:

apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: vm-syevseg-sy-broker1-9092-service-entry
  namespace: namespace
spec:
  endpoints:
    - address: broker1
      ports:
        kafka-9092: 9092
    - address: broker2
      ports:
        kafka-9092: 9092
  exportTo:
    - .
  hosts:
    - broker1
  location: MESH_EXTERNAL
  ports:
    - name: kafka-9092
      number: 9092
      protocol: kafka
  resolution: DNS
  1. VirtualService — правило для перенаправления трафика внутри mesh на «evpc-egressgateway» и из него в Kafka:

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  resourceVersion: '345483853'
  name: eventprocessflowakka-evpc-js-kafka-vs-10092
  namespace: namespace
  labels:
    app: eventprocessflowakka-evpc-js
    app.kubernetes.io/managed-by: Helm
    appVersion: version
    version: 3.0.0-14
spec:
  exportTo:
    - .
  gateways:
    - egressgateway0-gw-test
    - mesh
  hosts:
    - egressgateway0-svc-test.namespace.svc.cluster.local
  tcp:
    - match:
        - gateways:
            - mesh
          port: 10092
      route:
        - destination:
            host: egressgateway0-svc-test
            port:
              number: 10092
    - match:
        - gateways:
            - egressgateway0-gw-test
          port: 10092
      route:
        - destination:
            host: broker1
            port:
              number: 9092
  1. Gateway — указывает какой порт открыть в прокси «evpc-egressgateway»:

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: egressgateway0-gw-test
  namespace: namespace
  labels:
    app: eventprocessflowakka-evpc-js
    app.kubernetes.io/managed-by: Helm
    appVersion: version
    version: 3.0.0-14
spec:
  selector:
    app: evpc-egressgateway
    istio: egressgateway
  servers:
    - hosts:
        - secman.solution.sbt
      port:
        name: tls-vault-9447
        number: 9447
        protocol: TLS
      tls:
        mode: PASSTHROUGH
    - hosts:
        - egressgateway0-svc-test.namespace.svc.cluster.local
      port:
        name: kafka-10092
        number: 10092
        protocol: kafka
      tls:
        mode: ISTIO_MUTUAL
  1. DestinationRule — задает правило, с какими сертификатами подключаться к кластеру Kafka (одно на каждый брокер Kafka):

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: eventprocessflowakka-evpc-js-kafka-dr-10092
  namespace: namespace
spec:
  exportTo:
    - .
  host: broker1
  trafficPolicy:
    tls:
      clientCertificate: <сертификат выпускаемый vault-agent>
      caCertificates: <сертификат УЦ от vault-agent>
      mode: MUTUAL
      privateKey: <приватный ключ выпускаемый vault-agent>
  workloadSelector:
    matchLabels:
      istio: egressgateway
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: eventprocessflowakka-evpc-js-kafka-dr-10092
  namespace: namespace
spec:
  exportTo:
    - .
  host: broker2
  trafficPolicy:
    tls:
      clientCertificate: <сертификат выпускаемый vault-agent>
      caCertificates: <сертификат УЦ от vault-agent>
      mode: MUTUAL
      privateKey: <приватный ключ выпускаемый vault-agent>
  workloadSelector:
    matchLabels:
      istio: egressgateway

Масштабирование количества pods#

При необходимости масштабирования количества pods следует:

  • изменить параметр replicas в конфигурационном файле inventories/<наименование инвентори>/group_vars/all/vars.yml:

epf:
  replicas: 2 # количество pods в EVPC (2 по умолчанию)

Оператор EVPC#

Описание оператора EVPC#

Оператор EVPC предназначен для управления процессом автоматического развертывания компонента EVPC и запуска потоков обработки на нем.

Конфигурация для запуска оператора EVPC#

Имя

Значение по умолчанию

Описание

k8s.namespaces

-

Список пространств, в которых оператор отслеживает ресурсы

grpc.port

8080

Порт, на котором запускается сервер в операторе

grpc.retries.count

1

Количество повторных отправок сообщений (при ошибке отправки) сервером

grpc.retries.interval

1000

Интервал между повторными отправками сообщений (при ошибке отправки) сервером

grpc.retries.multiplier

1

Множитель для интервала между повторными отправками сообщений (при ошибке отправки) сервером

grpc.healthcheck.port

8081

Порт, на котором запускается healthcheck сервер в операторе

grpc.healthcheck.host

0.0.0.0

Хост, на котором запускается healthcheck сервер в операторе

audit.enabled

false

При значении true, необходимо задать настройки для инициализации аудит клиента

Пример конфигурации:

{
  "k8s": {
    "namespaces": ["operator-test"]
  },

  "grpc": {
    "port": 8089,
    "retries": {
      "count": 4,
      "interval": 1000,
      "multiplier": 2
    }
  },
  "healthcheck": {
    "host": "0.0.0.0",
    "port": 9000
  },
  "audit": {
    "enabled": false
  }
}

Сценарии использования#

Развертывание обработчика#

Для развертывания используется ресурс SynapseEvpcRunner.

kind: CustomResourceDefinition
apiVersion: apiextensions.k8s.io/v1
metadata:
  name: runners.event.shared.evpc.synapse.platformv.sbertech.ru
spec:
  group: event.shared.evpc.synapse.platformv.sbertech.ru
  names:
    plural: runners
    singular: runner
    shortNames:
      - rnr
    kind: SynapseEvpcRunner
    listKind: SynapseEvpcRunnerList
  scope: Namespaced
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              required:
                - templateProperties
              properties:
                additionalProperties:
                  type: object
                  additionalProperties:
                    type: string
                annotations:
                  type: object
                  additionalProperties:
                    type: string
                environment:
                  type: object
                  additionalProperties:
                    type: string
                labels:
                  type: object
                  additionalProperties:
                    type: string
                templateProperties:
                  type: object
                  properties:
                    affinityWeight:
                      type: string
                      nullable: true
                    configMapName:
                      type: string
                      nullable: true
                    containerArgs:
                      type: array
                      items:
                        type: string
                    containerPort:
                      type: string
                      nullable: true
                    containerPortName:
                      type: string
                      nullable: true
                    image:
                      type: string
                    imagePullPolicy:
                      type: string
                      nullable: true
                    imagePullSecrets:
                      type: string
                    livenessProbeFailureThreshold:
                      type: string
                      nullable: true
                    livenessProbeInitialDelaySeconds:
                      type: string
                      nullable: true
                    livenessProbePeriodSeconds:
                      type: string
                      nullable: true
                    livenessProbePort:
                      type: string
                      nullable: true
                    livenessProbeSuccessThreshold:
                      type: string
                      nullable: true
                    livenessProbeTimeoutSeconds:
                      type: string
                      nullable: true
                    minReadySeconds:
                      type: string
                      nullable: true
                    progressDeadlineSeconds:
                      type: string
                      nullable: true
                    readinessProbeFailureThreshold:
                      type: string
                      nullable: true
                    readinessProbeInitialDelaySeconds:
                      type: string
                      nullable: true
                    readinessProbePeriodSeconds:
                      type: string
                      nullable: true
                    readinessProbePort:
                      type: string
                      nullable: true
                    readinessProbeSuccessThreshold:
                      type: string
                      nullable: true
                    readinessProbeTimeoutSeconds:
                      type: string
                      nullable: true
                    replicas:
                      type: string
                    resourceLimitsCpu:
                      type: string
                      nullable: true
                    resourceLimitsMemory:
                      type: string
                      nullable: true
                    resourceRequestsCpu:
                      type: string
                      nullable: true
                    resourceRequestsMemory:
                      type: string
                      nullable: true
                    revisionHistoryLimit:
                      type: string
                      nullable: true
                    rollingUpdateMaxSurge:
                      type: string
                      nullable: true
                    rollingUpdateMaxUnavailable:
                      type: string
                      nullable: true
                    schedulerName:
                      type: string
                      nullable: true
                    secretName:
                      type: string
                      nullable: true
                    serviceAccountName:
                      type: string
                      nullable: true
                    terminationGracePeriodSeconds:
                      type: string
                      nullable: true
                    topologyKey:
                      type: string
                      nullable: true

Пример заполненного ресурса:

apiVersion: event.shared.evpc.synapse.platformv.sbertech.ru/v1
kind: SynapseEvpcRunner
metadata:
  name: event-flow-process-test
  namespace: operator-test
spec:
  labels:
    app: ru.sbertech.platformv.synapse.shared.event.flow.process.test
    version: v1
  templateProperties:
    configMapName: event-flow-process
    image: >-
      path/to/image/evpc/eventprocessflowakka:4.0.0.1

Описание параметров:

Имя

Описание

annotations

Аннотации, которые будут добавляться в Deployment разворачиваемого экземпляра обработчика

environment

Переменные среды, которые будут добавляться в Deployment разворачиваемого экземпляра обработчика

labels

Лейблы, которые будут добавляться в Deployment разворачиваемого экземпляра обработчика

templateProperties

Параметры, которые будут использоваться для заполнения шаблона развертывания

Описание параметра templateProperties:

Имя

Значение по умолчанию

Описание

image

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

replicas

1

Количество реплик на старте

serviceAccountName

default

Используемый serviceAccountName

configMapName

Имя ConfigMap, которая будет примонтирована в обработчик по пути /eventprocessflowakka/conf

secretName

Имя Secret, которое будет примонтировано в обработчик по пути /eventprocessflowakka/ssl

imagePullSecrets

Используемый imagePullSecrets

containerArgs

Дополнительные аргументы запуска обработчика

affinityWeight

100

Используется для настроек affinity

topologyKey

topology.kubernetes.io/hostname

Используется для настроек affinity

containerPort

9090

Значение containerPort в ports

containerPortName

callback

Значение name в ports

resourceLimitsCpu

500m

Значение cpu в limits

resourceLimitsMemory

600Mi

Значение memory в limits

resourceRequestsCpu

300m

Значение cpu в requests

resourceRequestsMemory

40Mi

Значение memory в requests

rollingUpdateMaxUnavailable

25%

Значение maxUnavailable в rollingUpdate strategy

rollingUpdateMaxSurge

25%

Значение maxSurge в rollingUpdate strategy

minReadySeconds

10

Значение minReadySeconds в rollingUpdate strategy

revisionHistoryLimit

10

Значение revisionHistoryLimit в rollingUpdate strategy

progressDeadlineSeconds

120

Значение progressDeadlineSeconds в rollingUpdate strategy

schedulerName

default-scheduler

Значение schedulerName

terminationGracePeriodSeconds

30

Значение terminationGracePeriodSeconds

imagePullPolicy

Always

Значение imagePullPolicy

readinessProbePort

8081

Порт для readinessProbe

readinessProbeInitialDelaySeconds

60

initialDelaySeconds для readinessProbe

readinessProbeTimeoutSeconds

10

timeoutSeconds для readinessProbe

readinessProbePeriodSeconds

10

readinessProbePeriodSeconds для readinessProbe

readinessProbeSuccessThreshold

1

readinessProbeSuccessThreshold для readinessProbe

readinessProbeFailureThreshold

20

readinessProbeFailureThreshold для readinessProbe

livenessProbePort

8081

Порт для livenessProbe

livenessProbeInitialDelaySeconds

30

initialDelaySeconds для livenessProbe

livenessProbeTimeoutSeconds

10

timeoutSeconds для livenessProbe

livenessProbePeriodSeconds

10

livenessProbePeriodSeconds для livenessProbe

livenessProbeSuccessThreshold

1

livenessProbeSuccessThreshold для livenessProbe

livenessProbeFailureThreshold

20

livenessProbeFailureThreshold для livenessProbe

При добавлении SynapseEvpcRunner в namespace, за которым следит оператор EVPC, будет запущен компонент EVPC.

Запуск потоковой обработки#

Для запуска потоковой обработки используется ресурс SynapseEvpcFlow.

kind: CustomResourceDefinition
apiVersion: apiextensions.k8s.io/v1
metadata:
  name: flows.event.shared.evpc.synapse.platformv.sbertech.ru
spec:
  group: event.shared.evpc.synapse.platformv.sbertech.ru
  names:
    plural: flows
    singular: flow
    shortNames:
      - flw
    kind: SynapseEvpcFlow
    listKind: SynapseEvpcFlowList
  scope: Namespaced
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                flow:
                  type: object
                  properties:
                    name:
                      type: string
                    steps:
                      type: array
                      items:
                        type: object
                        properties:
                          config:
                            type: object
                            x-kubernetes-preserve-unknown-fields: true
                          destination:
                            type: string
                          dsl:
                            type: object
                            properties:
                              path:
                                description: >-
                                  Alias for 'value'. Either 'path' or 'value'
                                  can be used.
                                type: string
                              source:
                                type: string
                              value:
                                description: >-
                                  Alias for 'path'. Either 'path' or 'value' can
                                  be used.
                                type: string
                          format:
                            type: object
                            properties:
                              input:
                                description: Can be a string or an object
                                x-kubernetes-preserve-unknown-fields: true
                              output:
                                description: Can be a string or an object
                                x-kubernetes-preserve-unknown-fields: true
                          name:
                            type: string
                          topic:
                            type: string
                          type:
                            type: string
                          override:
                            type: object
                            x-kubernetes-preserve-unknown-fields: true
                          environmentVariables:
                            type: object
                            properties:
                              path:
                                type: string
                          error:
                            type: object
                            x-kubernetes-preserve-unknown-fields: true
                            properties:
                              name:
                                type: string
                              type:
                                type: string
                              topic:
                                type: string
                              config:
                                description: Can be a string or an object
                                x-kubernetes-preserve-unknown-fields: true
                            reqiured:
                              - type
                              - name
                          database:
                            type: object
                            properties:
                              name:
                                type: string
                              config:
                                type: object
                                x-kubernetes-preserve-unknown-fields: true
                                properties:
                                  type:
                                    type: string
                                    description: Should be 'kafka' or 'database'
                          merge:
                            type: object
                            x-kubernetes-preserve-unknown-fields: true
                            properties:
                              name:
                                type: string
                              type:
                                type: string
                              destination:
                                type: string
                          key:
                            type: object
                            x-kubernetes-preserve-unknown-fields: true
                            properties:
                              type:
                                type: string
                              path:
                                type: string
                            reqiured:
                              - type
                              - path
                          trigger:
                            type: object
                            x-kubernetes-preserve-unknown-fields: true
                            properties:
                              type:
                                type: string
                              path:
                                type: string
                              timeout:
                                type: integer
                            reqiured:
                              - type
                              - path
                              - timeout
                          destination:
                            type: object
                            x-kubernetes-preserve-unknown-fields: true
                            properties:
                              name:
                                type: string
                              type:
                                type: string
                              topic:
                                type: string
                              config:
                                description: Can be a string or an object
                                x-kubernetes-preserve-unknown-fields: true
                            reqiured:
                              - destination
                              - config
                  required:
                    - name
                    - steps
                runner:
                  description: Runner's deployment name
                  type: string
            status:
              type: object
              properties:
                code:
                  type: integer
                status:
                  type: string
                timestamp:
                  type: string
  conversion:
    strategy: None

Пример заполненного ресурса:

apiVersion: event.shared.evpc.synapse.platformv.sbertech.ru/v1
kind: SynapseEvpcFlow
metadata:
  name: example-flow
  namespace: operator-test
spec:
  flow:
    name: Event Process test
    steps:
      - config:
          ssl.keystore.password: pass
          security.protocol: SSL
          ssl.endpoint.identification.algorithm: ''
          group.id: test-helm-group
          ssl.key.password: qwe123
          bootstrap.servers: '{ IP_ADDRESS_1 },{ IP_ADDRESS_2 }'
          enable.idempotence: 'false'
          ssl.truststore.location: /path/to/cert
          type: kafka
          ssl.truststore.password: pass
          ssl.keystore.location: /path/to/cert
        destination: transformation
        name: testInput
        topic: input
        type: source
      - destination: output
        dsl:
          path: >-
            b3V0LmV2ZW50ID0gaW4uZXZlbnQKb3V0Lm9uZSA9IGluLm9uZQpvdXQudHdvID0gaW4udHdvCm91dC50aHJlZSA9IGluLnRocmVl
          source: base64
        format:
          input:
            type: json
          output:
            type: json
        name: transformation
        type: dsl
      - config:
          ssl.keystore.password: pass
          security.protocol: SSL
          ssl.endpoint.identification.algorithm: ''
          group.id: test-helm-group
          ssl.key.password: qwe123
          bootstrap.servers: '{ IP_ADDRESS_1 },{ IP_ADDRESS_2 }'
          test: test
          enable.idempotence: 'false'
          ssl.truststore.location: /path/to/cert
          type: kafka
          ssl.truststore.password: pass
          ssl.keystore.location: /path/to/cert
        name: output
        topic: output
        type: destination
  runner: event-flow-process-second

В данном ресурсе описывается конфигурация компонента EVPC, который необходимо запустить.

Так же в поле runner указывается имя SynapseEvpcRunner, на котором необходимо запустить поток.

Конфигурация компонента EVPC заполняется в соответствии с правилами, описанными документе «Руководство пользователя EVPC», раздел «Построение потока обработки».

Пример заполненного файла vars.yml для CRD и оператора EVPC#

ansible_no_log: true # маскирование сенситивных сообщений в ansible
wait_for_start: 120 # время в секундах на старт приложения

#helm_cli: helm # путь до helm
#kubeconfig_path: /home/user/kubeconfig # путь до файла kubeconfig (может быть зашифрован через ansible-vault)
api_url: https://api.example.ru:6443 # URL API openshift/k8s (не требуется при наличии kubeconfig_path)
token: __PLACEHOLDER__ # токен пользователя (сервис аккаунта) для установки (не требуется при наличии kubeconfig_path)
skip_tls_verify: false # игнорировать проверку доверия для URL API (не требуется при наличии kubeconfig_path)
namespace: my-evpc-namespace # наименование проекта в openshift/k8s

epf_operator:
  # Наименование деплоймента. Результат: sharedeventflowoperator-example
  #name: example
  # Тип установки kubernetes или openshift
  kubernetesInstall: true
  # Адрес реестра
  registry: ""
  # Путь к изображению в реестре
  registry_path: ""
  # Количество реплик
  replicaCount: 1
  # Пользовательские метки
  labels: {}
  # Пользовательские аннотации
  annotations: {}
  # Имя секрета извлечения изображения
  imagePullSecrets: ""
  # Имя класса приоритетов
  priorityClassName: ""
  # Установка CRD
  crd:
    install: false
    installOnlyCrd: false

  # Пример переопределения дефолтных ресурсов
  resources:
    limits:
      cpu: 300m
      memory: 512M
    requests:
      cpu: 150m
      memory: 256M

  # Стратегия rolling обновления
  rollingUpdateMaxSurge: "25%" # максимальный всплеск для rolling обновления
  rollingUpdateMaxUnavailable: "25%" # максимальная недоступность для rolling обновления

  kubernetesNamespacesWatched: ["shared-event-flow"] # список пространств имен, за которыми следит оператор

  serviceAccountName: "shared-event-operator" # имя учетной записи сервиса
  serviceAccount:
    # Указывает, должна ли быть создана учетная запись службы
    create: true
    # Автоматически монтировать API-учетные данные ServiceAccount?
    automount: true
    # Аннотации для добавления к учетной записи сервиса
    annotations: {}

  grpc: # grpc-сервер, запущенный на стороне оператора
    port: 8089 # порт сервера grpc
    retries:
      count: 4 # количество повторных попыток
      interval: 1000 # интервал между повторными попытками
      multiplier: 2 # множитель для интервала между повторными попытками

  healthcheck:
    host: 0.0.0.0 # хост сервера healthcheck
    port: 9000 # порт сервера healthcheck

  audit:
    enabled: false
#    transport.type: http # Тип транспорта, http или kafka, по умолчанию http
#
#    url.base: "http://ext-http.audit.example.ru" # Базовый URL аудит-сервиса
#    url.event.path: "/v1/event" # URI аудита, на который будут отправляться события
#    url.metamodel.path: "/v1/metamodel" # URI, на который будет отправляться метамодель
#
#    ssl.enabled: false # Флаг, отвечающий за использование SSL
#    ssl.keystore: ssl/keystore.jks # Путь до хранилища приватного ключа
#    ssl.keystore.password: pass # Пароль от хранилища приватного ключа
#    ssl.truststore: ssl/truststore.jks # Путь до хранилища доверенных сертификатов
#    ssl.truststore.password: pass # Пароль от хранилища доверенных сертификатов
#    ssl.protocol: TLSv1.2 # Версия протокола TLS
#    verify.hostname: false # Верификация имени хоста аудита
#
#    metamodel.topic: metamodel-topic # Имя топика для отправки метамодели
#    event.topic: event-topic # Имя топика для отправки событий
#
#    kafka.bootstrap.servers: localhost:9093 # Адреса Kafka
#    kafka.client.id: audit-producer # Идентификатор клиента Kafka
#    kafka.security.protocol: SSL # Протокол безопасности Kafka
#    kafka.ssl.keystore.location: ssl/keystore.jks # Путь до хранилища приватного ключа Kafka
#    kafka.ssl.keystore.password: password # Пароль от хранилища приватного ключа Kafka
#    kafka.ssl.truststore.location: ssl/truststore.jks # Путь до хранилища доверенных сертификатов Kafka
#    kafka.ssl.truststore.password: password # Пароль от хранилища доверенных сертификатов Kafka
#    kafka.ssl.endpoint.identification.algorithm: # Алгоритм идентификации конечной точки Kafka
#
#    metamodel.path: config/metamodel.yml # Путь до используемой метамодели
#    metamodel.module: module.id # Переопределение модуля метамодели
#    send.metamodel: true # Отправка метамодели в аудит при создании аудит-клиента
#
#    redelivery.response.code.regex: (?:400.4|401|404|429|500|503.2) # Регулярное выражение для определения типа переотправки
#    add.redelivery.headers: true # Добавление заголовков при переотправке событий
#    redelivery.enabled: true # Включение переотправки событий
#    redelivery.interval.ms: 60000 # Интервал попыток переотправки
#    redelivery.initial.delay.ms: 60000 # Задержка перед первой попыткой переотправки
#    redelivery.stop.on.error: true # Остановка попытки переотправки при первой ошибке
#    redelivery.retries: -1 # Максимальное количество повторных попыток доставки (-1 для бесконечных попыток)
#    # Неудачные запросы будут отправлены в первый по списку доступный буфер
#    redelivery.buffers: kafka-buffer, file-buffer, memory-buffer, logger-fallback # Список буферов для хранения запросов при переотправке
#
#    redelivery.kafka-buffer.type: kafka # Тип буфера Kafka
#    redelivery.kafka-buffer.topic: audit-redelivery # Используемый топик Kafka
#    redelivery.kafka-buffer.force.rebalance.on.start: true # Флаг принудительной перебалансировки группы Kafka при запуске
#    redelivery.kafka-buffer.timeout.ms: 10000 # Общий тайм-аут для вычисления тайм-аутов Kafka-клиента
#    redelivery.kafka-buffer.bootstrap.servers: localhost:9093 # Адреса Kafka для буфера
#    redelivery.kafka-buffer.group.id: audit-redelivery-group # Идентификатор группы Kafka
#
#    redelivery.file-buffer.type: file # Тип буфера файла
#    redelivery.file-buffer.file.name: buffers/redelivery.txt # Используемый файл
#    redelivery.file-buffer.file.permissions: rw-r--r-- # Права доступа к файлу при автоматическом создании
#    redelivery.file-buffer.max.size: 100m # Максимальный размер буфера
#    redelivery.file-buffer.encryption.enabled: true # Включение шифрования событий
#    redelivery.file-buffer.encryption.class: ru.sbt.ss.password.BaseEncryptor # Класс шифрования
#    redelivery.file-buffer.encryption.encrypt.key: file:path/to/key.txt # Ключ шифрования
#    redelivery.file-buffer.encryption.encrypt.algorithm: PBEWithHmacSHA512AndAES_256 # Алгоритм шифрования
#
#    redelivery.memory.type: queue # Тип буфера очереди в памяти
#    redelivery.memory-buffer.max.size: 100m # Максимальный размер буфера
#    redelivery.memory-buffer.clear.logger.name: ClearLogger # Имя логгера для удаления старых событий
#
#    redelivery.logger-fallback.type: logger # Тип буфера логгера
#    redelivery.logger-fallback.logger.name: LoggerRequestBuffer # Имя логгера
#
#    dead.letter.enabled: false # Включение dead-letter буферов
#
#    request.timeout.ms: 10000 # Тайм-аут отправки запроса аудита
#    stop.timeout.ms: 10000 # Тайм-аут остановки для буферов повторной доставки
#
#    thread.pool.min.size: 2 # Минимальное количество потоков аудит-клиента
#    thread.pool.max.size: 10 # Максимальное количество потоков аудит-клиента
#    thread.pool.keep.alive.ms: 60000 # Время жизни неиспользуемых потоков
#    thread.pool.name.prefix: audit-client # Префикс имен потоков для основного пула
#    http.thread.pool.name.prefix: audit-http-client # Префикс имен потоков для дополнительного пула HTTP-клиента
#    use.legacy.thread.pool: false # Использование старого thread-pool с неограниченным количеством потоков
#    thread.pool.max.async.requests: 100000 # Максимальное количество запросов, хранящихся в очереди на асинхронную обработку

Установка компонента EVPC с помощью оператора#

1. Настройка конфигурационного файла vars.yaml для CRD и оператора EVPC#

  1. Настройте конфигурационный файл vars.yaml для CRD и оператора EVPC. Пример заполненного файла vars.yml приведен подробнее в подразделе «Пример заполненного файла vars.yml для CRD и оператора EVPC».

2. Запуск установки оператора EVPC с помощью Jenkins#

Для запуска установки CRD и оператора EVPC с помощью Jenkins используйте задание Jenkins по установке EVPC (название задания Jenkins задается при создании задания, например, может быть задано как «SYN_custom_EVPC_cloud»). Процесс создания задания Jenkins «SYN_custom_EVPC_cloud» приведен в разделе Подготовка окружения EVPC, подраздел «Создание Jenkins Job для установки EVPC в Openshift».

  1. Запустите задание Jenkins для установки с помощью пункта меню Собрать с параметрами.

  2. Выберите playbook epf_operator.yml.

  3. Нажмите кнопку Собрать.

  4. Дождитесь окончания выполнения задания Jenkins.

  5. Проверьте работоспособность сервиса:

    • убедиться, что установка завершена без ошибок;

    • убедиться, что в логах pod нет информации об ошибках.

3. Запуск компонента EVPC с помощью Jenkins#

Для автоматического запуска компонента EVPC необходимо в namespace (за которым следит оператор EVPC) добавить заполненные ресурсы согласно ранее созданным CRD. Примеры заполненных ресурсов SynapseEvpcRunner и SynapseEvpcFlow приведены в подразделе «Описание оператора EVPC».