Установка EVPC#
Порядок установки EVPC#
Порядок установки компонента EVPC зависит от способа развертывания компонента.
Способы развертывания компонента:
целевая: ручная установка с использованием Ansible;
опциональная: автоматическая установка с использованием Jenkins.
Ручная установка с использованием Ansible#
Для выполнения ручной установки с использованием Ansible необходимо выполнить следующие действия:
Заполнить файлы в директории
inventories. Подробнее описано в разделе Подготовка окружения EVPC, подраздел «Настройка inventory для EVPC».Выполнить шифрование пароля. Подробнее описано в разделе Использование утилиты «ansible-vault» для шифрования паролей.
Заполнить параметры в файле vars.yml. Пример заполнения файла vars.yml описан в разделе Подготовка окружения EVPC, подраздел «Пример заполненного файла vars.yml для EVPC».
Выполнить ручную установку EVPC с использованием Ansible. Подробнее описано в подразделе «Ручная установка EVPC с использованием Ansible».
Автоматическая установка с использованием Jenkins#
Для выполнения автоматической установки с использованием Jenkins необходимо выполнить следующие действия:
Заполнить файлы в директории
inventories. Подробнее описано в разделе Подготовка окружения EVPC, подраздел «Настройка inventory для EVPC».Создать задания в Jenkins для автоматической установки EVPC. Подробнее описано в разделе Подготовка окружения EVPC, подраздел «Создание Jenkins Job для автоматической установки EVPC».
Выполнить шифрование пароля. Подробнее описано в разделе Использование утилиты «ansible-vault» для шифрования пароле.
Заполнить параметры в файле vars.yml. Пример заполненния файла vars.yml описан в разделе Подготовка окружения EVPC, подраздел «Пример заполненного файла vars.yml для EVPC».
Выполнить автоматическую установку EVPC с использованием Jenkins. Подробнее описано в подразделе «Автоматическая установка EVPC с использованием Jenkins».
Дополнительные настройки и функции#
Дополнительно при установке (ручной/автоматической) могут быть использованы следующие настройки и функции:
Установка EVPC с использованием Jenkins Job «SynapseInstaller». Подробнее описано в подразделе «Установка EVPC с использованием Jenkins Job «SynapseInstaller»».
Настройка интеграции компонента EVPC с сервисными системами. Подробнее описано в подразделе «Настройка интеграции EVPC с сервисными системами».
Настройка интеграции компонента EVPC с Istio. Подробнее описано в подразделе «Настройка интеграции EVPC с Istio».
Подготовка базы данных для работы с хранением окон агрегации. Подробнее описано в подразделе «Подготовка базы данных для работы с хранением окон агрегации для EVPC».
Настройка конфигурации EVPC для работы с Граничным прокси (IGEG). Подробнее описано в подразделе «Конфигурирование EVPC для работы с Граничным прокси (IGEG)».
Масштабирование количества 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#
Перед началом установки необходимо убедиться, что выполнена подготовка окружения. Подробнее описано в разделе Подготовка окружения EVPC.
Подготовьте конфигурацию потока обработчика и конфигурацию трансформации. Подробнее описано в документе «Руководство пользователя EVPC», раздел «Создание новых конфигураций обработчиков».
Заполните соответствующие inventory. Подробнее описано в разделе Подготовка окружения EVPC, подраздел «Настройка inventory для EVPC».
В директории Ansible создайте директорию
helm.Распакуйте дистрибутив ./EVPC-cfg-{version}-distrib.zip. Убедитесь, что появилась директория
conf.В директорию
Ansible/helmскопируйте содержимое директорииconf/helm/application/eventprocessflowakka.Перенесите библиотеку
encryptor-cli-(version)-fatjar.jarиз директории./package/bhв корень директорииAnsible.Запустите установку командой в терминале из папки
Ansible:
ansible-playbook -i inventories/<ID>/inventory <PLAYBOOK>.yml --ask-vault-pass
, где ID — имя недавно созданного inventory.
Список возможных PLAYBOOKS:
epf.yml — устанавливает EVPC.
Проверьте работоспособность сервиса:
убедиться, что установка завершена без ошибок;
убедиться, что в логах pod нет информации об ошибках.
Автоматическая установка EVPC с использованием Jenkins#
1. Запуск создания конфигурационного дистрибутива с помощью Jenkins#
Запустить задание Jenkins «evpc_image_create» с помощью пункта меню Собрать с параметрами. Процесс создания задания Jenkins «evpc_image_create» приведен в разделе Подготовка окружения EVPC, подраздел «Создание Jenkins Job evpc_image_create».
Заполнить необходимые параметры. Использование задания Jenkins «evpc_image_create» и заполнение параметров описано подробно в документе «Руководство администратора», раздел «Создание конфигурационных дистрибутивов».
Нажать кнопку Собрать.
По запросу Jenkins загрузить архив с конфигурационными файлами.
Дождаться окончания выполнения задания Jenkins.
Проверить, что дистрибутив собрался и опубликовался в Nexus.
2. Запуск установки с помощью Jenkins#
Запустить задание Jenkins для установки с помощью пункта меню Собрать с параметрами (название задания Jenkins задается при создании задания, например, может быть задано как «SYN_custom_EVPC_cloud»). Процесс создания задания Jenkins «SYN_custom_EVPC_cloud» приведен в разделе Подготовка окружения EVPC, подраздел «Создание Jenkins Job для установки EVPC в Openshift».
Выбрать необходимый
inventory.Заполнить параметр
nexusHelmUrlссылкой на конфигурационный дистрибутив с helm chart EVPC, полученный с помощью задания Jenkins «evpc_image_create» (см.п.1 «Запуск создания конфигурационного дистрибутива с помощью Jenkins»).Нажать кнопку Собрать.
Дождаться окончания выполнения задания Jenkins.
Проверить работоспособность сервиса:
убедиться, что установка завершена без ошибок;
убедиться, что в логах pod нет информации об ошибках.
Установка EVPC с использованием Jenkins Job «SynapseInstaller»#
Для установки компонента EVPC можно воспользоваться универсальным Jenkins Job «SynapseInstaller». Об инициировании создания Jenkins Job «SynapseInstaller» подробнее описано в разделе Подготовка окружения EVPC, подраздел «Создание универсального Jenkins Job «SynapseInstaller»».
Перед установкой компонента EVPC с помощью Jenkins Job «SynapseInstaller» необходимо создать файл values.yaml.
Все параметры для установки компонента EVPC с помощью Jenkins Job «SynapseInstaller» хранятся в конфигурационном репозитории в файле values.yaml, размещенном по пути: <имя_namespace>/package/conf/helm/eventprocessflowakka/values.yaml.
Особенности заполнения файла 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 }}
Далее для установки компонента 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):
В файле 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 адаптера
В файле 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 |
|
vault.hashicorp.com/agent-init-first |
Должны ли быть получены секреты до старта самого контейнера приложения |
|
vault.hashicorp.com/agent-pre-populate |
Включать ли контейнер init для предварительного заполнения тома общей памяти секретами перед запуском контейнеров |
|
vault.hashicorp.com/preserve-secret-case |
Сохранять ли регистр секретных имен при создании секретных файлов |
|
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, то для того, чтобы полученный секрет был записан в файл, необходимо указать данную аннотацию с любым значением (будет переписано шаблоном) |
|
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#
Предусловия#
Предварительно необходимо заполнить параметры в конфигурационном файле vars.yml в блоке
db. Ознакомиться с примером можно в разделе Подготовка окружения EVPC, подраздел «Пример заполненного файла vars.yml для EVPC».При ручной настройке базы данных необходимо:
разархивировать архив
./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 после выполнения скриптов установки#
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
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
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
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
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 и запуска потоков обработки на нем.
Конфигурация для запуска оператора 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#
Настройте конфигурационный файл 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».
Запустите задание Jenkins для установки с помощью пункта меню Собрать с параметрами.
Выберите playbook epf_operator.yml.
Нажмите кнопку Собрать.
Дождитесь окончания выполнения задания Jenkins.
Проверьте работоспособность сервиса:
убедиться, что установка завершена без ошибок;
убедиться, что в логах pod нет информации об ошибках.
3. Запуск компонента EVPC с помощью Jenkins#
Для автоматического запуска компонента EVPC необходимо в namespace (за которым следит оператор EVPC) добавить заполненные ресурсы согласно ранее созданным CRD. Примеры заполненных ресурсов SynapseEvpcRunner и SynapseEvpcFlow приведены в подразделе «Описание оператора EVPC».