Установка#

Состав дистрибутива#

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. Ролевая модель не настраивается.

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

  1. Создайте пользователя (роль) и схему gdl в БД модуля управления и выдайте ему необходимые права).

  2. Создайте tablespace grdl_ts_data и grdl_ts_idx.

  3. Создайте пользователя (роль) в БД источника и приемника для выполнения репликации и выдайте ему необходимые права.

  4. Проверьте и подготовьте параметры в common репозитории стенда для консоли.

  5. Проверьте и подготовьте параметры в common репозитории стенда.

  6. Выполните развертывание объектов базы данных (playbook DB_UPDATE).

  7. Используя средства Pipeline, выполните миграцию конфигурационных файлов GraDeLy на узел.

  8. Внесите в конфигурационные файлы GraDeLy на узле необходимые изменения.

  9. Проверьте и подготовьте параметры k8s в namespace.

  10. Удалите устаревшие ресурсы Kubernetes/OpenShift.

  11. Произведите полную установку GraDeLy инструментом CDJE.

  12. Рекомендуется убедиться, что в БД источника создаются публикации для выбора реплицируемых таблиц.

  13. Создайте вспомогательную таблицу в БД приемника для старта с GraDeLyID.

  14. Включите КВР, контроль второй рукой (опционально).

  15. Настройте секреты в системе управления секретами HashiCorp Vault/Secret Management System.

  16. Назначьте роль PROJECT_CREATOR в СУДИР.

  17. Создайте проект под ролью PROJECT_CREATOR.

  18. Определите максимальную производительность.

  19. Настройте механизм для ограничения входящих запросов Rate Limiter

  20. Настройте интеграция с компонентом IGEG

  21. Настройте интеграция с компонентом COTE.

  22. Настройте интеграция с компонентом AUTH.

  23. Настройте интеграция с СУДИР.

  24. Настройте интеграция с компонентом LOGA.

  25. Настройте интеграция с компонентом MONA.

  26. Настройте интеграция с компонентом PSQL.

  27. Настройте интеграция с компонентом KFKA.

  28. Настройте интеграция с компонентом OTTS.

  29. Настройте интеграция с SecMan.

  30. Предустановите конфигурацию.

Шаг 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.conf

      global.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.conf

        global.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/globalInventory

      rplw_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 консоли или воркера:

Параметр

Тип

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

Описание

grdl-console.rate-limiter-enabled

boolean

true

Включает и выключает Rate Limiter для консоли

grdl-console.rate-limiter-metric-prefix

string

grdl_console

Приставка для имени метрики, которая показывает, сколько запросов прошли через Rate Limiter на консоли.
Например, при значении по умолчанию полное название метрики будет: grdl_console.rate_limiter.requests

grdl-console.rate-limiter-buckets

json

[{"uri":"/general", "maxTokens":1000, "refillIntervalSec":1}]}

Конфигурация Rate Limiter для каждого endpoint консоли

grdl-module.rate-limiter-enabled

boolean

false

Включает и выключает Rate Limiter для воркера

grdl-module.rate-limiter-metric-prefix

string

grdl_module

Приставка для имени метрики, которая показывает, сколько запросов прошли через Rate Limiter на воркере.
Например, при значении по-умолчанию полное название метрики будет: grdl_module.rate_limiter.requests

grdl- module.rate-limiter-buckets

json

[{"uri":"/general", "maxTokens":1000, "refillIntervalSec":1}]}

Конфигурация 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.ingresspath
    
  • 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/
    

Проверка результата#

Интеграция с 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#

  1. Подготовьте конфигурационный файл postgresql.conf БД источника, выставите необходимые параметры:

    • Установите расширенное журналирование с помощью параметра wal_level = logical.

    • Установите необходимое максимальное количество слотов репликации с помощью параметра max_replication_slots = 1 (один слот на потребителя).

    • Установите необходимое количество одновременно работающих процессов передачи WAL с помощью параметра max_wal_senders = 1 (один процесс на каждый слот).

  2. Создайте пользователя (роль) и схему 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 для бессрочного пароля.

  3. Создайте 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 (папка должна существовать на момент создания табличного пространства).

  4. Создайте пользователя (роль) в БД источника и приемника для выполнения репликации и выдайте ему необходимые права:

    • Роль для БД источника:

          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} именами схем потребителей репликации (схемы можно перечислить через запятую);

    • выдача дополнительных прав репликатору на объекты источника не требуется.

    Для настройки двунаправленной репликации выдайте дополнительные права на публикацию логических слотов.

  5. Создайте в клиентском терминале psql в БД источника публикацию и слот репликации:

    CREATE PUBLICATION {имя_публикации} FOR ALL TABLES;
    SELECT * FROM pg_create_logical_replication_slot('{имя слота}', 'pgoutput');
    
  6. Создайте новое соединение и настройте параметры соединений с БД, Kafka или файловым хранилищем на вкладке Соединения.

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

                name:         Человекочитаемое имя
                type:         Из списка [DB, QUEUE]
                driver:       Используемый драйвер
                url:          Строка соединения
                credentials:  Информация для идентификации пользователя
                    user:
                    password:
    
    1. Наполнение соединения Source:

      • В таблице источника пропишите и запустите select * from pg_get_replication_slots();

      • найдите свободный слот, т.е. тот, где статус столбца active равен false (отсутствует галочка);

      • добавьте следующий JSON в опции создаваемого соединения в UI:

        {
        "slot": "{имя слота}",
        "publication_names": "{имя_публикации}",
        }
        
      • пропишите имя свободного слота на месте Слот;

      • пропишите название необходимой публикации;

      • пропишите адрес БД источника в поле URL;

      • пропишите логин и пароль пользователя с правами на запись в базу в полях Пользователь и Пароль;

      • укажите «База данных» в поле Тип.

    2. Наполнение соединения Target:

      • Пропишите адрес БД приемника в поле URL;

      • пропишите логин и пароль пользователя с правами на запись в базу в полях Пользователь и Пароль;

      • укажите «База данных» в поле Тип.

  7. Разверните два воркера в рекомендуемой среде контейнеризации.

  8. Убедитесь, что воркеры появились во вкладке Воркеры в статусе Ready, а Process_id отсутствует.

  9. Создайте граф репликации: DB Source Connection (Source) → Capture Module (Capture) → Kafka Connection (Queue) → Apply Module (Apply) → DB Target Connection (Target).

  10. Подготовьте конфигурации для модуля во вкладке Конфигурации (настройте маппинг и фильтрацию) и примените их к соответствующим модулям в графе.

Проверка результата#

Интеграция с 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

Проверка результата#

Конфигурации предустановлены