Установка#
Состав дистрибутива#
Platform V GraDeLy поставляется дистрибутивом в виде архива GDL-x.x.x-xxx-distrib.zip.
Дистрибутив содержит в себе:
GDL-doc-x.x.x-xxx-distrib.zip— архив с технической документацией на Platform V GraDeLy;gdl-x.x.x-xxx-owned-distrib.zip— архив с релизом Platform V GraDeLy, содержащий:grdl-bin-D-x.x.x-xxx-cyclonedx-distrib.json- Файл с информацей о зависимостях артефактаgrdl-bin-D-x.x.x-xxx-distrib.zip;grdl-bin-D-x.x.x-xxx-distrib.zip— архив, содержащий каталог с бинарными файлами и файлами сбора Docker-образов:./package/- каталог дистрибутива;./db/— каталог архивов со скриптамиliquibaseдля развертывания необходимых объектов в БД;./bh/grdl-console.jar— сервис API для взаимодействия с PL (АРМ компонента Базовый модуль (GRDL));./pl/grdl-console-ui.zip— архив, содержащий файлы Presentation Layer приложения;./docker/grdl-console/Dockerfile— инструкции по созданию образа;./docker/grdl-console-ui/Dockerfile— инструкции по созданию образа;
regid.2022-12.ru.sbertech_grdl-D-x.x.x.swidtag- файл swidtag с информацией об артефактеgrdl-bin-D-x.x.x-xxx-distrib.zip;
grdl-cfg-D-x.x.x-xxx-distrib.zip— архив, содержащий каталог с конфигурационными файлами установки в k8s;./package/- каталог дистрибутива;./conf/— каталог с конфигурационными файлами для автоматизированной установки ПО средствамиPipeline;
regid.2022-12.ru.sbertech_grdl-D-x.x.x.swidtag- файл swidtag с информацией об артефактеgrdl-cfg-D-x.x.x-xxx-distrib.zip;
grdl-bin-D-x.x.x-xxx.pom— файл с информацией об артефактеgrdl-bin-D-x.x.x-xxx-distrib.zip;grdl-cfg-D-x.x.x-xxx.pom— файл с информацией об артефактеgrdl-cfg-D-x.x.x-xxx-distrib.zip;rplw-bin-D-x.x.x-xxx-cyclonedx-distrib.json- файл с информацией о зависимостях артефактаrplw-bin-D-x.x.x-xxx-distrib.zip;rplw-bin-D-x.x.x-xxx-distrib.zip— архив, содержащий каталог с бинарными файлами и файлами сбора Docker-образов:./package/- каталог дистрибутива;./db/— каталог архивов со скриптамиliquibaseдля развертывания необходимых объектов в БД;./bh/gdl-worker.jar— REST-сервис с которым взаимодействует клиентский модуль GraDeLy;./docker/rplw-module/Dockerfile— инструкции по созданию образа;
regid.2022-12.ru.sbertech_rplw-D-x.x.x.swidtag- файл swidtag с информацией об артефактеrplw-bin-D-x.x.x-xxx-distrib.zip;
rplw-cfg-D-x.x.x-xxx-distrib.zip— архив, содержащий каталог с конфигурационными файлами установки в k8s;./package/- каталог дистрибутива;./conf/— каталог с конфигурационными файлами для автоматизированной установки ПО средствамиPipeline;
regid.2022-12.ru.sbertech_rplw-D-x.x.x.swidtag- файл swidtag с информацией об артефактеrplw-cfg-D-x.x.x-xxx-distrib.zip;
rplw-bin-D-x.x.x-xxx.pom— файл с информацией об артефактеrplw-bin-D-x.x.x-xxx-distrib.zip;rplw-cfg-D-x.x.x-xxx.pom— файл с информацией об артефактеrplw-cfg-D-x.x.x-xxx-distrib.zip;hash-trace.json— файл с хешамиgrdl-cfg-D-x.x.x-xxx-distrib.zip,grdl-bin-D-x.x.x-xxx-distrib.zip,rplw-bin-D-x.x.x-xxx-distrib.zip,rplw-cfg-D-x.x.x-xxx-distrib.zipи информацией о delivery_tools использовавшихся для сборки дистрибутива;regid.2022-12.ru.sbertech_grdl-D-x.x.x-xxx.swidtag- файл swidtag с информацией об артефактеGDL-x.x.x-xxx-owned-distrib.zip;Report.json— файл с отчетом по opensource зависимостям и хеши библиотек из дистрибутиваGDL-x.x.x-xxx-party-distrib.zip;
GDL-x.x.x-xxx-party-distrib.zip— архив с opensource зависимостями Platform V GraDeLy;GDL-x.x.x-xxx-owned-distrib.pom— файл с информацией об артефактеGDL-x.x.x-xxx-owned-distrib.zip;GDL-x.x.x-xxx-party-distrib.pom— файл с информацией об артефактеGDL-x.x.x-xxx-party-distrib.zip;GDL-x.x.x-xxx-cyclonedx-distrib.json- файл с информацей о зависимостях артефактаGDL-x.x.x-xxx-distrib.zip;regid.2022-12.ru.sbertech_GDL-x.x.x-xxx.swidtag- файл swidtag с информацией об артефактеGDL-x.x.x-xxx-distrib.zip.
Примечание:
x.x.x-xxx- версия релиза.
Выбор способа установки#
Для GraDeLy предусмотрена автоматизированная установка через компонент Deploy tools (CDJE) продукта Platform V DevOps Tools (DOT) (далее по тексту – CDJE).
Сертификаты для компонента не устанавливаются, данные потребителей не шифруются, а кодируются в message pack. Ролевая модель не настраивается.
Порядок установки#
Создайте пользователя (роль) и схему gdl в БД модуля управления и выдайте ему необходимые права).
Проверьте и подготовьте параметры в common репозитории стенда для консоли.
Проверьте и подготовьте параметры в common репозитории стенда.
Выполните развертывание объектов базы данных (playbook
DB_UPDATE).Используя средства Pipeline, выполните миграцию конфигурационных файлов GraDeLy на узел.
Внесите в конфигурационные файлы GraDeLy на узле необходимые изменения.
Рекомендуется убедиться, что в БД источника создаются публикации для выбора реплицируемых таблиц.
Создайте вспомогательную таблицу в БД приемника для старта с GraDeLyID.
Настройте секреты в системе управления секретами HashiCorp Vault/Secret Management System.
Настройте механизм для ограничения входящих запросов Rate Limiter
Шаг 1. Создайте пользователя (роль) и схему gdl в БД модуля управления и выдайте ему необходимые права (обязательный)#
Данный шаг обязателен при установке в k8s и на VM
Последовательность действий#
CREATE ROLE gdl WITH
LOGIN
ENCRYPTED PASSWORD '${password.placeholder}'
VALID UNTIL '${time.placeholder}';
CREATE SCHEMA IF NOT EXISTS AUTHORIZATION gdl;
ALTER ROLE gdl SET search_path = "$user",ext,public;
GRANT USAGE ON SCHEMA ext TO gdl;
commit;
Примечания:
замените
${password.placeholder}актуальным паролем;замените
${time.placeholder}на timestamp срока действия пароля или на значение infinity для бессрочного пароля.
Проверка результата#
Пользователь и схема gdl созданы в БД модуля управления
Шаг 2. Создайте tablespace grdl_ts_data и grdl_ts_idx (обязательный)#
Данный шаг обязателен при установке в k8s и на VM
Последовательность действий#
create tablespace grdl_ts_data owner gdl location '${YYY_location.placeholder}';
create tablespace grdl_ts_idx owner gdl location '${ZZZ_location.placeholder}';
commit;
GRANT ALL ON TABLESPACE grdl_ts_data TO gdl;
GRANT ALL ON TABLESPACE grdl_ts_idx TO gdl;
commit;
Примечания:
замените
${YYY_location.placeholder}на абсолютный путь к папке для табличного пространства grdl_ts_data (папка должна существовать на момент создания табличного пространства);замените
${ZZZ_location.placeholder}на абсолютный путь к папке для табличного пространства grdl_ts_idx (папка должна существовать на момент создания табличного пространства).
Проверка результата#
Tablespace созданы
Шаг 3. Создайте пользователя (роль) в БД источника и приемника для выполнения репликации и выдайте ему необходимые права (обязательный)#
Данный шаг обязателен при установке в k8s и на VM
Последовательность действий#
Роль для БД источника:
CREATE ROLE gdl_worker WITH REPLICATION LOGIN ENCRYPTED PASSWORD '${password.placeholder}' VALID UNTIL '${time.placeholder}'; commit;Роль для БД приемника (выдача прав на репликацию не требуется):
CREATE ROLE gdl_worker WITH LOGIN ENCRYPTED PASSWORD '${password.placeholder}' VALID UNTIL '${time.placeholder}'; commit;> Примечания: > > - замените `${password.placeholder}` актуальным паролем; > - замените `${time.placeholder}` на timestamp срока действия пароля или на значение infinity для бессрочного пароля.Выдача минимально необходимых прав репликатору на объекты приемника (для всех DML операций и на использование схемы):
GRANT USAGE ON SCHEMA ${consumer_schema_name.placeholder} TO gdl_worker; GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA ${consumer_schema_name.placeholder} TO gdl_worker; ALTER DEFAULT PRIVILEGES IN SCHEMA ${consumer_schema_name.placeholder} GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO gdl_worker; commit;При использовании вспомогательных таблиц со стороны репликатора (
$GRADELY_APPLY_POSITION$иgrdl_error) выдайте дополнительные права:GRANT USAGE ON SCHEMA ${consumer_schema_name.placeholder} TO gdl_worker; GRANT SELECT, INSERT, UPDATE, DELETE ON $GRADELY_APPLY_POSITION$, grdl_error IN SCHEMA ${consumer_schema_name.placeholder} TO gdl_worker;Примечания:
замените
${consumer_schema_name.placeholder}именами схем потребителей репликации (схемы можно перечислить через запятую).выдача дополнительных прав репликатору на объекты источника не требуется.
Проверка результата#
Роли пользователей в БД источника и приемника созданы
Шаг 4. Проверьте и подготовьте параметры в common репозитории стенда для консоли (обязательный)#
Данный шаг обязателен при установке только в k8s. При развертывании на VM пропускается
Последовательность действий#
параметры
${стенд}/installer/system/efs/config/parameters/ssl.confДля GRDL:
ssl.ose.keyStore.mq.keyStoreFromFile - путь до файла jks в репозитории common ssl.ose.keyStore.mq.CertAlias - алиас сертификата ssl.ose.istio.keyStore.RootCertAlias - алиас корневого сертификата ssl.ose.istio.grdl.kafka.fqdns - FQDN серверов kafka через запятую ssl.ose.istio.grdl.kafka.ips - IP-адреса серверов kafka через запятую в порядке, совпадающем с предыдущем значением; если IP не используется, выставляется значение none ssl.ose.istio.grdl.psql.fqdns - FQDN серверов БД источников/приемников Postgres через запятую ssl.ose.istio.grdl.psql-config.fqdns - FQDN серверов БД конфигурации Postgres через запятую ssl.proxy.type - тип proxy на ингресс-контроллере (nginx или haproxy) ssl.ose.secman.host - адрес сервера secman ssl.ose.secman.port - порт для подключения к серверу secman grdl.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.namespace - имя namespace в vault, где хранятся секреты проекта grdl.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.role.ui - имя роли в vault, от которой будут выполняться API-вызовы vault-agent для namespace UI grdl.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.role.console - имя роли в vault, от которой будут выполняться API-вызовы vault-agent для namespace console grdl.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.role.module - имя роли в vault, от которой будут выполняться API-вызовы vault-agent для namespace module grdl.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.client-max-retries - максимальное количество попыток переподключения к серверу vault grdl.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-limits-cpu - максимальное значение ресурсов по CPU для sidecar vault-agent grdl.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-limits-mem - максимальное значение ресурсов по RAM для sidecar vault-agent grdl.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-requests-cpu - минимальное значение ресурсов по CPU для sidecar vault-agent grdl.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-requests-mem - минимальное значение ресурсов по CPU для sidecar vault-agent ssl.ose.istio.grdl.data.fqdns - домен для nDC ssl.ose.istio.grdl.data.count - количество namespace для nDCДля RPLW:
ssl.ose.keyStore.mq.keyStoreFromFile - путь до файла jks в репозитории common ssl.ose.keyStore.mq.CertAlias - алиас сертификата ssl.ose.istio.keyStore.RootCertAlias - алиас корневого сертификата ssl.ose.istio.rplw.kafka.fqdns - FQDN серверов kafka через запятую ssl.ose.istio.rplw.kafka.ips - IP-адреса серверов kafka через запятую в порядке, совпадающем с предыдущем значением; если IP не используется, выставляется значение none ssl.ose.istio.rplw.psql.fqdns - FQDN серверов БД источников/приемников Postgres через запятую ssl.proxy.type - тип proxy на ингресс-контроллере (nginx или haproxy) ssl.ose.secman.host - адрес сервера secman ssl.ose.secman.port - порт для подключения к серверу secman rplw.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.namespace - имя namespace в vault, где хранятся секреты проекта rplw.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.role.ui - имя роли в vault, от которой будут выполняться API-вызовы vault-agent для namespace UI rplw.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.role.console - имя роли в vault, от которой будут выполняться API-вызовы vault-agent для namespace console rplw.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.role.module - имя роли в vault, от которой будут выполняться API-вызовы vault-agent для namespace module rplw.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.client-max-retries - максимальное количество попыток переподключения к серверу vault rplw.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-limits-cpu - максимальное значение ресурсов по CPU для sidecar vault-agent rplw.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-limits-mem - максимальное значение ресурсов по RAM для sidecar vault-agent rplw.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-requests-cpu - минимальное значение ресурсов по CPU для sidecar vault-agent rplw.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-requests-mem - минимальное значение ресурсов по CPU для sidecar vault-agent ssl.ose.istio.rplw.data.fqdns - домен для nDC ssl.ose.istio.rplw.data.count - количество namespace для nDCпараметры
${стенд}/parameters/common.conf.ymlДля GRDL:
DB_SCHEMA_SUFFIX - суффикс схемы БД конфигурации, можно оставить пустым "" GRDL_POSTGRES_DB_URL - адрес в БД конфигурации в формате jdbc:postgresql://x.x.x.x:port/db_name DB_SCHEMA_SUFFIX_worker - суффикс схемы БД приемника, можно оставить пустым "" GRDL_POSTGRES_DB_URL_worker - адрес в БД приемника в формате jdbc:postgresql://x.x.x.x:port/db_name worker_db_flag - принимает значения "NO" или "YES", флаг переключает работу liquibase на вспомогательную таблицу в БД приемника, если флаг "YES", и на основновную в БД конфигурации, если флаг "NO" registry - адрес registry registry_path - путь до директории с компонентом в registry registry_path_istio - путь до компонента образа istio registry_path_ott - путь до компонента образа ottДля RPLW:
DB_SCHEMA_SUFFIX - суффикс схемы БД конфигурации, можно оставить пустым "" DB_SCHEMA_SUFFIX_worker - суффикс схемы БД приемника, можно оставить пустым "" RPLW_POSTGRES_DB_URL_worker - адрес в БД приемника в формате jdbc:postgresql://x.x.x.x:port/db_name worker_db_flag - принимает значения "NO" или "YES", флаг переключает работу liquibase на вспомогательную таблицу в БД приемника, если флаг "YES", и на основновную в БД конфигурации, если флаг "NO" registry - адрес registry registry_path - путь до директории с компонентом в registry registry_path_istio - путь до компонента образа istio registry_path_ott - путь до компонента образа ottпараметры
${стенд}/installer/system/efs/config/parameters/_global.resources.confglobal.platform.auth.host - адреса backend IAM через запятую global.platform.iam.auth.host - адрес IAM global.platform.iam.auth.port - порт IAM global.platform.osa.auth.host - адрес OSA global.platform.osa.auth.port - порт OSA global.platform.audit.proxy.https.host - адрес Audit c ОТТ global.platform.audit.proxy.https.host_no_ott - адрес Audit без ОТТ global.platform.audit.proxy.https.port - порт Audit global.platform.audit.proxy.https.url.path - путь до endpoint аудита PVM grdl-console.ose.iam_token.servers - адреса токен-серверов IAM через запятую grdl-console.ose.iam_token.port - порт токен-серверов IAM global.platform.secman.kv.basepath - адрес хранилища секретов kv в Secman global.platform.secman.pki.basepath - адрес хранилища секретов pki в Secman global.platform.secman.pki.iam - адрес хранилища секретов pki в Secman для IAM global.platform.secman.kv.jdbcpath - имя секрета сертификатов БД конфигураций в kv Secman global.platform.secman.kv.osapath - имя секрета сертификатов OSA конфигураций в kv Secman global.platform.secman.kv.auditpath - имя секрета сертификатов Audit конфигураций в kv Secman global.platform.secman.kv.ottpath - имя секрета сертификатов OTT конфигураций в kv Secman global.platform.secman.console.secret - путь до физического секрета на backend консоли (/vault/secrets/databases/FQDN/application.properties, где FQDN - адрес БД конфигураций) global.platform.secman.pki.ott- путь до секрета в PKI (OTT) global.platform.secman.kv.iampath - путь до секрета в KV global.platform.secman.kv.ingresspath - путь до KV Ingress global.platform.secman.pki.audit - путь до секрета в PKI (Audit) global.platform.secman.pki.logger - путь до секрета в PKI (Logger) global.platform.secman.kv.iamsecret - секрет от IAM global.platform.secman.kv.loggerpath - путь до секрета в KV (Logger)параметры
${стенд}/installer/system/efs/config/parameters/_global.ott.confДля GRDL:
global.platform.grdl.ott.module.id - Имя модуля, указанное в поле CN запроса и сертификата клиента ОТТ global.platform.grdl.ott.service.hosts - Адрес сервера OTTS global.ott.service.hosts - Адрес сервера OTTSДля RPLW:
global.platform.rplw.ott.module.id - Имя модуля, указанное в поле CN запроса и сертификата клиента ОТТ global.platform.rplw.ott.service.hosts - Адрес сервера OTTS global.ott.service.hosts - Адрес сервера OTTSпараметры
${стенд}/installer/system/efs/config/parameters/openShift.confglobal.platform.logger.kafka.bootstrap.servers global.platform.logger.kafka.topic global.platform.logger.kafka.security.protocol #Лимит использования Pod-ами эфемерного хранилища global.ose.deployment.spec.template.spec.containers.resources.limits.ephemeral-storageпараметры для каждого из двух namespaces
{ "datacenters": { "${nameCluster}": { #имя кластера k8s "openshiftCluster": "${url}", #адрес кластера k8s "openshiftSATokenCred": "${token}", #токен с доступом для деплой в namspace "openshiftProjectName": "${namespace}", #имя namespace k8s "openshiftControlPlaneProject": "${nameCP}", #имя controlPanel k8s "openshiftControlPlaneIstiodPort": "${portCP}", #порт controlPanel k8s "openshiftControlPlaneIstiodService": "${istiodName}", #имя istiod k8s "openshiftControlPlaneJaegerPort": "${jaegerPort}", #порт jaeger k8s "openshiftControlPlaneJaegerService": "${jaegerService}", #имя jaegerService k8s "openshiftNewRoute": "${routeFQDN}", #часть имени FQDN для формирования Route "openshiftAppsDomain": "apps.dap.devpub-02.solution.sbt", "openshiftRoutersFQDN": [ "${addressCluster}" ], #адрес кластера k8s "overrides": [] } } }параметры из глобальных переменных помещаются в config maps и не требуют переопределения (если данные переменные существуют):
global.multiClusters.openshiftControlPlaneIstiodService global.multiClusters.openshiftControlPlaneJaegerPort global.multiClusters.openshiftControlPlaneIstiodPort global.multiClusters.openshiftControlPlaneJaegerService global.multiClusters.openshiftControlPlaneProject global.platform.ose.kafka.ports
Проверка результата#
Параметры в common репозитории стенда для консоли подготовлены.
Шаг 5. Проверьте и подготовьте параметры в common репозитории стенда для воркера (обязательный)#
Последовательность действий в данном шаге будет различаться для развертывания в k8s и на VM
Последовательность действий при развертывании в k8s#
// todo: параметры в k8s
Проверка результата#
// todo: результат
Последовательность действий при развертывании на VM#
параметры
${стенд}/hosts/globalInventoryrplw_vms_group: hosts: rplw-vm-1: ansible_host: rplw-vm-1.domain.local ip_address: [ip адрес хоста] rplw_module_url: "http://rplw-vm-1.domain.local:6884" rplw_module_label: "rplw_on_vm" rplw_module_console_url: "https://grdl-console.domain.local/" rplw_module_db_urls: '["source-db.domain.local:5432/postgres", "target-db.domain.local:5432/postgres"]' rplw_module_secman_prefix: "A/IFT3/GRDL/KV2" rplw_module_secman_address: "https://secman.domain.local:8443/" rplw_module_secman_namespace: "DEV" rplw_module_secman_pg_cert_path: "DEV/IFT3/GRDL/KV2/source-db.domain.local" rplw_module_secman_ssl_cert_path: "A/IFT3/GRDL/KV2/rplw-on-vm" vars: ansible_ssh_user: "[имя пользователя]" ansible_ssh_private_key_file: "{{ [имя секрета приватного ключа] }}"параметры точки расширения
${стенд}/environment.json"pipeline_extensions": { "INSTALL_RPLW_MODULE_ON_VM": { "enable": true, "visible": true, "description": "Установка или обновление дистрибутива rplw на виртуальном сервере", "priority": 10, "failJobOnError": true, "allowedSecrets": [ "rplw_module_secman_role_id", "rplw_module_secman_secret_id" ], "extend": { "instead": [ "START_DEPLOY" ] }, "parameters": { "SUB_STAGE": "INSTALL_WORKER_ON_VM_SUBSTAGE" }, "run": { "ansible": [ { "role": "{{ distr_unpack_dir }}/package/conf/ansible/rplw-install-dot", "group": "rplw_vms_group", "parameters": { "DEBUG": "$DEBUG" } } ] } } }
Проверка результата#
Параметры в common репозитории стенда для воркера подготовлены.
Шаг 6. Выполните развертывание объектов базы данных (обязательный)#
Данный шаг обязателен при установке в k8s и на VM
Последовательность действий#
Выполните файл сценария DB_UPDATE, используя устанавливаемый дистрибутив.
Проверка результата#
Сценарий выполнен
Шаг 7. Мигрируйте конфигурационные файлы GraDeLy (обязательный)#
Данный шаг обязателен при установке в k8s и на VM
Последовательность действий#
Перед развертыванием самого приложения необходимо произвести шаблонизацию и миграцию параметров из дистрибутива на среду (параметров среды и параметров программного обеспечения).
Данные для шаблонизации и миграции находятся в папке дистрибутива conf/config/parameters.
Параметры в конфигурационных файлах дистрибутива могут содержать плейсхолдеры на общие параметры установки, конкретные значения которых должны подставляться при установке. Конкретные значения параметров установки хранятся отдельно в файлах стендов, наличие этих данных обеспечивается администраторами стендов, куда производится установка продукта.
Для GRDL:
└── conf
└── config
└── parameters
├── grdl.all.conf
├── grdl.istio.all.conf
├── grdl-console.conf
└── grdl-console-ui.conf
Для RPLW:
└── conf
└── config
└── parameters
├── rplw.all.conf
├── rplw.istio.all.conf
└── rplw-module.conf
Проверка результата#
Конфигурационные файлы мигрированы.
Шаг 8. Внесите в конфигурационные файлы GraDeLy на узле необходимые изменения (обязательный)#
Данный шаг обязателен при установке только в k8s. При развертывании на VM пропускается
Последовательность действий для развертывания в k8s (GRDL)#
Для реализации поддержки нескольких схем доступа к секретам приложения и потребителей нужно заполнить нижеследующие параметры:
# Для каждой интеграции адрес секрета KV, хранимый в vault, представляется в виде конкатинации двух параметров <имя_модуля>.ose.secman.kv.<имя_интеграции>.basepath и <имя_модуля>.ose.secman.kv.<имя_интеграции>.secret_name
# Для каждой интеграции секрета PKI, генерируемы vault, происходит по двум параметрам: <имя_модуля>.ose.secman.pki.<имя_интеграции>.basepath - движок PKI (имеет список разрешенных common names) и <имя_модуля>.ose.secman.pki.<имя_интеграции>.common_name - common name
# Для входящего трафика и интеграции с ОТТ, внесен тогглер (true/false) <имя_модуля>.ose.secman.kv.<ingress/ott>.add-old-ca-chain, который контролирует подключение KV секрета, для добавления цепочки сертивикатов в корневой сертификат (согласно архитектуре: на grdl-console-ui нет ОТТ!)RV
# Для интеграции с БД, кафки и "из консоли в воркера" KV конкатинация состоит из <имя_модуля>.ose.secman.kv.<имя_интеграции>.basepath и FQDN имени сервиса интеграции, соотвественно данных параметров в ConfigMap нет
grdl-console.ose.secman.kv.iampk.basepath=
grdl-console.ose.secman.kv.iampk.secret_name=
grdl-console.ose.secman.kv.jdbc.basepath=
grdl-console.ose.secman.kv.jdbc.secret_name=
grdl-console.ose.secman.pki.ott.basepath=
grdl-console.ose.secman.pki.ott.common_name=
grdl-console.ose.secman.kv.ott.add-old-ca-chain=
grdl-console.ose.secman.kv.ott.old-ca-chain.basepath=
grdl-console.ose.secman.kv.ott.old-ca-chain.secret_name=
grdl-console.ose.secman.kv.ott.basepath=
grdl-console.ose.secman.kv.ott.secret_name=
grdl-console.ose.secman.kv.ott.old-ca-chain.secret_path=
grdl-console.ose.secman.pki.ingress.basepath=
grdl-console.ose.secman.pki.ingress.common_name=
grdl-console.ose.secman.kv.ingress.add-old-ca-chain=
grdl-console.ose.secman.kv.ingress.old-ca-chain.basepath=
grdl-console.ose.secman.kv.ingress.old-ca-chain.secret_name=
grdl-console.ose.secman.kv.ingress.old-ca-chain.secret_path=
grdl-console.ose.secman.kv.ingress.basepath=
grdl-console.ose.secman.kv.ingress.secret_name=
grdl-console.ose.secman.pki.audit.basepath=
grdl-console.ose.secman.pki.audit.common_name=
grdl-console.ose.secman.kv.audit.basepath=
grdl-console.ose.secman.kv.audit.secret_name=
grdl-console.ose.secman.pki.iam.basepath=
grdl-console.ose.secman.pki.iam.common_name=
grdl-console.ose.secman.kv.iam.basepath=
grdl-console.ose.secman.kv.iam.secret_name=
grdl-console.ose.secman.pki.logger.basepath=
grdl-console.ose.secman.pki.logger.common_name=
grdl-console.ose.secman.kv.logger.basepath=
grdl-console.ose.secman.kv.logger.secret_name=
grdl-console.ose.secman.pki.psql-conf.basepath=
grdl-console.ose.secman.pki.psql-conf.common_name=
grdl-console.ose.secman.kv.psql-conf.basepath=
grdl-console.ose.secman.pki.to_worker.basepath=
grdl-console.ose.secman.pki.to_worker.common_name=
grdl-console.ose.secman.kv.to_worker.basepath=
grdl-console-ui.ose.secman.pki.ingress.basepath=
grdl-console-ui.ose.secman.pki.ingress.common_name=
grdl-console-ui.ose.secman.kv.ingress.add-old-ca-chain=false
grdl-console-ui.ose.secman.kv.ingress.old-ca-chain.basepath=
grdl-console-ui.ose.secman.kv.ingress.old-ca-chain.secret_name=
grdl-console-ui.ose.secman.kv.ingress.old-ca-chain.secret_path=
grdl-console-ui.ose.secman.kv.ingress.basepath=
grdl-console-ui.ose.secman.kv.ingress.secret_name=
grdl-console.conf:#Имя приложения. Изменять не требуется. application-console.name=grdl-console #Автоматическое формирование FQDN. Изменять не требуется. grdl-console.ose.istio.ingress.route.spec.host.http.appFQDN={{ lookup('custom_vars', 'application-console.name') }}-{{ lookup('custom_vars', 'distrib.release.version') }}.{{ global.multiClusters.openshiftNewRoute }} #URL до БД grdl-console.db.url={{ GRDL_POSTGRES_DB_URL }} #Имя схемы БД grdl-console.db.schema=gdl #Адрес logout IAM grdl-console.logoutPath=https://{{ lookup('vars', 'global.platform.iam.auth.host') }}/openid-connect-auth/logout grdl-console.restBaseUrl=https://{{ lookup('vars', 'global.platform.iam.auth.host') }}/spas/rest #Адрес login IAM grdl-console.loginPath=https://{{ lookup('custom_vars', 'global.platform.iam.auth.host') }}/login #Параметры логирования grdl-console.log.root.level=info grdl-console.logger.root.level=WARN grdl-console.logger.org.springframework.level=WARN grdl-console.logger.org.springframework.web.level=INFO grdl-console.logger.ru.gradely.level=INFO #Включение JWT валидации grdl-console.jwt-validation.enabled=false grdl-console.jwt-validation.use-vault=false grdl-console.jwt-validation.aud=PlatformAuthZ grdl-console.hot-reload-iam-pk-secret-path=/vault/secrets/jwt/jwt.key grdl-console.jwt-validation.token-format=sudir #Авторизация через внешние scim grdl-console.jwks-url #впишите сюда url на набор внешних ключей для валидации токена #Rate limiter #Включение Rate limiter grdl-console.rate-limiter-enabled=true #Префикс метрик grdl-console.rate-limiter-metric-prefix=grdl_console #Метод ограничения скорости запросов grdl-console.rate-limiter-buckets=[{"uri":"/general","maxTokens":1000,"refillIntervalSec":1}] #Список имен потребителей и доменов воркеров в формате json, например: #grdl-console.workers.list=[ { "as_name": "consumer-1", "domains": [ "grdl-module-1-unver.dc1.example.com" ] }, { "as_name": "consumer-2", "domains": [ "grdl-module-1-unver.dc2.example.com" ] } ] #Структура json-массива позволяет добавлять пользовательские пары ключ-значение grdl-console.workers.list=grdl-console-ui.conf:#Имя приложения. Изменять не требуется. application-console-ui.name=grdl-console-ui #Автоматическое формирование FQDN. Изменять не требуется. grdl-console-ui.ose.istio.ingress.route.spec.host.http.appFQDN={{ lookup('custom_vars', 'application-console-ui.name') }}-{{ lookup('custom_vars', 'distrib.release.version') }}.{{ global.multiClusters.openshiftNewRoute }} grdl-console-ui.x.entry.point.url=“entrypoint-url”/gradely-console/ #Путь до KV grdl-console-ui.ose.secman.kv.ingresspath={{ lookup('custom_vars','global.platform.secman.kv.ingresspath') }}grdl.istio.all.conf:#Включение/отключение sidecar istio-proxy grdl.ose.deployment.spec.template.annotations.istio.inject=true #Включение/отключение секретов для pull image из docker registry grdl.ose.deployment.spec.template.spec.imagePullSecrets.enabled=true #Имя секрета grdl.ose.deployment.spec.template.spec.imagePullSecrets.name={registry_name}grdl.fluentbit-sidecar.all.conf:fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.image.registry={{ registry }} fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.image.registryPath=”registryPath” fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.limits.cpu=200m fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.limits.memory=600Mi fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.limits.ephemeral-storage=${global.ose.deployment.spec.template.spec.containers.resources.limits.ephemeral-storage|2Gi} fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.requests.cpu=200m fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.requests.memory=600Mi fluent-bit-sidecar.kafka.bootstrap.servers=${global.platform.logger.kafka.bootstrap.servers} fluent-bit-sidecar.kafka.topic=${global.platform.logger.kafka.topic} fluent-bit-sidecar.kafka.security.protocol=${global.platform.logger.kafka.security.protocol} fluent-bit-sidecar.logging.cluster=${global.multiClusters.openshiftAppsDomain}
Последовательность действий для развертывания в k8s (RPLW)#
Для реализации поддержки нескольких схем доступа к секретам приложения и потребителей нужно заполнить нижеследующие параметры:
# Для каждой интеграции адрес секрета KV, хранимый в vault, представляется в виде конкатинации двух параметров <имя_модуля>.ose.secman.kv.<имя_интеграции>.basepath и <имя_модуля>.ose.secman.kv.<имя_интеграции>.secret_name
# Для каждой интеграции секрета PKI, генерируемы vault, происходит по двум параметрам: <имя_модуля>.ose.secman.pki.<имя_интеграции>.basepath - движок PKI (имеет список разрешенных common names) и <имя_модуля>.ose.secman.pki.<имя_интеграции>.common_name - common name
# Для входящего трафика и интеграции с ОТТ, внесен тогглер (true/false) <имя_модуля>.ose.secman.kv.<ingress/ott>.add-old-ca-chain, который контролирует подключение KV секрета, для добавления цепочки сертивикатов в корневой сертификат (согласно архитектуре: на grdl-console-ui нет ОТТ!)RV
# Для интеграции с БД, кафки и "из консоли в воркера" KV конкатинация состоит из <имя_модуля>.ose.secman.kv.<имя_интеграции>.basepath и FQDN имени сервиса интеграции, соотвественно данных параметров в ConfigMap нет
rplw-module.ose.secman.kv.psql-cred.basepath=
rplw-module.ose.secman.pki.ingress.basepath=
rplw-module.ose.secman.pki.ingress.common_name=
rplw-module.ose.secman.kv.ingress.add-old-ca-chain=
rplw-module.ose.secman.kv.ingress.old-ca-chain.basepath=
rplw-module.ose.secman.kv.ingress.old-ca-chain.secret_name=
rplw-module.ose.secman.kv.ingress.old-ca-chain.secret_path=
rplw-module.ose.secman.kv.ingress.basepath=
rplw-module.ose.secman.pki.ott.basepath=
rplw-module.ose.secman.pki.ott.common_name=
rplw-module.ose.secman.kv.ott.add-old-ca-chain=
rplw-module.ose.secman.kv.ott.old-ca-chain.basepath=
rplw-module.ose.secman.kv.ott.old-ca-chain.secret_name=
rplw-module.ose.secman.kv.ott.old-ca-chain.secret_path=
rplw-module.ose.secman.kv.ott.basepath=
rplw-module.ose.secman.kv.ott.secret_name=
rplw-module.ose.secman.pki.audit.basepath=
rplw-module.ose.secman.pki.audit.common_name=
rplw-module.ose.secman.kv.audit.basepath=
rplw-module.ose.secman.kv.audit.secret_name=
rplw-module.ose.secman.pki.to_console.basepath=
rplw-module.ose.secman.pki.to_console.common_name=
rplw-module.ose.secman.kv.to_console.basepath=
rplw-module.ose.secman.kv.to_console.secret_name=
rplw-module.ose.secman.pki.logger.basepath=
rplw-module.ose.secman.pki.logger.common_name=
rplw-module.ose.secman.kv.logger.basepath=
rplw-module.ose.secman.kv.logger.secret_name=
rplw-module.ose.secman.pki.psql-eg.basepath=
rplw-module.ose.secman.pki.psql-eg.common_name=
rplw-module.ose.secman.kv.psql-eg.basepath=
rplw-module.ose.secman.pki.kafka.basepath=
rplw-module.ose.secman.pki.kafka.common_name=
rplw-module.ose.secman.kv.kafka.basepath=
rplw-module.conf:#Имя приложения. Изменять не требуется. application-module.name=rplw-module #Автоматическое формирование FQDN. Изменять не требуется. rplw-module.ose.istio.ingress.route.spec.host.http.appFQDN={{ lookup('custom_vars', 'application-module.name') }}-{{ lookup('custom_vars', 'distrib.release.version') }}.{{ global.multiClusters.openshiftNewRoute }} rplw-module.ose.istio.ingress.route.spec.host.http.consoleFQDN={{ lookup('custom_vars', 'application-console.name') }}-{{ lookup('custom_vars', 'distrib.release.version') }}.{{ lookup('custom_vars', 'global.multiClusters.openshiftNewRoute') }} #Url для подключения module к console при старте rplw-module.console.url=http://{{ lookup('custom_vars', 'grdl-console.ose.istio.ingress.route.spec.host.http.appFQDN') }}/ #Параметры логирования rplw-module.log.root.level=info rplw-module.logger.root.level=INFO rplw-module.logger.org.springframework.level=INFO rplw-module.logger.org.springframework.web.level=INFO rplw-module.logger.ru.gradely.level=INFO rplw-module.label= #Rate limiter #Включение Rate limiter rplw-module.rate-limiter-enabled=false #Префикс метрик rplw-module.rate-limiter-metric-prefix=grdl_module rplw-module.rate-limiter-buckets=[{"uri":"/general","maxTokens":1000,"refillIntervalSec":1}]rplw.istio.all.conf:#Включение/отключение sidecar istio-proxy rplw.ose.deployment.spec.template.annotations.istio.inject=true #Включение/отключение секретов для pull image из docker registry rplw.ose.deployment.spec.template.spec.imagePullSecrets.enabled=true #Имя секрета rplw.ose.deployment.spec.template.spec.imagePullSecrets.name={registry_name}rplw.fluentbit-sidecar.all.conf:fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.image.registry={{ registry }} fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.image.registryPath=”registryPath” fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.limits.cpu=200m fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.limits.memory=600Mi fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.limits.ephemeral-storage=${global.ose.deployment.spec.template.spec.containers.resources.limits.ephemeral-storage|2Gi} fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.requests.cpu=200m fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.requests.memory=600Mi fluent-bit-sidecar.kafka.bootstrap.servers=${global.platform.logger.kafka.bootstrap.servers} fluent-bit-sidecar.kafka.topic=${global.platform.logger.kafka.topic} fluent-bit-sidecar.kafka.security.protocol=${global.platform.logger.kafka.security.protocol} fluent-bit-sidecar.logging.cluster=${global.multiClusters.openshiftAppsDomain}
Проверка результата#
Изменения в конфигурационные файлы внесены.
Шаг 9. Проверьте и подготовьте параметры k8s в namespace (обязательный)#
Данный шаг обязателен при установке только в k8s. При развертывании на VM пропускается
Последовательность действий#
Для этого создайте imagePullSecret:
kind: Secret
apiVersion: v1
metadata:
name: ${grdl.ose.deployment.spec.template.spec.imagePullSecrets.name}'
data:
.dockerconfigjson: >-
"Строка подключения к docker registry в base64"
type: kubernetes.io/dockerconfigjson
Проверка результата#
Параметры k8s подготовлены.
Шаг 10. Удалите устаревшие ресурсы Kubernetes/OpenShift (обязательный)#
Данный шаг обязателен при установке только в k8s. При развертывании на VM пропускается
Последовательность действий#
Routes:
ingress-grdl-console-mTLS-unver
ingress-grdl-console-ui-mTLS-unver
ingress-grdl-module-mTLS-unver
Gateways:
ingress-gw-grdl-console-unver
ingress-gw-grdl-console-ui-unver
ingress-gw-grdl-module–unver
Virtual Services:
ingress-vs-ufs-si-console-bh-unver
ingress-vs-ufs-si-platform-bh-unver
ingress-vs-ufs-si-replicator-bh-unver
Проверка результата#
Устаревшие ресурсы k8s удалены.
Шаг 11. Произведите полную установку GraDeLy инструментом CDJE (обязательный)#
Последовательность действий в данном шаге будет различаться для развертывания в k8s и на VM
Последовательность действий для развертывания в k8s#
При выполненных предыдущих пунктах файлы сценария миграции, обновления БД повторно можно не выполнять.
Полный список файлов сценария для установки:
MIGRATION_FP_CONF;
FP_CONF_CHECK;
DB_UPDATE;
OPENSHIFT_DEPLOY;
OPENSHIFT_INGRESS_EGRESS_DEPLOY.
Проверка результата#
Установка проведена
Последовательность действий при развертывании на VM#
При выполненных предыдущих пунктах файлы сценария миграции, обновления БД повторно можно не выполнять.
Полный список файлов сценария для установки:
MIGRATION_FP_CONF;
FP_CONF_CHECK;
DB_UPDATE;
INSTALL_RPLW_MODULE_ON_VM.
Проверка результата#
Установка проведена
Шаг 12. Убедиться, что в БД источника создаются публикации для выбора реплицируемых таблиц (обязательный)#
Данный шаг обязателен при установке в k8s и на VM
Последовательность действий#
Зайдите в клиентский терминал psql, в БД источника и создайте публикацию: create PUBLICATION {имя_публикации} FOR ALL TABLES;, чтобы реплицировать все таблицы или create PUBLICATION {имя_публикации} FOR TABLE {имя_таблицы1}, {имя_таблицы2}...;для репликации отдельных таблиц.
Механизм публикации в PostgreSQL позволяет выбирать таблицы для репликации. Выбрать таблицы также можно с помощью визуального редактора маппинга (подробнее в «Руководстве пользователя интерфейса консоли управления», однако для лучшей производительности, рекомендуется использовать механизм публикаций.
Проверка результата#
Публикация создаются.
Шаг 13. Создайте вспомогательную таблицу в БД приемника для старта с GraDeLyID и репликации из нескольких источников в один приемник (обязательный)#
Данный шаг обязателен при установке в k8s и на VM
Последовательность действий#
Разверните в БД получателя архив воркера package/db/db_archive_receiver.zip для запуска на БД получателя.
Архив консоли package/db/db_archive_console.zip разворачивается на БД конфигураций по умолчанию.
Для этого в параметрах в репозитории с конфигурацией стенда, параметры ${стенд}/parameters/common.conf.yml установите переключатель «YES» для триггера на дополнительные таблицы на БД получателя.
Или пропишите и выполните в редакторе СУБД SQL-скрипт:
CREATE TABLE schema."$GRADELY_APPLY_POSITION$" (
thread_id int4 NOT NULL,
trx_id int8 NULL,
source_id int8 NOT NULL,
internal_id int8 NULL,
"offset" int8 NULL,
kafka_id varchar(255) NULL,
CONSTRAINT grdl_pk_apply_position_id PRIMARY KEY (source_id)
);
Проверка результата#
Вспомогательная таблица создана.
Шаг 14. Включите КВР, контроль второй рукой (обязательный)#
Данный шаг обязателен при установке только в k8s. При развертывании на VM пропускается
Последовательность действий#
Для этого в параметрах в репозитории с конфигурацией консоли /grdl-console-config.yaml добавьте строку: grdl-task-control-enable: "${grdlTaskControlEnable}".
Параметр
task_control enable:trueзадается один раз при развертывании приложения. По умолчанию значение параметра false, то есть КВР отключен.Если приложение уже развернуто и при развертывании было задано значение false, чтобы включить контроль второй рукой, нужно повторно развернуть приложение.
Проверка результата#
КВР включен.
Шаг 15. Настройте секреты в системе управления секретами HashiCorp Vault/Secret Management System (обязательный)#
Данный шаг обязателен при установке в k8s и на VM
Последовательность действий#
Воспользуйтесь Руководством администратора.
Проверка результата#
Секреты настроены.
Шаг 16. Назначьте роли в СУДИР (обязательный)#
Данный шаг обязателен при установке только в k8s. При развертывании на VM пропускается
Последовательность действий#
Проведите интеграцию с СУДИР в соответствии с документацией СУДИР и назначьте роль PROJECT_CREATOR.
Проверка результата#
Роли в СУДИР назначены
Шаг 17. Создайте новый проект (обязательный)#
Данный шаг обязателен при установке только в k8s. При развертывании на VM пропускается
Последовательность действий#
Создайте проект под ролью PROJECT_CREATOR.
Проверка результата#
Проект создан.
Шаг 18. Определите максимальную производительность (обязательный)#
Данный шаг обязателен при установке в k8s и на VM
Последовательность действий#
Определите максимальную производительность.
Определение максимальной нагрузки
Для определения максимальной нагрузки, которую следует задать с помощью механизма Rate Limiter, проведите тест определения максимальной производительности.
Нагрузка должна быть ограничена с помощью механизма Rate Limiter на уровне, не превышающем показатели теста максимальной производительности.
Сценарий тестирования
При тестировании происходит пошаговое увеличение нагрузки с нуля до предельной (с шагом 20% от плановой). Пошаговое увеличение происходит до тех пор, пока не нарушится критерий успешности по количеству ошибок и/или времени отклика (что наступит раньше). Время работы теста на каждом шаге после стабилизации нагрузки составляет 10 минут.
Цель тестирования
По результатам тестирования устанавливается:
уровень нагрузки L0 — последний шаг нагрузки, на котором не были нарушены критерии успешности;
уровень нагрузки Llim — предельный уровень нагрузки, при котором не был нарушен критерий по количеству ошибок;
уровень утилизации CPUlim — утилизация CPU на уровне нагрузки Llim.
Ожидаемый результат
Определен уровень максимальной производительности. L0 удовлетворяет одному из следующих уровней нагрузки (при использовании ресурсов всеми подами не больше, чем на OSE):
Lmax для предыдущего релиза;
Запросите аналитическую оценку команды по плановой нагрузке на сервис на год вперед, если не достигнут Lmax (при суммарных ресурсах как на OSE);
Используйте критерий 10х от промышленной нагрузки на сервис, если не достигнута плановая нагрузка на год вперед.
Определен уровень нагрузки Llim.
Определен уровень утилизации CPUlim.
Проверка результата#
Максимальная производительность определена
Шаг 19. Настройте механизм для ограничения входящих запросов Rate Limiter (обязательный)#
Данный шаг обязателен при установке в k8s и на VM
Последовательность действий#
Настройте механизм для ограничения входящих запросов Rate Limiter.
Настройка механизма для ограничения входящих запросов Rate Limiter
Задайте следующие параметры в configmap консоли или воркера:
Параметр |
Тип |
Значение по умолчанию |
Описание |
|---|---|---|---|
|
boolean |
|
Включает и выключает Rate Limiter для консоли |
|
string |
|
Приставка для имени метрики, которая показывает, сколько запросов прошли через Rate Limiter на консоли. |
|
json |
|
Конфигурация Rate Limiter для каждого endpoint консоли |
|
boolean |
|
Включает и выключает Rate Limiter для воркера |
|
string |
|
Приставка для имени метрики, которая показывает, сколько запросов прошли через Rate Limiter на воркере. |
|
json |
|
Конфигурация Rate Limiter для каждого endpoint воркера |
Json-конфигурация endpoints позволяет точечно определить ограничение по количеству вызовов для каждого endpoint.
Эта конфигурация представляет массив объектов, в каждом из которых указывается:
uri — endpoint, который необходимо защитить. Поддерживаются regexp, например,
/module/.*/state. Есть ключевое значение/general, с помощью него все endpoints, которые не заданы явно, объединяются в одну группу с общим лимитом;maxTokens — максимальное количество запросов, которое пользователь разрешает к endpoint;
refillIntervalSec — интервал в секундах, за который доступное количество запросов восстанавливается.
Если
maxTokens=1000, аrefillIntervalSec=1, пользователь не ждет, пока пройдет секунда, — при каждом запросе увеличиваем доступное количество запросов на величину, пропорциональную прошедшему времени. Например, если с момента прошлого запроса прошло пол секунды, к доступному лимиту добавляется 500 запросов.
Важно, чтобы этот json представлял из себя одну строку без пробелов.
Проверка результата#
Rate Limiter настроен
Шаг 20. Интеграция с компонентом граничного прокси (IGEG) (обязательный)#
Данный шаг обязателен при установке только в k8s. При развертывании на VM пропускается
Последовательность действий GRDL#
Интеграция с граничным прокси настраивается Администратором стенда в ${стенд}/multiClusters.json
Убедитесь, что в конфигурации ConfigMap grdl.istio.all.conf установлен параметр: grdl.ose.deployment.spec.template.annotations.istio.inject=true и эта аннотация применена в Deployment для console, console-ui.
Последовательность действий RPLW#
Интеграция с граничным прокси настраивается Администратором стенда в ${стенд}/multiClusters.json
Убедитесь, что в конфигурации ConfigMap rplw.istio.all.conf установлен параметр: rplw.ose.deployment.spec.template.annotations.istio.inject=true и эта аннотация применена в Deployment для module.
Проверка результата#
Интеграция с IGEG настроена.
Шаг 21. Интеграция с сервисом сбора, обработки и записи данных в каналы вывода (COTE) (обязательный)#
Данный шаг обязателен при установке только в k8s. При развертывании на VM пропускается
Последовательность действий#
Интеграция с Аудитом настраивается Администратором стенда в файле ${стенд}/conf/config/parameters/grdl-console.conf по шаблону:
#Режим работы аудита
grdl-console.union-audit.mode
# REST endpoint Platform V Monitor (AUD)
grdl-console.union-audit.baseUrl
# IP и FQDN (через пробел) узла АС или FQDN namespace АС в OpenShift,
# с которого происходит отправка событий аудита
grdl-console.union-audit.nodeId
# проект, необходимый для отправки сообщений аудита в Push-Collector
grdl-console.union-audit.project:ms-audt
# необходимые сертификаты и закрытый ключ
grdl-console.union-audit.alias
# Путь до файла с секретом из Secman
grdl-console.hot-reload-audit-secret-path
# Путь к хранилищу с сертификатами УЦ(формат jks)
grdl-console.union-audit.kafka.sslTruststoreLocation
# Путь к хранилищу с сертификатами приложения(формат jks)
grdl-console.union-audit.kafka.sslKeystoreLocation
#REST endpoint Platform V Audit SE (AUD)
grdl-console.audit2-http-proxy
Проверка результата#
Интеграция с COTE настроена.
Шаг 22. Интеграция с компонентом IAM Proxy (AUTH) (обязательный)#
Данный шаг обязателен при установке только в k8s. При развертывании на VM пропускается
Последовательность действий#
Пример config файлов для интеграции с AUTH:
grdl-console.conf:#Имя приложения. Изменять не требуется. application-console.name=grdl-console #Автоматическое формирование FQDN. Изменять не требуется. grdl-console.ose.istio.ingress.route.spec.host.http.appFQDN={{ lookup('custom_vars', 'application-console.name') }}-{{ lookup('custom_vars', 'distrib.release.version') }}.{{ global.multiClusters.openshiftNewRoute }} #URL до БД grdl-console.db.url={{ GRDL_POSTGRES_DB_URL }} #Имя схемы БД grdl-console.db.schema=gdl #Адрес logout IAM grdl-console.logoutPath=https://{{ lookup('vars', 'global.platform.iam.auth.host') }}/openid-connect-auth/logout grdl-console.restBaseUrl=https://{{ lookup('vars', 'global.platform.iam.auth.host') }}/spas/rest #Адрес login IAM grdl-console.loginPath=https://{{ lookup('custom_vars', 'global.platform.iam.auth.host') }}/login #Путь до KV Ingress grdl-console.ose.secman.kv.ingresspathgrdl-console-ui.conf:#Имя приложения. Изменять не требуется. application-console-ui.name=grdl-console-ui #Автоматическое формирование FQDN. Изменять не требуется. grdl-console-ui.ose.istio.ingress.route.spec.host.http.appFQDN={{ lookup('custom_vars', 'application-console-ui.name') }}-{{ lookup('custom_vars', 'distrib.release.version') }}.{{ global.multiClusters.openshiftNewRoute }} grdl-console-ui.x.entry.point.url=“entrypoint-url”/gradely-console/
Проверка результата#
Интеграция с AUTH настроена.
Шаг 23. Интеграция с СУДИР (обязательный)#
Данный шаг обязателен при установке только в k8s. При развертывании на VM пропускается
Последовательность действий#
GraDeLy интегрируется с СУДИР через SCIM. Путь: <url_gradely>/scim/.
При интеграции из репозитория GraDeLy в СУДИР подгружается ролевая модель. В дальнейшем заданные роли назначаются пользователям в СУДИР в соответствии с документацией СУДИР.
Перечень пользователей и назначенных им ролей синхронизируется с репозиторием GraDeLy по инициативе СУДИР в соответствии с документацией СУДИР.
Проверка результата#
Интеграция с СУДИР настроена.
Шаг 24. Интеграция с компонентом Журналирование (LOGA) (обязательный)#
Данный шаг обязателен при установке только в k8s. При развертывании на VM пропускается
Последовательность действий GRDL#
Пример grdl.fluentbit-sidecar.all.conf файла для интеграции с LOGA:
fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.image.registry={{ registry }}
fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.image.registryPath=”registryPath”
fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.limits.cpu=200m
fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.limits.memory=600Mi
fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.limits.ephemeral-storage=${global.ose.deployment.spec.template.spec.containers.resources.limits.ephemeral-storage|2Gi}
fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.requests.cpu=200m
fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.requests.memory=600Mi
fluent-bit-sidecar.kafka.bootstrap.servers=${global.platform.logger.kafka.bootstrap.servers}
fluent-bit-sidecar.kafka.topic=${global.platform.logger.kafka.topic}
fluent-bit-sidecar.kafka.security.protocol=${global.platform.logger.kafka.security.protocol}
fluent-bit-sidecar.logging.cluster=${global.multiClusters.openshiftAppsDomain}
Последовательность действий RPLW#
Пример rplw.fluentbit-sidecar.all.conf файла для интеграции с LOGA:
fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.image.registry={{ registry }}
fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.image.registryPath=”registryPath”
fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.limits.cpu=200m
fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.limits.memory=600Mi
fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.limits.ephemeral-storage=${global.ose.deployment.spec.template.spec.containers.resources.limits.ephemeral-storage|2Gi}
fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.requests.cpu=200m
fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.requests.memory=600Mi
fluent-bit-sidecar.kafka.bootstrap.servers=${global.platform.logger.kafka.bootstrap.servers}
fluent-bit-sidecar.kafka.topic=${global.platform.logger.kafka.topic}
fluent-bit-sidecar.kafka.security.protocol=${global.platform.logger.kafka.security.protocol}
fluent-bit-sidecar.logging.cluster=${global.multiClusters.openshiftAppsDomain}
Проверка результата#
Интеграция с LOGA настроена.
Шаг 25. Интеграция с компонентом Объединенный мониторинг Unimon (MONA) (обязательный)#
Данный шаг обязателен при установке только в k8s. При развертывании на VM пропускается
Последовательность действий#
Для интеграции с компонентом MONA требуется предварительная настройка стенда администраторами.
Параметры берутся из настроек стенда.
Проверка результата#
Интеграция с MONA настроена.
Шаг 26. Интеграция с компонентом Platform V Pangolin DB (PSQL) (обязательный)#
Данный шаг обязателен при установке только в k8s. При развертывании на VM пропускается
Последовательность действий#
Пример grdl-console.conf файла для интеграции с PSQL:
#Имя приложения. Изменять не требуется.
application-console.name=grdl-console
#Автоматическое формирование FQDN. Изменять не требуется.
grdl-console.ose.istio.ingress.route.spec.host.http.appFQDN={{ lookup('custom_vars', 'application-console.name') }}-{{ lookup('custom_vars', 'distrib.release.version') }}.{{ global.multiClusters.openshiftNewRoute }}
#URL до БД
grdl-console.db.url={{ GRDL_POSTGRES_DB_URL }}
#Имя схемы БД
grdl-console.db.schema=gdl
#Адрес logout IAM
grdl-console.logoutPath=https://{{ lookup('vars', 'global.platform.iam.auth.host') }}/openid-connect-auth/logout
grdl-console.restBaseUrl=https://{{ lookup('vars', 'global.platform.iam.auth.host') }}/spas/rest
#Адрес login IAM
grdl-console.loginPath=https://{{ lookup('custom_vars', 'global.platform.iam.auth.host') }}/login
В Platform V Pangolin DB 6 параметр
wal_keep_size, задающий минимальный объем сегментов, который будет сохраняться в каталоге pg_wal, по умолчанию составляет 8 ГБ.
Проверка результата#
Интеграция с PSQL настроена.
Шаг 27. Интеграция с компонентом Corax (KFKA) (обязательный)#
Данный шаг обязателен при установке только в k8s. При развертывании на VM пропускается
Последовательность действий#
Для интеграции с компонентом KFKA требуется предварительная настройка стенда Администраторами.
Параметры берутся из настроек стенда.
Проверка результата#
Интеграция с KFKA настроена.
Шаг 28. Интеграция с компонентом OTTS (обязательный)#
Данный шаг обязателен при установке только в k8s. При развертывании на VM пропускается
Последовательность действий#
Настройка интеграции производится на подах Ingress Gateway и Egress Gateway каждого Namespace.
Пример grdl.all.conf :
# Container limits
grdl.ott.limits.cpu = 200m
grdl.ott.limits.memory = 600Mi
grdl.ott.limits.ephemeral-storage = 1Gi
grdl.ott.requests.cpu = 200m
grdl.ott.requests.memory = 600Mi
# App vars
grdl.ott.module.id = {{ lookup('vars','global.platform.grdl.ott.module.id') }}
grdl.ingress.ott.audit2.proxy.url = http://localhost:6992
grdl.egress.ott.audit2.proxy.url = http://localhost:6991
Пример ConfigMap для Ingress Gateway:
kind: ConfigMap
apiVersion: v1
metadata:
name: grdl-console-ott-ingress-cm
labels:
owner: ott-sidecar
data:
OTT_CERTSTORE_TYPE: PEM
OTT_MODULE_ID: ott-client-grdl
OTT_CLIENT_CRT: /vault/secrets/certs/ott/ott_cert.pem
OTT_CLIENT_PRIVATE_KEY: /vault/secrets/certs/ott/ott_key.pem
OTT_SERVICE_TLS_CRT: /vault/secrets/certs/ott/ott_root.pem
OTT_SERVICE_CRT: /vault/secrets/certs/ott/ott-service.pem # обеспечение обратной совместимости с OTT сервером версии до 4.3.1
OTT_SERVICE_CLIENT_TRUSTED_CRT_RATE: '60' # период обновления кеша сертификатов серверов OTT, в секундах (при подключении к OTT серверу 4.3.1+)
OTT_OPER_MODE: validate # <mode> = "sign" для egress GW, "validate" - для ingress GW; не задавать этот параметр при интеграции со сборкой envoy от synapse security
OTT_SERVICE_HOSTS: >-
ott-server-host1:port,ott-server-host2:port # список серверов:портов сервиса OTTS для балансировки нагрузки, или аналогичный список nginx OTTS
JAVA_TOOL_OPTIONS: -Dlogging.config=/mnt/ott-logback/logback.xml -Dlogback.configurationFile=/mnt/ott-logback/logback.xml -XX:MaxRAMPercentage=55.0 -Dspring.profiles.active=probes
OTT_AUTH_TLS_TRUST_MODE: 'true'
# изменить значения параметров ниже при необходимости, по умолчанию - не менять
OTT_CLIENT_MMT-COMPATIBILITY-MODE: 'false' #режим совместимости с ММТ 3 поколения, включать для взаимодействия с Платформой 3-го поколения, ожидаемая структура path HTTP-запроса: /<receiver_id>/<api.name>/<api.method> или /<api.name>/<api.method>
OTT_GRPC_PORT: /mnt/ott-uds-socket/ott.socket
OTT_SERVICE_URL: 'https://stub-host:stub-port/ott-service/rest/token' #шаблон URL сервиса OTTS, при балансировке значения будут подставляться из OTT_SERVICE_HOSTS
OTT_AUTHZ_VERSION: '1.0' #версия метода авторизации
OTT_AUTHZ_REALM: ott
OTT_HTTP_PORT: '8090' # порт OTTS Sidecar для readiness probe, при необходимости можно выбрать любой другой свободный порт
OTT_ANONYMOUS_REQUESTS_ENABLED: 'false' # анонимный режим, для включения необходимо выставить в 'true'
OTT_CLIENT_DEFAULT_REALM: mmt
OTT_CLIENT_MMT_RESOURCE_ATTRID: 'urn:censored:names:censored:1.0:api:interface:fullname'
OTT_CLIENT_MMT_ACTION_ATTRID: 'urn:censored:names:censored:1.0:action:id'
OTT_APPLICATION_ATTRIBUTE_ID: 'urn:censored:names:censored:1.0:module:id' #здесь строка остается неизменной, на свой идентификатор приложения менять не нужно
При использовании IAM необходимо указать параметр
OTT_AUTH_TLS_TRUST_MODE: 'true'
Пример ConfigMap для Egress Gateway:
kind: ConfigMap
apiVersion: v1
metadata:
name: grdl-console-ott-egress-cm
labels:
owner: ott-sidecar
data:
OTT_CERTSTORE_TYPE: PEM
OTT_MODULE_ID: ott-client-grdl
OTT_CLIENT_CRT: /vault/secrets/certs/ott/ott_cert.pem
OTT_CLIENT_PRIVATE_KEY: /vault/secrets/certs/ott/ott_key.pem
OTT_SERVICE_TLS_CRT: /vault/secrets/certs/ott/ott_root.pem
OTT_SERVICE_CRT: /vault/secrets/certs/ott/ott-service.pem # обеспечение обратной совместимости с OTT сервером версии до 4.3.1
OTT_SERVICE_CLIENT_TRUSTED_CRT_RATE: '60' # период обновления кеша сертификатов серверов OTT, в секундах (при подключении к OTT серверу 4.3.1+)
OTT_OPER_MODE: sign # <mode> = "sign" для egress GW, "validate" - для ingress GW; не задавать этот параметр при интеграции со сборкой envoy от synapse security
OTT_SERVICE_HOSTS: >-
ott-server-host1:port,ott-server-host2:port # список серверов:портов сервиса OTTS для балансировки нагрузки, или аналогичный список nginx OTTS
JAVA_TOOL_OPTIONS: -Dlogging.config=/mnt/ott-logback/logback.xml -Dlogback.configurationFile=/mnt/ott-logback/logback.xml -XX:MaxRAMPercentage=55.0 -Dspring.profiles.active=probes
# изменить значения параметров ниже при необходимости, по умолчанию - не менять
OTT_CLIENT_MMT-COMPATIBILITY-MODE: 'false' #режим совместимости с ММТ 3 поколения, включать для взаимодействия с Платформой 3-го поколения, ожидаемая структура path HTTP-запроса: /<receiver_id>/<api.name>/<api.method> или /<api.name>/<api.method>
OTT_GRPC_PORT: /mnt/ott-uds-socket/ott.socket
OTT_SERVICE_URL: 'https://stub-host:stub-port/ott-service/rest/token' #шаблон URL сервиса OTTS, при балансировке значения будут подставляться из OTT_SERVICE_HOSTS
OTT_AUTHZ_VERSION: '1.0' #версия метода авторизации
OTT_AUTHZ_REALM: ott
OTT_HTTP_PORT: '8090' # порт OTTS Sidecar для readiness probe, при необходимости можно выбрать любой другой свободный порт
OTT_ANONYMOUS_REQUESTS_ENABLED: 'false' # анонимный режим, для включения необходимо выставить в 'true'
OTT_CLIENT_DEFAULT_REALM: mmt
OTT_CLIENT_MMT_RESOURCE_ATTRID: 'urn:censored:names:censored:1.0:api:interface:fullname'
OTT_CLIENT_MMT_ACTION_ATTRID: 'urn:censored:names:censored:1.0:action:id'
OTT_APPLICATION_ATTRIBUTE_ID: 'urn:censored:names:censored:1.0:module:id' #здесь строка остается неизменной, на свой идентификатор приложения менять не нужно
Подробное описание интеграции доступно в документации на продукт One-Time Password (OTP)/OTT (версия 5.15)
Проверка результата#
Интеграция с OTTS настроена.
Шаг 29. Интеграция с HashiCorp Vault (SecMan) (обязательный)#
Последовательность действий в данном шаге будет различаться для развертывания в k8s и на VM
Последовательность действий для развертывания в k8s#
HashiCorp Vault (SecMan) — это система управления секретами и шифрованием на основе идентификационных данных. Взаимодействие с сервером SecMan производится с помощью Vault Agent sidecar, который поставляется в целевой pod с помощью инжектора.
Пример инжектора в Deployment:
… template: metadata: labels: secman-injector: enabled …
Инжектор Vault Agent изменяет спецификации pod, чтобы включить контейнеры Vault Agent, которые отображают секреты Vault в разделяемом томе памяти с использованием шаблонов Vault Agent. Выводя секреты на общий том, контейнеры внутри модуля могут использовать секреты Vault, не зная о Vault.
Инжектор — это Kubernetes Mutation Webhook Controller. Контроллер перехватывает события модуля и применяет изменения к модулю, если в запросе существуют аннотации. Эта функциональность предоставляется проектом vault-k8s и может быть автоматически установлена и настроена с помощью диаграммы Vault Helm.
Параметры инжектора и действий с секретами SecMan передаются в блоке аннотаций.
Пример записи сертификата из Key Value хранилища SecMan в файловую систему пода с использованием языка шаблонов GO Template:
template:
metadata:
labels:
...
annotations:
...
vault.hashicorp.com/agent-inject-secret-ott_root.pem: 'true'
vault.hashicorp.com/secret-volume-path-ott_root.pem: /vault/secrets/certs/ott
vault.hashicorp.com/agent-inject-file-ott_root.pem: ott_root.pem
vault.hashicorp.com/agent-inject-template-ott_root.pem: |
{{ '{{- with secret "' +
'DEV_censored/A/IFT3/GRDL/KV2/' +
'ott' +
'" -}}' }}
{{ '{{ .Data.data.cacert }}' }}
{{ '{{ end -}}' }}
...
GraDeLy поддерживает два типа секретов:
PKI — секреты, сгенерированные с движком SberCA;
KV-секреты — секреты, сгенерированные с движком KV Secrets Engine.
Конфигурационные параметры генерации секретов:
grdl-console-ui.k8s.secman.engine.ingress=PKI
grdl-console.k8s.secman.engine.ott=KV
grdl-console.k8s.secman.engine.ingress=PKI
grdl-console.k8s.secman.engine.audit=KV
grdl-console.k8s.secman.engine.iam=PKI
grdl-console.k8s.secman.engine.logger=KV
grdl-console.k8s.secman.engine.psqlconf=PKI
grdl-console.k8s.secman.engine.toworker=PKI
grdl-module.secman.module.toggler.ott=KV
grdl-module.secman.module.toggler.ingress=PKI
grdl-module.k8s.secman.engine.audit=KV
grdl-module.k8s.secman.engine.toconsole=PKI
grdl-module.k8s.secman.engine.logger=KV
grdl-module.k8s.secman.engine.psql=PKI
grdl-module.k8s.secman.engine.kafka=KV
grdl-module.k8s.secman.engine.ott=KV
grdl-module.k8s.secman.engine.ingress=PKI
Подготовка БД источника и БД приемника для работы с GraDeLy#
Подготовьте конфигурационный файл
postgresql.confБД источника, выставите необходимые параметры:Установите расширенное журналирование с помощью параметра
wal_level = logical.Установите необходимое максимальное количество слотов репликации с помощью параметра
max_replication_slots = 1(один слот на потребителя).Установите необходимое количество одновременно работающих процессов передачи WAL с помощью параметра
max_wal_senders = 1(один процесс на каждый слот).
Создайте пользователя (роль) и схему gdl в БД модуля управления и выдайте ему необходимые права:
CREATE ROLE gdl WITH LOGIN ENCRYPTED PASSWORD '${password.placeholder}' VALID UNTIL '${time.placeholder}'; CREATE SCHEMA IF NOT EXISTS AUTHORIZATION gdl; ALTER ROLE gdl SET search_path = "$user",ext,public; GRANT USAGE ON SCHEMA ext TO gdl; commit;Примечание:
замените
${password.placeholder}актуальным паролем;замените
${time.placeholder}на timestamp срока действия пароля или на значение infinity для бессрочного пароля.
Создайте tablespace grdl_ts_data и grdl_ts_idx:
create tablespace grdl_ts_data owner gdl location '${YYY_location.placeholder}'; create tablespace grdl_ts_idx owner gdl location '${ZZZ_location.placeholder}'; commit; GRANT ALL ON TABLESPACE grdl_ts_data TO gdl; GRANT ALL ON TABLESPACE grdl_ts_idx TO gdl; commit;Примечания:
замените
${YYY_location.placeholder}на абсолютный путь к папке для табличного пространства grdl_ts_data (папка должна существовать на момент создания табличного пространства);замените
${ZZZ_location.placeholder}на абсолютный путь к папке для табличного пространства grdl_ts_idx (папка должна существовать на момент создания табличного пространства).
Создайте пользователя (роль) в БД источника и приемника для выполнения репликации и выдайте ему необходимые права:
Роль для БД источника:
CREATE ROLE gdl_worker WITH REPLICATION LOGIN ENCRYPTED PASSWORD '${password.placeholder}' VALID UNTIL '${time.placeholder}'; commit;Роль для БД приемника (выдача прав на репликацию не требуется):
CREATE ROLE gdl_worker WITH LOGIN ENCRYPTED PASSWORD '${password.placeholder}' VALID UNTIL '${time.placeholder}'; commit;
Примечания:
замените
${password.placeholder}актуальным паролем;замените
${time.placeholder}на timestamp срока действия пароля или на значение infinity для бессрочного пароля.
Выдача минимально необходимых прав репликатору на объекты приемника (для всех DML-операций и на создание собственной схемы):
GRANT USAGE ON SCHEMA ${consumer_schema_name.placeholder} TO gdl_worker; GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA ${consumer_schema_name.placeholder} TO gdl_worker; ALTER DEFAULT PRIVILEGES IN SCHEMA ${consumer_schema_name.placeholder} GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO gdl_worker; commit;При использовании вспомогательных таблиц со стороны репликатора (
$GRADELY_APPLY_POSITION$иgrdl_error) выдайте дополнительные права:GRANT USAGE ON SCHEMA ${consumer_schema_name.placeholder} TO gdl_worker; GRANT SELECT, INSERT, UPDATE, DELETE, TRUNCATE ON $GRADELY_APPLY_POSITION$, grdl_error IN SCHEMA ${consumer_schema_name.placeholder} TO gdl_worker;Примечания:
замените
${consumer_schema_name.placeholder}именами схем потребителей репликации (схемы можно перечислить через запятую);выдача дополнительных прав репликатору на объекты источника не требуется.
Для настройки двунаправленной репликации выдайте дополнительные права на публикацию логических слотов.
Создайте в клиентском терминале psql в БД источника публикацию и слот репликации:
CREATE PUBLICATION {имя_публикации} FOR ALL TABLES; SELECT * FROM pg_create_logical_replication_slot('{имя слота}', 'pgoutput');Создайте новое соединение и настройте параметры соединений с БД, Kafka или файловым хранилищем на вкладке Соединения.
Для каждого из используемых соединений заполните набор обязательных параметров:
name: Человекочитаемое имя type: Из списка [DB, QUEUE] driver: Используемый драйвер url: Строка соединения credentials: Информация для идентификации пользователя user: password:Наполнение соединения Source:
В таблице источника пропишите и запустите
select * from pg_get_replication_slots();найдите свободный слот, т.е. тот, где статус столбца
activeравенfalse(отсутствует галочка);добавьте следующий JSON в опции создаваемого соединения в UI:
{ "slot": "{имя слота}", "publication_names": "{имя_публикации}", }пропишите имя свободного слота на месте Слот;
пропишите название необходимой публикации;
пропишите адрес БД источника в поле URL;
пропишите логин и пароль пользователя с правами на запись в базу в полях Пользователь и Пароль;
укажите «База данных» в поле Тип.
Наполнение соединения Target:
Пропишите адрес БД приемника в поле URL;
пропишите логин и пароль пользователя с правами на запись в базу в полях Пользователь и Пароль;
укажите «База данных» в поле Тип.
Разверните два воркера в рекомендуемой среде контейнеризации.
Убедитесь, что воркеры появились во вкладке Воркеры в статусе
Ready, аProcess_idотсутствует.Создайте граф репликации: DB Source Connection (Source) → Capture Module (Capture) → Kafka Connection (Queue) → Apply Module (Apply) → DB Target Connection (Target).
Подготовьте конфигурации для модуля во вкладке Конфигурации (настройте маппинг и фильтрацию) и примените их к соответствующим модулям в графе.
Проверка результата#
Интеграция с SecMan настроена
Последовательность действий при развертывании на VM#
Интеграция с Secman реализована встроенными средствами и управляется следующими параметрами конфигурации:
gdl:
hot-reload:
vault:
prefix: A/IFT/RPLW/KV2
address: https://secman.domain.local:8443/
namespace: DEV
roleId: censored
secretId: censored
pgCertPath: A/IFT3/GRDL/KV2/pg_secret
sslCertPath: A/IFT3/GRDL/KV2/rplw_ssl_secret
Проверка результата#
Интеграция с SecMan настроена
Шаг 30. Предустановленные конфигурации (обязательный)#
Последовательность действий в данном шаге будет различаться для развертывания в k8s и на VM
Последовательность действий для развертывания в k8s (GRDL)#
grdl.all.conf :
grdl.worker.count = 2 # количество подов воркера при деплое
grdl.ose.deployment.spec.template.spec.containers.ott-sidecar.startupProbe.failureThreshold=30
grdl.ose.deployment.spec.template.spec.containers.ott-sidecar.livenessProbe.failureThreshold=30
grdl.ose.deployment.spec.template.spec.containers.ott-sidecar.readinessProbe.failureThreshold=15
grdl-console.conf :
#Управление приоритетом компонентов
grdl-console.ose.deployment.spec.template.spec.priorityClassName=
# количество реплик
grdl-console.ose.deployment.spec.replicas=2
#Количество экземпляров сервисов, обслуживающих текущие запросы, при выполнении последовательного обновления
grdl-console.ose.deployment.spec.strategy.rollingUpdate.maxSurge=25%
grdl-console.ose.deployment.spec.strategy.rollingUpdate.maxUnavailable=0
grdl-console.ose.deployment.spec.template.spec.containers.grdl-console.resources.limits.cpu=500m
grdl-console.ose.deployment.spec.template.spec.containers.grdl-console.resources.limits.memory=3000Mi
grdl-console.ose.deployment.spec.template.spec.containers.grdl-console.resources.limits.ephemeral-storage={{ lookup('custom_vars', 'global.ose.deployment.spec.template.spec.containers.resources.limits.ephemeral-storage', default='500Mi') }}
grdl-console.ose.deployment.spec.template.spec.containers.grdl-console.resources.requests.cpu=500m
grdl-console.ose.deployment.spec.template.spec.containers.grdl-console.resources.requests.memory=3000Mi
grdl-console.ose.deployment.spec.template.spec.containers.grdl-console.livenessProbe.failureThreshold=3
grdl-console.ose.deployment.spec.template.spec.containers.grdl-console.readinessProbe.failureThreshold=3
grdl-console.feature.SelfAntiAffinity.enabled=false
# Параметр добавляющий аргументы запуска приложения через jvm переменную JAVA_OPTS;
grdl-console.ose.configmap.javaArguments=-XX:+UseContainerSupport -XX:InitialRAMPercentage=40.0 -XX:MaxRAMPercentage=80.0 -XX:+UseSerialGC
grdl-console.scim-cn-enable=true
grdl-console.scim-cn-list=*.solution.sbt
grdl-console.ose.secman.kv.jdbcpath={{ lookup('custom_vars','global.platform.secman.kv.jdbcpath', default='') }}
grdl-console.ose.secman.kv.osapath={{ lookup('custom_vars','global.platform.secman.kv.osapath', default='') }}
grdl-console.ose.secman.kv.iampkpath={{ lookup('custom_vars','global.platform.secman.kv.iampkpath') }}
grdl-console.ose.secman.kv.audit_file.basepath={{ lookup('custom_vars','global.platform.secman.kv.basepath') }}
grdl-console.ose.secman.kv.audit_file.secret_name=audit_file
grdl-console.hot-reload-pg-secret-path=!/vault/secrets/databases/{{ lookup('custom_vars', 'jdbc.grdl_conf.host') }}/application.properties
grdl-console.hot-reload-enable=!true
grdl-console.hot-reload-poll-interval=5000
grdl-console.hot-reload-retry-count=10
grdl-console.hot-reload-fail-safe-enable=true
grdl-console.hot-reload-dir-postgres=/vault/secrets/databases
grdl-console.task-control-enable=false
grdl-console-security-level=light
grdl-console.ose.deployment.spec.template.spec.containers.resources.limits.cpu=1000m
grdl-console.ose.deployment.spec.template.spec.containers.resources.limits.memory=200Mi
grdl-console.ose.deployment.spec.template.spec.containers.resources.requests.cpu=1000m
grdl-console.ose.deployment.spec.template.spec.containers.resources.requests.memory=200Mi
grdl-console.ose.deployment.spec.template.spec.containers.egress.resources.limits.cpu=400m
grdl-console.ose.deployment.spec.template.spec.containers.egress.resources.limits.memory=200Mi
grdl-console.ose.deployment.spec.template.spec.containers.egress.resources.requests.cpu=400m
grdl-console.ose.deployment.spec.template.spec.containers.egress.resources.requests.memory=200Mi
grdl-console.ose.deployment.spec.template.spec.containers.ingress.resources.limits.cpu=200m
grdl-console.ose.deployment.spec.template.spec.containers.ingress.resources.limits.memory=200Mi
grdl-console.ose.deployment.spec.template.spec.containers.ingress.resources.requests.cpu=200m
grdl-console.ose.deployment.spec.template.spec.containers.ingress.resources.requests.memory=200Mi
grdl-console-max-http-request-header-size=16000
grdl-console.system-id=IFT3
grdl-console.swagger-config-prefix=/gradely-console-ift3
grdl-console.security-user-auto-create-enable=false
#Список серверов выдающих токенов для ИАМ
grdl-console.trusted-issuer-urls=https://fqn1,https://fqdn2
grdl-console.trusted-issuer-protocol=!http
grdl-console.trusted-issuer-port=!6870
grdl-console.osa.secretPath=/vault/secrets/osa/osa.key
grdl-console.ose.secman.kv.osakeypath=osakey
grdl-console-ui.conf :
grdl-console-ui.ose.deployment.spec.template.spec.containers.grdl-console-ui.resources.limits.cpu=500m
grdl-console-ui.ose.deployment.spec.template.spec.containers.grdl-console-ui.resources.limits.memory=1200Mi
grdl-console-ui.ose.deployment.spec.template.spec.containers.grdl-console-ui.resources.limits.ephemeral-storage={{ lookup('custom_vars', 'global.ose.deployment.spec.template.spec.containers.resources.limits.ephemeral-storage', default='500Mi') }}
grdl-console-ui.ose.deployment.spec.template.spec.containers.grdl-console-ui.resources.requests.cpu=500m
grdl-console-ui.ose.deployment.spec.template.spec.containers.grdl-console-ui.resources.requests.memory=1200Mi
grdl-console-ui.ose.deployment.spec.template.spec.containers.ingress.resources.limits.cpu=200m
grdl-console-ui.ose.deployment.spec.template.spec.containers.ingress.resources.limits.memory=200Mi
grdl-console-ui.ose.deployment.spec.template.spec.containers.ingress.resources.requests.cpu=200m
grdl-console-ui.ose.deployment.spec.template.spec.containers.ingress.resources.requests.memory=200Mi
grdl-console-ui.ose.deployment.spec.template.spec.containers.grdl-console-ui.livenessProbe.failureThreshold=3
grdl-console-ui.ose.deployment.spec.template.spec.containers.grdl-console-ui.readinessProbe.failureThreshold=3
grdl-console-ui.feature.SelfAntiAffinity.enabled=false
#Управление приоритетом компонентов
grdl-console-ui.ose.deployment.spec.template.spec.priorityClassName=
# количество реплик
grdl-console-ui.ose.deployment.spec.replicas=2
#Количество экземпляров сервисов, обслуживающих текущие запросы, при выполнении последовательного обновления
grdl-console-ui.ose.deployment.spec.strategy.rollingUpdate.maxSurge=25%
grdl-console-ui.ose.deployment.spec.strategy.rollingUpdate.maxUnavailable=0
grdl.fluentbit-sidecar.all.conf :
fluent-bit-sidecar.kafka.cn.server=ext-abyss-kafka-*.opsmon.sbt
# Параметры fluent-controller
# Перечитать конфигурацию fluent-bit
grdl.fluentbit-sidecar.conf.reload.enabled=true
# Использовать механизм Secman Hotreload
grdl.fluentbit-sidecar.vault.reload.enabled=true
grdl.istio.all.conf :
#Управление приоритетом компонентов
istio.ose.deployment.spec.template.spec.priorityClassName=
# количество реплик ingress/egress
istio.ose.istio.ingress.deployment.spec.replicas=2
# Istio control plane
grdl.ose.istio.control-plane-project={{ lookup('custom_vars', 'global.multiClusters.openshiftControlPlaneProject') }}
grdl.ose.istio.control-plane-istiod-service={{ lookup('custom_vars', 'global.multiClusters.openshiftControlPlaneIstiodService') }}
grdl.ose.istio.control-plane-istiod-port={{ lookup('custom_vars', 'global.multiClusters.openshiftControlPlaneIstiodPort') }}
# Jaeger collector
grdl.ose.istio.control-plane-jaeger-service={{ lookup('custom_vars', 'global.multiClusters.openshiftControlPlaneJaegerService') }}
grdl.ose.istio.control-plane-jaeger-port={{ lookup('custom_vars', 'global.multiClusters.openshiftControlPlaneJaegerPort') }}
grdl.ose.deployment.spec.template.spec.containers.istio-proxy.readinessProbe.failureThreshold=30
#Kafka ports
grdl.ose.istio.egress.se.tcp.kafka.number={{ lookup('custom_vars', 'global.platform.ose.kafka.ports') }}
grdl.ose.deployment.spec.template.spec.containers.egress.resources.limits.cpu=1000m
grdl.ose.deployment.spec.template.spec.containers.egress.resources.limits.memory=200Mi
grdl.ose.deployment.spec.template.spec.containers.egress.resources.requests.cpu=1000m
grdl.ose.deployment.spec.template.spec.containers.egress.resources.requests.memory=200Mi
grdl.ose.deployment.spec.template.spec.containers.ingress.resources.limits.cpu=200m
grdl.ose.deployment.spec.template.spec.containers.ingress.resources.limits.memory=200Mi
grdl.ose.deployment.spec.template.spec.containers.ingress.resources.requests.cpu=200m
grdl.ose.deployment.spec.template.spec.containers.ingress.resources.requests.memory=200Mi
#Порт БД console
grdl-console.ose.istio.egress.se.tcp.db.port.number={{ lookup('custom_vars', 'GRDL_POSTGRES_DB_PORT') }}
grdl.ose.istio.vault-token.aud=vault
Последовательность действий для развертывания в k8s (RPLW)#
rplw.all.conf :
rplw.worker.count = 2 # количество подов воркера при деплое
rplw.ose.deployment.spec.template.spec.containers.ott-sidecar.startupProbe.failureThreshold=30
rplw.ose.deployment.spec.template.spec.containers.ott-sidecar.livenessProbe.failureThreshold=30
rplw.ose.deployment.spec.template.spec.containers.ott-sidecar.readinessProbe.failureThreshold=15
rplw.fluentbit-sidecar.all.conf :
fluent-bit-sidecar.kafka.cn.server=ext-abyss-kafka-*.opsmon.sbt
# Параметры fluent-controller
# Перечитать конфигурацию fluent-bit
rplw.fluentbit-sidecar.conf.reload.enabled=true
# Использовать механизм Secman Hotreload
rplw.fluentbit-sidecar.vault.reload.enabled=true
rplw.istio.all.conf :
#Управление приоритетом компонентов
istio.ose.deployment.spec.template.spec.priorityClassName=
# количество реплик ingress/egress
istio.ose.istio.ingress.deployment.spec.replicas=2
# Istio control plane
rplw.ose.istio.control-plane-project={{ lookup('custom_vars', 'global.multiClusters.openshiftControlPlaneProject') }}
rplw.ose.istio.control-plane-istiod-service={{ lookup('custom_vars', 'global.multiClusters.openshiftControlPlaneIstiodService') }}
rplw.ose.istio.control-plane-istiod-port={{ lookup('custom_vars', 'global.multiClusters.openshiftControlPlaneIstiodPort') }}
# Jaeger collector
rplw.ose.istio.control-plane-jaeger-service={{ lookup('custom_vars', 'global.multiClusters.openshiftControlPlaneJaegerService') }}
rplw.ose.istio.control-plane-jaeger-port={{ lookup('custom_vars', 'global.multiClusters.openshiftControlPlaneJaegerPort') }}
rplw.ose.deployment.spec.template.spec.containers.istio-proxy.readinessProbe.failureThreshold=30
#Kafka ports
rplw.ose.istio.egress.se.tcp.kafka.number={{ lookup('custom_vars', 'global.platform.ose.kafka.ports') }}
rplw.ose.deployment.spec.template.spec.containers.egress.resources.limits.cpu=1000m
rplw.ose.deployment.spec.template.spec.containers.egress.resources.limits.memory=200Mi
rplw.ose.deployment.spec.template.spec.containers.egress.resources.requests.cpu=1000m
rplw.ose.deployment.spec.template.spec.containers.egress.resources.requests.memory=200Mi
rplw.ose.deployment.spec.template.spec.containers.ingress.resources.limits.cpu=200m
rplw.ose.deployment.spec.template.spec.containers.ingress.resources.limits.memory=200Mi
rplw.ose.deployment.spec.template.spec.containers.ingress.resources.requests.cpu=200m
rplw.ose.deployment.spec.template.spec.containers.ingress.resources.requests.memory=200Mi
#Порт БД console
rplw-console.ose.istio.egress.se.tcp.db.port.number={{ lookup('custom_vars', 'GRDL_POSTGRES_DB_PORT') }}
rplw.ose.istio.vault-token.aud=vault
rplw-module.conf :
#Управление приоритетом компонентов
rplw-module.ose.deployment.spec.template.spec.priorityClassName=
# Параметр добавляющий аргументы запуска приложения через jvm переменную JAVA_OPTS. Будут помещены в конфигмап someFpName1. conf;
rplw-module.ose.configmap.javaArguments=-XX:+UseContainerSupport -XX:InitialRAMPercentage=40.0 -XX:MaxRAMPercentage=80.0 -XX:+UseSerialGC
# количество реплик
rplw-module.ose.deployment.spec.replicas=2
#Количество экземпляров сервисов, обслуживающих текущие запросы, при выполнении последовательного обновления
rplw-module.ose.deployment.spec.strategy.rollingUpdate.maxSurge=25%
rplw-module.ose.deployment.spec.strategy.rollingUpdate.maxUnavailable=0
rplw-module.ose.deployment.spec.template.spec.containers.rplw-module.resources.limits.cpu=2000m
rplw-module.ose.deployment.spec.template.spec.containers.rplw-module.resources.limits.memory=4000Mi
rplw-module.ose.deployment.spec.template.spec.containers.rplw-module.resources.limits.ephemeral-storage={{ lookup('custom_vars', 'global.ose.deployment.spec.template.spec.containers.resources.limits.ephemeral-storage', default='500Mi') }}
rplw-module.ose.deployment.spec.template.spec.containers.rplw-module.resources.requests.cpu=2000m
rplw-module.ose.deployment.spec.template.spec.containers.rplw-module.resources.requests.memory=4000Mi
rplw-module.ose.kafka.port=9093
rplw-module.kafka.message-format=PARSED
rplw-module.label=
rplw-module.hot-reload-enable=true
rplw-module.hot-reload-poll-interval=5000
rplw-module.hot-reload-retry-count=10
rplw-module.hot-reload-fail-safe-enable=true
rplw-module.hot-reload-dir-postgres=/vault/secrets/databases
rplw-module.capture-cache-size=12000
rplw-module.apply-cache-size=15
rplw-module.kafka-consumer-queue-size=12000
rplw-module.ose.deployment.spec.template.spec.containers.resources.limits.cpu=1000m
rplw-module.ose.deployment.spec.template.spec.containers.resources.limits.memory=200Mi
rplw-module.ose.deployment.spec.template.spec.containers.resources.requests.cpu=1000m
rplw-module.ose.deployment.spec.template.spec.containers.resources.requests.memory=200Mi
rplw-module.ose.deployment.spec.template.spec.containers.egress.resources.limits.cpu=400m
rplw-module.ose.deployment.spec.template.spec.containers.egress.resources.limits.memory=200Mi
rplw-module.ose.deployment.spec.template.spec.containers.egress.resources.requests.cpu=400m
rplw-module.ose.deployment.spec.template.spec.containers.egress.resources.requests.memory=200Mi
rplw-module.ose.deployment.spec.template.spec.containers.ingress.resources.limits.cpu=200m
rplw-module.ose.deployment.spec.template.spec.containers.ingress.resources.limits.memory=200Mi
rplw-module.ose.deployment.spec.template.spec.containers.ingress.resources.requests.cpu=200m
rplw-module.ose.deployment.spec.template.spec.containers.ingress.resources.requests.memory=200Mi
rplw-module.ose.deployment.spec.template.spec.containers.rplw-module.livenessProbe.failureThreshold=3
rplw-module.ose.deployment.spec.template.spec.containers.rplw-module.readinessProbe.failureThreshold=3
rplw-module.feature.SelfAntiAffinity.enabled=false
# Rate limiter
rplw-module.rate-limiter-buckets=[{"uri":"/general","maxTokens":1000,"refillIntervalSec":1}]
#Список БД находящихся на том же ЦОД что и воркер
rplw-module.db.urls=["fqdn1","fqdn2"]
Проверка результата#
Конфигурации предустановлены.
Последовательность действий при развертывании на VM#
// todo: дополнить для воркеров на VM
Проверка результата#
Конфигурации предустановлены