Установка#

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  18. Настройте механизм для ограничения входящих запросов 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.conf

       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
    
  • параметры ${стенд}/parameters/common.conf.yml

        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
    
  • параметры ${стенд}/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

        global.platform.grdl.ott.module.id - Имя модуля, указанное в поле CN запроса и сертификата клиента ОТТ
        global.platform.grdl.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
    

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

Параметр

Тип

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

Описание

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 представлял из себя одну строку без пробелов.

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

Интеграция с компонентом граничного прокси (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.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/
    

Интеграция с СУДИР#

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#

  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. Подготовьте конфигурации для модуля во вкладке Конфигурации (настройте маппинг и фильтрацию) и примените их к соответствующим модулям в графе.

Предустановленные конфигурации#

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"]