Установка#
Состав дистрибутива#
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));./bh/grdl-module.jar— REST-сервис с которым взаимодействует клиентский модуль GraDeLy;./pl/grdl-console-ui.zip— архив, содержащий файлы Presentation Layer приложения;./docker/grdl-console/Dockerfile— инструкции по созданию образа;./docker/grdl-module/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;hash-trace.json— файл с хешамиgrdl-cfg-D-x.x.x-xxx-distrib.zipиgrdl-bin-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 репозитории стенда.
Выполните развертывание объектов базы данных (playbook
DB_UPDATE).Используя средства Pipeline, выполните миграцию конфигурационных файлов GraDeLy на узел.
Внесите в конфигурационные файлы GraDeLy на узле необходимые изменения.
Рекомендуется убедиться, что в БД источника создаются публикации для выбора реплицируемых таблиц.
Создайте вспомогательную таблицу в БД приемника для старта с GraDeLyID (опционально).
Настройте секреты в системе управления секретами HashiCorp Vault/Secret Management System.
Настройте механизм для ограничения входящих запросов Rate Limiter.
Описание шагов установки#
Шаг 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 для бессрочного пароля.
Шаг 2. Создайте 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 (папка должна существовать на момент создания табличного пространства).
Шаг 3. Создайте пользователя (роль) в БД источника и приемника для выполнения репликации и выдайте ему необходимые права#
Роль для БД источника:
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 репозитории стенда#
параметры
${стенд}/installer/system/efs/config/parameters/ssl.confssl.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параметры
${стенд}/parameters/common.conf.ymlDB_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параметры
${стенд}/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.confglobal.platform.grdl.ott.module.id - Имя модуля, указанное в поле CN запроса и сертификата клиента ОТТ global.platform.grdl.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
Шаг 5. Выполните развертывание объектов базы данных#
Для этого выполните файл сценария DB_UPDATE, используя устанавливаемый дистрибутив.
Шаг 6. Мигрируйте конфигурационные файлы GraDeLy#
Перед развертыванием самого приложения необходимо произвести шаблонизацию и миграцию параметров из дистрибутива на среду (параметров среды и параметров программного обеспечения).
Данные для шаблонизации и миграции находятся в папке дистрибутива conf/config/parameters.
Параметры в конфигурационных файлах дистрибутива могут содержать плейсхолдеры на общие параметры установки, конкретные значения которых должны подставляться при установке. Конкретные значения параметров установки хранятся отдельно в файлах стендов, наличие этих данных обеспечивается администраторами стендов, куда производится установка продукта.
├── conf
│ └── config
│ ├── parameters
│ │ └── grdl.istio.all.conf
│ │ ├── grdl-console.conf
│ │ ├── grdl-console-ui.conf
│ │ ├── grdl-module.conf
Шаг 7. Внесите в конфигурационные файлы GraDeLy на узле необходимые изменения#
Для реализации поддержки нескольких схем доступа к секретам приложения и потребителей нужно заполнить нижеследующие параметры:
# Для каждой интеграции адрес секрета 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-module.ose.secman.kv.psql-cred.basepath=
grdl-module.ose.secman.pki.ingress.basepath=
grdl-module.ose.secman.pki.ingress.common_name=
grdl-module.ose.secman.kv.ingress.add-old-ca-chain=
grdl-module.ose.secman.kv.ingress.old-ca-chain.basepath=
grdl-module.ose.secman.kv.ingress.old-ca-chain.secret_name=
grdl-module.ose.secman.kv.ingress.old-ca-chain.secret_path=
grdl-module.ose.secman.kv.ingress.basepath=
grdl-module.ose.secman.pki.ott.basepath=
grdl-module.ose.secman.pki.ott.common_name=
grdl-module.ose.secman.kv.ott.add-old-ca-chain=
grdl-module.ose.secman.kv.ott.old-ca-chain.basepath=
grdl-module.ose.secman.kv.ott.old-ca-chain.secret_name=
grdl-module.ose.secman.kv.ott.old-ca-chain.secret_path=
grdl-module.ose.secman.kv.ott.basepath=
grdl-module.ose.secman.kv.ott.secret_name=
grdl-module.ose.secman.pki.audit.basepath=
grdl-module.ose.secman.pki.audit.common_name=
grdl-module.ose.secman.kv.audit.basepath=
grdl-module.ose.secman.kv.audit.secret_name=
grdl-module.ose.secman.pki.to_console.basepath=
grdl-module.ose.secman.pki.to_console.common_name=
grdl-module.ose.secman.kv.to_console.basepath=
grdl-module.ose.secman.kv.to_console.secret_name=
grdl-module.ose.secman.pki.logger.basepath=
grdl-module.ose.secman.pki.logger.common_name=
grdl-module.ose.secman.kv.logger.basepath=
grdl-module.ose.secman.kv.logger.secret_name=
grdl-module.ose.secman.pki.psql-eg.basepath=
grdl-module.ose.secman.pki.psql-eg.common_name=
grdl-module.ose.secman.kv.psql-eg.basepath=
grdl-module.ose.secman.pki.kafka.basepath=
grdl-module.ose.secman.pki.kafka.common_name=
grdl-module.ose.secman.kv.kafka.basepath=
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}]grdl-module.conf:#Имя приложения. Изменять не требуется. application-module.name=grdl-module #Автоматическое формирование FQDN. Изменять не требуется. grdl-module.ose.istio.ingress.route.spec.host.http.appFQDN={{ lookup('custom_vars', 'application-module.name') }}-{{ lookup('custom_vars', 'distrib.release.version') }}.{{ global.multiClusters.openshiftNewRoute }} grdl-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 при старте grdl-module.console.url=http://{{ lookup('custom_vars', 'grdl-console.ose.istio.ingress.route.spec.host.http.appFQDN') }}/ #Параметры логирования grdl-module.log.root.level=info grdl-module.logger.root.level=INFO grdl-module.logger.org.springframework.level=INFO grdl-module.logger.org.springframework.web.level=INFO grdl-module.logger.ru.gradely.level=INFO grdl-module.label= #Rate limiter #Включение Rate limiter grdl-module.rate-limiter-enabled=false #Префикс метрик grdl-module.rate-limiter-metric-prefix=grdl_module grdl-module.rate-limiter-buckets=[{"uri":"/general","maxTokens":1000,"refillIntervalSec":1}]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}
Шаг 8. Проверьте и подготовьте параметры k8s в namespace#
Для этого создайте imagePullSecret:
kind: Secret
apiVersion: v1
metadata:
name: ${grdl.ose.deployment.spec.template.spec.imagePullSecrets.name}'
data:
.dockerconfigjson: >-
"Строка подключения к docker registry в base64"
type: kubernetes.io/dockerconfigjson
Шаг 9. Удалите устаревшие ресурсы Kubernetes/OpenShift#
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
Шаг 10. Произведите полную установку GraDeLy инструментом CDJE#
При выполненных предыдущих пунктах файлы сценария миграции, обновления БД повторно можно не выполнять.
Полный список файлов сценария для установки:
MIGRATION_FP_CONF;
FP_CONF_CHECK;
DB_UPDATE;
OPENSHIFT_DEPLOY;
OPENSHIFT_INGRESS_EGRESS_DEPLOY.
Шаг 11. Убедиться, что в БД источника создаются публикации для выбора реплицируемых таблиц.#
Зайдите в клиентский терминал psql, в БД источника и создайте публикацию: create PUBLICATION {имя_публикации} FOR ALL TABLES;, чтобы реплицировать все таблицы или create PUBLICATION {имя_публикации} FOR TABLE {имя_таблицы1}, {имя_таблицы2}...;для репликации отдельных таблиц.
Механизм публикации в PostgreSQL позволяет выбирать таблицы для репликации. Выбрать таблицы также можно с помощью визуального редактора маппинга (подробнее в «Руководстве пользователя интерфейса консоли управления», однако для лучшей производительности, рекомендуется использовать механизм публикаций.
Шаг 12. Создайте вспомогательную таблицу в БД приемника для старта с GraDeLyID и репликации из нескольких источников в один приемник (опционально).#
Разверните в БД получателя архив воркера package/db/db_archive_receiver.zip для запуска на БД получателя.
Архив консоли package/db/db_archive_console.zip разворачивается на БД конфигураций по умолчанию.
Для этого в параметрах в репозитории с конфигурацией стенда, параметры ${стенд}/parameters/common.conf.yml установите переключатель «YES» для триггера на дополнительные таблицы на БД получателя.
Шаг 13. Включите КВР, контроль второй рукой.#
Для этого в параметрах в репозитории с конфигурацией консоли /grdl-console-config.yaml добавьте строку: grdl-task-control-enable: "${grdlTaskControlEnable}".
Параметр
task_control enable:trueзадается один раз при развертывании приложения. По умолчанию значение параметра false, то есть КВР отключен.Если приложение уже развернуто и при развертывании было задано значение false, чтобы включить контроль второй рукой, нужно повторно развернуть приложение.
Шаг 14. Настройте секреты в системе управления секретами HashiCorp Vault/Secret Management System.#
Воспользуйтесь Руководством администратора.
Шаг 15. Назначьте роли в СУДИР#
Проведите интеграцию с СУДИР в соответствии с документацией СУДИР и назначьте роль PROJECT_CREATOR.
Шаг 16. Создайте новый проект#
Создайте проект под ролью PROJECT_CREATOR.
Шаг 17. Определите максимальную производительность#
Определите максимальную производительность.
Определение максимальной нагрузки
Для определения максимальной нагрузки, которую следует задать с помощью механизма Rate Limiter, проведите тест определения максимальной производительности.
Нагрузка должна быть ограничена с помощью механизма Rate Limiter на уровне, не превышающем показатели теста максимальной производительности.
Сценарий тестирования
При тестировании происходит пошаговое увеличение нагрузки с нуля до предельной (с шагом 20% от плановой). Пошаговое увеличение происходит до тех пор, пока не нарушится критерий успешности по количеству ошибок и/или времени отклика (что наступит раньше). Время работы теста на каждом шаге после стабилизации нагрузки составляет 10 минут.
Цель тестирования
По результатам тестирования устанавливается:
уровень нагрузки L0 — последний шаг нагрузки, на котором не были нарушены критерии успешности;
уровень нагрузки Llim — предельный уровень нагрузки, при котором не был нарушен критерий по количеству ошибок;
уровень утилизации CPUlim — утилизация CPU на уровне нагрузки Llim.
Ожидаемый результат
Определен уровень максимальной производительности. L0 удовлетворяет одному из следующих уровней нагрузки (при использовании ресурсов всеми подами не больше, чем на OSE):
Lmax для предыдущего релиза;
Запросите аналитическую оценку команды по плановой нагрузке на сервис на год вперед, если не достигнут Lmax (при суммарных ресурсах как на OSE);
Используйте критерий 10х от промышленной нагрузки на сервис, если не достигнута плановая нагрузка на год вперед.
Определен уровень нагрузки Llim.
Определен уровень утилизации CPUlim.
Шаг 18. Настройте механизм для ограничения входящих запросов Rate Limiter#
Настройте механизм для ограничения входящих запросов 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 представлял из себя одну строку без пробелов.
Настройка интеграции#
Интеграция с компонентом граничного прокси (IGEG)#
Интеграция с граничным прокси настраивается Администратором стенда в ${стенд}/multiClusters.json
Убедитесь, что в конфигурации ConfigMap grdl.istio.all.conf установлен параметр: grdl.ose.deployment.spec.template.annotations.istio.inject=true и эта аннотация применена в Deployment для console, module, console-ui.
Интеграция с сервисом сбора, обработки и записи данных в каналы вывода (COTE)#
Интеграция с Аудитом настраивается Администратором стенда в файле ${стенд}/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
Интеграция с компонентом IAM Proxy (AUTH)#
Пример 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/
Интеграция с СУДИР#
GraDeLy интегрируется с СУДИР через SCIM. Путь: <url_gradely>/scim/.
При интеграции из репозитория GraDeLy в СУДИР подгружается ролевая модель. В дальнейшем заданные роли назначаются пользователям в СУДИР в соответствии с документацией СУДИР.
Перечень пользователей и назначенных им ролей синхронизируется с репозиторием GraDeLy по инициативе СУДИР в соответствии с документацией СУДИР.
Интеграция с компонентом Журналирование (LOGA)#
Пример 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}
Интеграция с компонентом Объединенный мониторинг Unimon (MONA)#
Для интеграции с компонентом MONA требуется предварительная настройка стенда администраторами.
Параметры берутся из настроек стенда.
Интеграция с компонентом Platform V Pangolin DB (PSQL)#
Пример 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 ГБ.
Интеграция с компонентом Corax (KFKA)#
Для интеграции с компонентом KFKA требуется предварительная настройка стенда Администраторами.
Параметры берутся из настроек стенда.
Интеграция с компонентом OTTS#
Настройка интеграции производится на подах 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)
Интеграция с HashiCorp Vault (SecMan)#
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).
Подготовьте конфигурации для модуля во вкладке Конфигурации (настройте маппинг и фильтрацию) и примените их к соответствующим модулям в графе.
Предустановленные конфигурации#
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
grdl-module.conf :
#Управление приоритетом компонентов
grdl-module.ose.deployment.spec.template.spec.priorityClassName=
# Параметр добавляющий аргументы запуска приложения через jvm переменную JAVA_OPTS. Будут помещены в конфигмап someFpName1. conf;
grdl-module.ose.configmap.javaArguments=-XX:+UseContainerSupport -XX:InitialRAMPercentage=40.0 -XX:MaxRAMPercentage=80.0 -XX:+UseSerialGC
# количество реплик
grdl-module.ose.deployment.spec.replicas=2
#Количество экземпляров сервисов, обслуживающих текущие запросы, при выполнении последовательного обновления
grdl-module.ose.deployment.spec.strategy.rollingUpdate.maxSurge=25%
grdl-module.ose.deployment.spec.strategy.rollingUpdate.maxUnavailable=0
grdl-module.ose.deployment.spec.template.spec.containers.grdl-module.resources.limits.cpu=2000m
grdl-module.ose.deployment.spec.template.spec.containers.grdl-module.resources.limits.memory=4000Mi
grdl-module.ose.deployment.spec.template.spec.containers.grdl-module.resources.limits.ephemeral-storage={{ lookup('custom_vars', 'global.ose.deployment.spec.template.spec.containers.resources.limits.ephemeral-storage', default='500Mi') }}
grdl-module.ose.deployment.spec.template.spec.containers.grdl-module.resources.requests.cpu=2000m
grdl-module.ose.deployment.spec.template.spec.containers.grdl-module.resources.requests.memory=4000Mi
grdl-module.ose.kafka.port=9093
grdl-module.kafka.message-format=PARSED
grdl-module.label=
grdl-module.hot-reload-enable=true
grdl-module.hot-reload-poll-interval=5000
grdl-module.hot-reload-retry-count=10
grdl-module.hot-reload-fail-safe-enable=true
grdl-module.hot-reload-dir-postgres=/vault/secrets/databases
grdl-module.capture-cache-size=12000
grdl-module.apply-cache-size=15
grdl-module.kafka-consumer-queue-size=12000
grdl-module.ose.deployment.spec.template.spec.containers.resources.limits.cpu=1000m
grdl-module.ose.deployment.spec.template.spec.containers.resources.limits.memory=200Mi
grdl-module.ose.deployment.spec.template.spec.containers.resources.requests.cpu=1000m
grdl-module.ose.deployment.spec.template.spec.containers.resources.requests.memory=200Mi
grdl-module.ose.deployment.spec.template.spec.containers.egress.resources.limits.cpu=400m
grdl-module.ose.deployment.spec.template.spec.containers.egress.resources.limits.memory=200Mi
grdl-module.ose.deployment.spec.template.spec.containers.egress.resources.requests.cpu=400m
grdl-module.ose.deployment.spec.template.spec.containers.egress.resources.requests.memory=200Mi
grdl-module.ose.deployment.spec.template.spec.containers.ingress.resources.limits.cpu=200m
grdl-module.ose.deployment.spec.template.spec.containers.ingress.resources.limits.memory=200Mi
grdl-module.ose.deployment.spec.template.spec.containers.ingress.resources.requests.cpu=200m
grdl-module.ose.deployment.spec.template.spec.containers.ingress.resources.requests.memory=200Mi
grdl-module.ose.deployment.spec.template.spec.containers.grdl-module.livenessProbe.failureThreshold=3
grdl-module.ose.deployment.spec.template.spec.containers.grdl-module.readinessProbe.failureThreshold=3
grdl-module.feature.SelfAntiAffinity.enabled=false
# Rate limiter
grdl-module.rate-limiter-buckets=[{"uri":"/general","maxTokens":1000,"refillIntervalSec":1}]
#Список БД находящихся на том же ЦОД что и воркер
grdl-module.db.urls=["fqdn1","fqdn2"]