Руководство по установке#

В руководстве приведены инструкции по установке Продукта.

Системные требования#

Настройки безопасности окружения и перечень платформенных (дополнительных внешних) продуктов, используемых для установки, настройки и контроля в конечной информационной системе (далее — ИС), выбираются клиентом при разработке конечной ИС, исходя из характера обрабатываемой в ней информации и иных требований информационной безопасности (далее — ИБ), предъявляемых к ней.

Предусловия#

Системное программное обеспечение#

Ниже представлены категории системного программного обеспечения (далее — ПО), которые обязательны или опциональны для установки, настройки, контроля и функционирования компонента. В каждой категории перечислены все поддерживаемые продукты сторонних правообладателей. Отдельно обозначены варианты, которые рекомендует АО «СберТех» (маркировка «Рекомендовано» в столбце «Продукт, функциональная совместимость с которым подтверждена»). Клиенту необходимо выбрать один из продуктов в каждой категории, исходя из условий использования конечной ИС.

Категория ПО

Обязательность установки*

Наименование ПО

Версия

Продукт, функциональная совместимость с которым подтверждена **

Назначение категории ПО

Операционная система

Да

ОС Альт 8 СП

10.0

Рекомендовано

ОС контейнеров для запуска модулей компонента

Среда контейнеризации

Да

Kubernetes

1.0

Рекомендовано

Платформа контейнеризации для запуска компонентов сервиса

Red Hat OpenShift

4.0 и выше

Опционально

Средство контейнеризации

Да

Docker CE

1.23 и выше

Рекомендовано

Инструмент для автоматизации работы с контейнерами

Инструмент сборки, тестирования, развертывания контейнеризированных приложений

Да

Jenkins

2.263.x и выше

Рекомендовано

Сервер автоматизации, используемый для внедрения непрерывной интеграции и непрерывной доставки (CI/CD) для проектов программного обеспечения

Java-машина

Да

OpenJDK

8

Рекомендовано

Окружение для работы модулей компонента

Система управления базами данных (СУБД)

Да

PostgreSQL

42.2.5

Рекомендовано. Правообладателем АО «СберТех» также рекомендована СУБД, основанная на PostgreSQL, – Platform V Pangolin SE, см. раздел «Платформенные зависимости»

ПО, взаимодействующее с конечными пользователями, приложениями и базой данных для сбора и анализа данных

Сервер приложений

Да

WildFly

15.0.1.Finalе

Рекомендовано

СПО для тестирования, отладки и исполнения веб-приложений на основе Java

Сервис ограничения входящих запросов

Да

Synapse Rate Limiter

1.7

Рекомендовано

Сервис, позволяющий ограничивать доступ к приложениям на основе задаваемых лимитов

Сервис централизованного хранения репозиториев исходного кода

Да

GitLab Community Edition

15.0

Рекомендовано

Хранение конфигураций при автоматизированной установке

Система управления секретами

Нет

Secret Management System

1.7.0

Рекомендовано

Система управления аутентификационными данными сервисных аккаунтов или учетных записей

Сервис интеграции и оркестрации микросервисов в облаке

Да

Istio

1.12 и выше

Рекомендовано. Правообладателем АО «СберТех» также рекомендован сервис интеграции и оркестрации микросервисов в облаке, основанный на Istio, Platform V Synapse Service Mesh, см. раздел «Платформенные зависимости»

Сервис интеграции микросервисов в облаке

Система мониторинга (сбор и хранение метрик)

Нет

Prometheus

2.31 и выше

Рекомендовано. Правообладателем АО «СберТех» также рекомендован Сервис для сбора прикладных и инфраструктурных метрик и отправки их в целевую систему хранения – Объединенный мониторинг Unimon Platform V Monitor, см. раздел «Платформенные зависимости»

Система для сбора и хранения численных метрик

Программа для обновления базы данных

Да

Liquibase

4.5.0 и выше

Рекомендовано

Библиотека для отслеживания, управления и применения изменений схемы базы данных

Сервис централизованного хранения репозиториев артефактов (хранилище артефактов)

Да

Nexus-Public

2.14 и выше

Рекомендовано

Интегрированная платформа для проксирования, хранения и управления зависимостями Java (Maven), образами, а также распространения ПО

Подсистема для управления и оркестрации процессов ценообразования

Да

Цифровая Цена

2.x и выше

Рекомендовано

Подсистема для управления и оркестрации процессов ценообразования

Примечание:

*

  • Да — категория ПО обязательна для функционирования сервиса (это означает, что сервис не может выполнять свои основные функции без установки данной категории ПО).

  • Нет — категория ПО необязательна для функционирования сервиса (это означает, что сервис может выполнять свои основные функции без установки данной категории ПО).

**

  • Рекомендовано — рекомендованный правообладателем АО «СберТех» продукт.

  • Опционально — альтернативный по отношению к рекомендованному правообладателем АО «СберТех» продукт.

Дополнительные условия#

При установке Продукта должны также соблюдаться следующие условия:

  • в проекте среды контейнеризации присутствует секрет для доступа к приватному хранилищу контейнеров (docker-regestry);

  • в проекте среды контейнеризации присутствует сервисный аккаунт (Service Account) и созданы роли для разворачивания в namespaces (project) приложения (типовые роли Deploy или Jenkins CD);

  • jenkins с заведенными секретами для доступа к GitLab CE, Хранилищу артефактов и Docker-хранилища;

  • имеется база данных продукта, а также пользователь и пароль к ней. Также необходим пользователь-владелец схемы, через него запускается обновление БД. Предполагается, что все действия по инициализации схемы данных пользователя были сделаны заранее;

  • имеется доступ на чтение к базе данных справочников (ЕКПиТ), а также пользователь и пароль к ней. Предполагается, что все действия по инициализации схемы данных пользователя были сделаны заранее, а таблицы в БД не являются пустыми;

  • установлен инструмент Ansible;

  • для продукта выделены области в Среде контейнеризации.

Платформенные зависимости#

Для настройки, контроля и функционирования компонента реализована интеграция с программными продуктами, правообладателем которых является АО «СберТех»:

Наименование продукта

Код

Версия продукта

Код и наименование компонента

Обязательность установки (да/нет)***

Описание

Аналог других производителей****

Platform V Backend

#BD

4.3.0

OTTS OTTS One-Time Password (OTP) / OTT

Нет

Сервис для аутентификации и авторизации межсервисных взаимодействий

Platform V Backend

#BD

4.3.0

APLJ Прикладной журнал

Нет

Сервис для обеспечения отказоустойчивости приложения на уровне базы данных

Platform V Audit SE SE

AUD

2.3

AUDT Аудит

Нет

Сервис для аудирования событий

Platform V Monitor

OPM

4.1

MONA Объединенный мониторинг Unimon

Нет

Сервис для сбора прикладных и инфраструктурных метрик и отправки их в целевую систему хранения

Prometheus

LOGA Журналирование

Нет

Сервис для хранения лог-файлов

Platform V DevOps Tools

DOT

1.2

CDJE Deploy tools

Нет

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

Ручная установка

Platform V Synapse Service Mesh

SSM

2.10

JOUA Агент журналирования

Нет

Сервис для сбора и хранения логов

IGEG Граничный прокси

Да

Сервис для контроля и фильтрации трафика извне

Istio

SVPX Сервисный прокси

Да

Сервис для маршрутизации и обеспечения безопасности трафика между приложениями

Istio

Platform V Pangolin SE

PSQ

5.1.0

PSQL Platform V Pangolin

Да

Cистема управления базами данных, основанная на свободно распространяемой версии PostgreSQL

PostgreSQL

Platform V Exchange Rates

CRT

22.5

CRTX Курсы валют

Нет

Сервис для импорта курсов валют и котировок из мастер-систем клиента

Примечание:

***

  • Да — компонент или продукт необходим для функционирования сервиса (это означает, что сервис не может выполнять свои основные функции без установки данного компонента).

  • Нет — необязательный для функционирования сервиса компонент или продукт (это означает, что сервис может выполнять свои основные функции без установки данного компонента).

**** Рекомендуется установка программного продукта, правообладателем которого является АО «СберТех», при этом не исключена возможность (допускается правообладателем) использования аналога других производителей. Аналоги, в отношении которых продукт успешно прошел испытания и подтвердил свою работоспособность, указаны в разделе «Системное программное обеспечение».

Аппаратные требования#

Для пространства Среды контейнеризации необходим проект с характеристиками 24 CPU и 32 GB memory.

Дополнительные требования#

Перед установкой Platform V Dynamic Decisions четвертого поколения проверьте, что ранее было установлено ПО Platform V Dynamic Decisions третьего поколения.

Подготовка дистрибутива#

Дистрибутив представляет собой zip-файл опубликованный в хранилище. Дистрибутив содержит разделенный целевой дистрибутив Party-distrib.zip. Включает набор библиотек и зависимостей распространяющихся свободно.

Owned-distrib.zip – содержит основной код продукта. В party-distrib в папке Jenkins расположена job ReCreateFullDistrib.groovy. Ее необходимо развернуть, опубликовать в GitLab CE.

На рисунке представлены необходимые параметры для сборки.

  1. При первом запуске нажмите на кнопку Собрать. В результате будет создан интерфейс для job. Реализована возможность корректировки job под свое окружение. Для этого в разделе parametrs задайте типовые настройки окружения (ссылка на docker registry, имя секрета в jeknis для доступа в registry).

parameters {
        // metadata
        string(name: 'RELEASE_VERSION',description: 'version')
        //docker
        choice(name: 'DOCKER_REGISTRY_URL',description:'Host Regestry by upload and base docker image',
                choices: [
                    'docker-dev.registry-ci.xxxxx.mycompany.ru',
                    'docker-release.registry-ci.xxxxx.mycompany.ru',
                    'registry.xxxxx.yyy.ru',
                    'xxx.sw.sbc.space'
                ]
        )
        choice(name: 'BASE_IMAGE',
               choices: [
                   'registry-ci.xxxxx.mycompany.ru/base/redhat.io/openjdk/openjdk-11-rhel8:1.0-8',
                   'registry.xxxxx.yyy.ru/base/redhat/openjdk/openjdk-11-rhel8:1.0-8',
                   'xxx.sw.sbc.space/sbt_dev/ci90000087_asgtmq_dev/alt-sp8/openjdk-11:v0.1'
                        ],
               description: 'Choose base image')
        string(name: 'DOCKER_CREDENTIAL_ID', description: 'nexus credentials id by upload party and owner distrib', defaultValue: 'CAB-SA-DVO00330_pass')
        choice(name: 'DOCKER_REGISTRY_PATH',
               choices:[
                   "ci00859819/ci02633323",
                   "docker-release/pprb/ci00859819/ci00859822_pprb-pricing",
                   "pprb/ci00859819/ci00859822_pprb-pricing",
                   "pprb-dev/ci00859819/ci00859822_pprb-pricing_dev",
                   "pprb/ci00859819/ci00859822_pprb-pricing",
                   "sbt_dev/ci90000071_dypx_dev",
                   "sbt/ci90000071_dypx"
               ],
               description: 'regestry path docker' )
        //nexus
        choice(name: 'NEXUS_URL',
               choices:[
                   "https://mycompany-nexus.xxxxx.mycompany.ru/nexus/content/repositories/Nexus_PROD",
                   "https://xxx.sw.sbc.space/nexus-cd/repository/sbt_PROD",
                   "https://sbtnexus.xxxxx.yyy.ru",
                   "https://mycompany-nexus.maindomain.mycompany.ru"
               ],
               description: "" )
        choice(name: 'NEXUS_REPO_ID',
               choices:[
                   "Nexus_PROD",
                   "Nexus_PROD_OUT",
                   "sbt_PROD",
                   "SERVICE_PACKAGE_snapshot"

               ]
        )
        string(name: 'NEXUS_ARTIFACT_ID', description: 'ArtifactId ex: CI00859822_PPRB_ExchangeRates', defaultValue: 'CI02633323_PPRB_DP_CLOUD')
        string(name: 'NEXUS_CREDENTIAL_ID',description: 'You Nexus Credentialid', defaultValue: 'CAB-SA-DVO00330_pass')
        string(name: 'MAVEN_JENKINS_SETTINGS_XML', defaultValue: "95638388-5179-457e-b055-51a67aeda86d", description: "settings xml by upload distrib" )
        choice(name: 'NEXUS_GROUP_ID',
               choices:[
                   "Nexus_PROD",
                   "sbt_PROD.CI90000071_dypx.4g",
                   "---"

               ]
        )
        // distrib
        string(name: 'FULL_DISTR_URL', description: 'Nexus url by full distrib')

        booleanParam( defaultValue: true,description: 'NO_UPLOAD_NEXUS',name: 'NO_UPLOAD_NEXUS')
        booleanParam( defaultValue: true, description:'Использовать для проверок в отсутвии дистрибутива party и owner', name: 'USE_EXTRACT')
        booleanParam( defaultValue: true, description:'Использовать для проверок в отсутвии дистрибутива party и owner', name: 'NO_UPLOAD_EXTRACT_DISTR')

    }

  1. Задайте метку Jenkins agenta, который существует в вашем окружении.

  2. Заведите конфигурационный файл Settings.xml для maven.

  3. В job передайте ссылки на текущий дистрибутив.

  4. Выполните сборку.

Установка#

Существует два способа установки Продукта Platform V Dynamic Decisions:

  1. Целевой (основной) способ с помощью ручной установки.

  2. Опциональный вариант с помощью компонента Deploy tools (CDJE) Продукта Platform V DevOps Tools.

Ручная установка#

Текущий тип установки является целевым (основным) вариантом установки. Для ручной установки:

  1. Скачайте дистрибутив на персональный компьютер.

  2. Разархивируйте дистрибутив.

  3. Подготовьте директорию:

  • Подготовьте yaml манифесты с секретами. Добавьте к именам секретов окончание .unver.

  • Создайте yaml манифест c именем secret-dypx.unver и поместите все параметры для _password.conf в него.

Пример

kind: Secret
apiVersion: v1
metadata:
  name: secret-dypx.unver
type: Opaque
data:
  DB_PRICING_MAIN_LOGIN: <base64 enc >
  DB_PRICING_MAIN_PASSWORD:  <base64 enc >
  # База данных СR SI
  DB_PRICING_STANDIN_LOGIN:  <base64 enc >
  DB_PRICING_STANDIN_PASSWORD:  <base64 enc >
  #
  DB_EKPIT_MAIN_LOGIN:  <base64 enc >
  DB_EKPIT_MAIN_PASSWORD:  <base64 enc >
  DB_EKPIT_STANDIN_LOGIN:  <base64 enc >
  DB_EKPIT_STANDIN_PASSWORD:  <base64 enc >
  #
  MESSENGER_KAFKA_SSL_KEY_STORE_PASSWORD:  <base64 enc >
  MESSENGER_KAFKA_SSL_TRUST_STORE_PASSWORD:  <base64 enc >
  # пароль от закрытого ключа
  MESSENGER_KAFKA_SSL_PRIVATE_KEY_PASSWORD:  <base64 enc >
  #
  OTT_CERTSTORE_PWD:  <base64 enc >
  OTT_TRUST_STORE_PWD:  <base64 enc >
  # пароль от закрытого ключа
  OTT_CERTSTORE_PRIVATE_KEY_PWD:  <base64 enc >
  #
  AJ_KEYSTORE_PASSWORD:  <base64 enc >
  AJ_TRUSTORE_PASSWORD:  <base64 enc >
  # пароль от закртытого ключа
  AJ_KEY_PRIVATE_KEY_PASSWORD: <base64 enc >

  1. Установите все secret командой

kubectl apply -f <имя файла манифеста> -n <пространство имен для установки>
  1. В результате будут созданы все секреты из блока extra-secrets в distib.yaml и secret-dypx.unver.

  2. Шаблонизируйте в ручную yaml манифесты из дистрибутива.

  3. Перейдите в директорию package/conf/k8s/base. В текущей директории расположены поддиректории отвечающие за каждый сервис. В директории istio расположены манифесты для настройки сервисной сети.

Для того чтобы шаблонизировать манифесты в каждой поддиректории воспользуйтесь, любым инструментом, например ansible.

Пример ansible для шаблонизации:

--
- hosts: 127.0.0.1_
  connection: local
  tasks:
  — name: "template"
    ansible.builtin.template:
      src : package/conf/k8s/base/dypx-pricing-cloud-app/dc.yaml
      dest: ./<Директория для хранения итоговых манифестов>

  1. Далее вызовите playbook и передайте параметры соответствующему сервису:

ansible-playbook ./pipline.yaml --extra-vars "@package/conf/config/parameters/dypx-pricing-cloud-app.all.conf" --extra-vars @/package/conf/config/parameters/dypx-istio-sidecar.all.conf  --extra-vars @/package/conf/custom_property.conf
  1. В примере шаблонизируется сервис dypx-pricing-cloud-app и ему передаются параметры с соответствующим именем, а также дополнительные параметры которые общие для всех файлов.

  2. В дистрибутиве находиться файл custom_property.conf.yml в текущий файл можно добавить недостающие переменные, которые напрямую подтягиваться с common репозитория.

  3. Результат работы ansible-playbook.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dypx-pricing-cloud-app
labels:
  app: dypx-pricing-cloud-app
spec:
  progressDeadlineSeconds: 300
  replicas: 1
  revisionHistoryLimit: 1
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: "25%"
      maxUnavailable: "25%"
  selector:
    matchLabels:
      app: dypx-pricing-cloud-app
  template:
    metadata:
      labels:
        app: dypx-pricing-cloud-app
      annotations:
        sidecar.istio.io/inject: "True"
        sidecar.istio.io/rewriteAppHTTPProbers: "True"
    spec:
      restartPolicy: Always
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          — weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                — key: app
                  operator: In
                  values:
                  — dypx-pricing-cloud-app
              topologyKey: kubernetes.io/hostname
      containers:
      # app cb
        — resources:
            limits:
              cpu: "1"
              memory: "2Gi"
            requests:
              cpu: "1"
              memory: "2Gi"
          securityContext:
            readOnlyRootFilesystem: true
          readinessProbe:
            httpGet:
              path: /actuator/health/readiness
              port: 8081
              scheme: HTTP
            initialDelaySeconds: 160
            timeoutSeconds: 2
            periodSeconds: 10
            successThreshold: 1
            failureThreshold: 3
          livenessProbe:
            httpGet:
              path: /actuator/health/liveness
              port: 8081
              scheme: HTTP
            timeoutSeconds: 2
            periodSeconds: 10
            successThreshold: 1
            failureThreshold: 6
          startupProbe:
            failureThreshold: 50
            httpGet:
              path: /actuator/health/liveness
              port: 8081
              scheme: HTTP
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 2
          terminationMessagePath: /dev/termination-log
          name: dypx-pricing-cloud-app
          env:
            — name: PROJECT_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
            — name: NODE_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: spec.nodeName
            — name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
            — name: POD_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name
          ports:
            — containerPort: 8080
              protocol: TCP
            — containerPort: 8081
              protocol: TCP
          imagePullPolicy: Always
          volumeMounts:
            — { name: temp, mountPath: /tmp }
            — { name: applogs, mountPath: /tmp/logs }
            — { name: logback-config, readOnly: true, mountPath: /app/etc/logger }
            — { name: aj-secrets, readOnly: true, mountPath: /app/certs/aj }
            — { name: configmap-dp-app, readOnly: true, mountPath: /app/etc }
          envFrom:
            — configMapRef:
                name: dypx-cm-pricing-cloud-app
            — secretRef:
                name: secret-dypx.${distrib.release.version}
          image:  "test/test@###IMAGE###"
        # logger
      securityContext:
        runAsNonRoot: true
      imagePullSecrets:
        — name: "default"
      volumes:
        — { name: temp, emptyDir: {} }
        — { name: applogs, emptyDir: {} }
        — name: logback-config
          configMap:
            name: dypx-cm-pricing-cloud-app-logback
            defaultMode: 256
        — name: aj-secrets
          secret:
            secretName: secret-aj.${distrib.release.version}
            defaultMode: 256
            optional: true
        — name: configmap-dp-app
          configMap:
            name: dypx-cm-pricing-cloud-app
            defaultMode: 256
      dnsPolicy: ClusterFirst

  1. Далее проверьте этот манифест и замените строки содержащие ${}. Так как efc pipline поддерживает различные механизмы шаблонизации, то могут быть переменные типа .${distrib.release.version} которые не были заменены.

  2. Значение текущей переменной замените на unver, выполнив команду:

Kubectl apply -f <ваш обработаный. Манифест > -n <пространсвто имен в k8s>

Для успешного разворачивания любого сервиса разверните все манифесты в директории сервиса. Ручная установка завершена.

Подготовка к автоматизированному развертыванию#

Для подготовки к развертыванию продукта выполните следующие шаги:

  1. Создание секрета в jenkins для доступа в Среду контейнеризации.

  2. Создание задачи в jenkins по установке дистрибутива.

  3. Создание секрета.

  4. Создание файла _passwords.conf в репозитории common (См. пункт Разворачивание job компонента Deploy tools (CDJE) Продукта Platform V DevOps Tools.

  5. Создание файла зависимых параметров установки (См. пункт Разворачивание job компонента Deploy tools (CDJE) Продукта Platform V DevOps Tools.

Создание секрета в jenkins для доступа в Среду контейнеризации

Секрет для доступа к проекту Среды контейнеризации представляет собой секрет с типом «Service Account Tokens».

Поле ID − имя секрета.

Description − описание назначения секрета.

Token − токен сервис аккаунта jenkins из Среды контейнеризации.

Получение токена Получение токена выполняется при создании сервисного аккаунта

Для того чтобы создать сервисный аккаунт (в случае его отсутствия):

  1. Выполните команду.

kubectl create serviceaccount jenkins
  1. В результате получите ответ.

serviceaccount "jenkins" created
  1. Получите список секретов привязанных к сервисному аккаунту.

kubectl get serviceaccounts jenkins -o yaml
  1. В полученном ответе найдите имя секрета, который содержит токен формата: <имя сервисного аккаунта>-token-*.

  2. Выполните команду.

kubectl get secret <имя сервисного аккаунта>-token-*  -o yaml
  1. Пример ответа на вышеуказанную команду.

apiVersion: v1
data:
  ca.crt: (APISERVER'S CA BASE64 ENCODED)
------------
  token: (BEARER TOKEN BASE64 ENCODED)
kind: Secret
metadata:
  # ...
type: kubernetes.io/service-account-token

Значение поля токена необходимо декодировать из base64.

Установка с помощью компонента Deploy tools (CDJE) Продукта Platform V DevOps Tools#

Разворачивание job компонента Deploy tools (CDJE) Продукта Platform V DevOps Tools#

Пререквизиты для установки: Перед установкой убедитесь, что выполнены все следующие условия:

  1. Наличие у пользователя, производящего установку возможности создания репозиториев в GitLab CE, Nexus Public и получения прав на чтение/запись, включая права на чтение/запись в ветке master.

  2. Наличие технической учетной записи для работы с репозиториями.

  3. Должны быть созданы следующие репозитории GitLab CE в проектной области:

  • Репозитории pipeline, например:

    • dypx pipeline — репозиторий с кодовой базой релизов pipeline (на каждый стенд свой репозиторий, например dypx_pipeline_ift / dypx_pipeline_lt);

    • dypx_common — репозиторий с глобальными (одинаковыми для всех компонент в рамках одного стенда) переменными среды (на каждый стенд свой репозиторий, например dypx_common_ift / dypx_common_lt).

  • Репозитории с конфигурациями функциональных подсистем, например:

    • dypx_dypx (на каждый стенд свой репозиторий).

  1. Должны быть прописаны доступы в репозитории по протоколам SSH + HTTP на чтение/запись во все ветки, в т.ч. в ветку master.

  2. В Nexus Public должны быть размещены дистрибутивы разворачиваемых функциональных подсистем, к данным репозиториям должен быть доступ с правами на чтение для технической учетной записи.

  3. В Nexus Public должны быть созданы следующие репозитории, в которые загружены дистрибутивы всех компонентов pipeline (Installer.Base, Installer.Migration, Installer.Common):

  • AS_EFS_Installer.Base* — глобальные настройки и утилиты для pipeline;

    • AS_EFS_Installer.Migration — дистрибутив утилиты миграции;

    • AS_EFS_Installer.Common — базовый дистрибутив common — это глобальные параметры по умолчанию для pipeline. К перечисленным в данном пункте репозиториям должен быть доступ с правами на чтение для ТУЗ.

  1. В GitLab CE должны быть созданы репозитории, в которые загружены дистрибутивы всех компонентов pipeline.

Подготовка инструментов развертывания#

Предусмотрены следующие инструменты развертывания:

  • JOB Service — job обновления (первичная загрузка кода JOB Deploy на полигон, обновление кода JOB Deploy при выпуске новых релизов JOB Deploy);

  • JOB Deploy — job развертывания дистрибутивов.

Далее перейдите к созданию секретов и последующих параметров, касающихся сервиса.

Пример. Создание секрета входного шлюза

Секрет входного шлюза состоит из двух ресурсов типа secret. Создание ресурса выполняется с помощью утилиты командной строки − OC client с локальной машины.

Перед началом создания секретов получите следующие файлы:

  • приватный ключ;

  • серверный сертификат, подписанный удостоверяющим центром;

  • цепочка сертификатов.

Выпуск сертификата для создания секрета входного шлюза#

Выдача сертификатов осуществляется удостоверяющим центром.

Выполните следующие шаги:

  1. Создайте конфигурационный файл запроса на сертификат request.cnf.

   [ req ]
default_bits       = 2048
distinguished_name = req_distinguished_name
req_extensions     = req_ext
prompt = no

[ req_distinguished_name ]
countryName                 = RU
stateOrProvinceName         = MOW
localityName                = MOW
organizationName            = MYCOMPANY
commonName                  = pricing−rates.dev−apps.ocp−geo.maindomain.mycompany.ru

[ req_ext ]
subjectAltName = @alt_names

[alt_names]
DNS.1   = dynamic-pricing−https.<your_domen>
DNS.2   = dynamic-pricing−https <your_domen>
DNS.3   = dynamic-pricing−https.<your_domen>
DNS.4   = dynamic-pricing−ott.<your_domen>
DNS.5   = dynamic-pricing−ott<your_domen>
DNS.6   = dynamic-pricing−ott.<your_domen>

где в commonName указывается один из полных адресов хостов сервиса, или произвольная строка, в DNS.1, DNS.2 и далее, указываются полные имена хостов сервиса. Все адреса приведены в качестве примера и для реальной инсталляции могут отличаться.

Адреса задаются в параметрах, перечень которых приведен ниже. В сертификате должны быть указаны следующие адреса:

  • ${appFQDN_https}.${NAMESPACE_CDNS};

  • ${appFQDN_https_ott}.${NAMESPACE_CDNS};

  • ${appFQDN_all_in_on_ott}.${NAMESPACE_CDNS};

  • ${appFQDN_all_in_on_https}.${NAMESPACE_CDNS};

  • ${appFQDN_https}.${NAMESPACE_CDNS_GEO};

  • ${appFQDN_https_ott}.${NAMESPACE_CDNS_GEO};

  • ${appFQDN_all_in_on_ott}.${NAMESPACE_CDNS_GEO};

  • ${appFQDN_all_in_on_https}.${NAMESPACE_CDNS_GEO};

  • ${appFQDN_https}.${NAMESPACE_CDNS_SMART_GEO};

  • ${appFQDN_https_ott}.${NAMESPACE_CDNS_SMART_GEO};

  • ${appFQDN_all_in_on_ott}.${NAMESPACE_CDNS_SMART_GEO};

  • ${appFQDN_all_in_on_https}.${NAMESPACE_CDNS_SMART_GEO}.

Выше указан набор адресов одного кластера, существует возможность сделать общий сертификат на оба кластера:

request.csr.

openssl req −out request.csr −newkey rsa:2048 −nodes −keyout tls.key −config request.cnf
  1. Подпишите сертификат в вашем УЦ.

  2. Получите файл request.cer (подписанный сертификат в формате DER) и цепочку сертификатов, которым он подписан.

  3. Преобразуйте полученный сертификат в формат PEM.

    openssl x509 −inform DER −in request.cer −out tls.crt
    
  4. Преобразуйте полученный корневой сертификат в формат PEM.

    openssl x509 −inform DER −in "Test Root CA 2.cer" −out root.pem
    
  5. Преобразуйте полученный промежуточный сертификат в формат PEM.

    openssl x509 −inform DER −in "Test Issuing CA 2.cer" −out issuing.pem
    
  6. Объедините корневой и промежуточный сертификат в один файл.

    cat root.pem issuing.pem > ca.pem
    
  7. Получите три файла:

  • tls.key − приватный ключ;

  • tls.crt − серверный сертификат;

  • ca.pem − доверенная цепочка.

Создание секретов#

Дальнейшие действия проводятся в проекте, где у пользователя есть права на создание секретов. Сами файлы секретов хранятся в common репозитории в зашифрованном виде.

  1. Для создания секретов в Среде контейнеризации изучите файл distrib.yaml находящийся в дистрибутиве. Пример части файла с описанием секретов в файле distrib.yaml

# --------------------------------------------------
# Файл описывающий состав дистрибутива
# Secrets которые возьмутся из _passwords.conf (Common репозиторий)
secrets: [
  # База данных CR MAIN
  "PRICE_DB_LOGIN_MAIN",
  “PRICE_DB_PASSWORD_MAIN",
  # База данных СR SI
  "PRICE_DB_LOGIN_CI",
  “PRICE_DB_PASSWORD_CI",
  #
  "DB_EKPIT_MAIN_LOGIN",
  "DB_EKPIT_MAIN_PASSWORD",
  "DB_EKPIT_STANDIN_LOGIN",
  "DB_EKPIT_STANDIN_PASSWORD",
  #
  "OTT_CERTSTORE_PWD",
  "OTT_TRUST_STORE_PWD",
  # пароль от закрытого ключа
  "OTT_CERTSTORE_PRIVATE_KEY_PWD",
  #
  "AJ_KEYSTORE_PASSWORD",
  "AJ_TRUSTORE_PASSWORD",
  # пароль от закрытого ключа
  "AJ_KEY_PRIVATE_KEY_PASSWORD"
]

extra-secrets: [
  "secret-aj",
  "secret-ott-certs",
  "secret-ingress-certs",
  "secret-ingress-ca-certs",
  "secret-egress-certs",
  "secret-egress-ca-certs"
]
  1. В случае использование компонента Deploy tools (CDJE) Продукта Platform V DevOps Tools для установки, в репозитории common заполните файл _password.conf. Название параметров представлено в блоке secrets в файле distrib.yaml.

    Внимание! Помните, что название и количество параметров могут изменяться от релиза к релизу.

Имя параметра секрета

Значение

PRICE_DB_LOGIN_MAIN

Логин (имя пользователя), под которым продукт будет обращаться к базе данных приложения

PRICE_DB_PASSWORD_MAIN

Пароль пользователя, под которым продукт будет обращаться к базе данных приложения

PRICE_DB_PASSWORD_MAIN

Логин (имя пользователя), под которым продукт будет обращаться к базе данных приложения stand-in (в случае отсутствия базы stand-in указать значение dummy)

PRICE_DB_PASSWORD_MAIN

Пароль пользователя, под которым продукт будет обращаться к базе данных приложения stand-in (в случае отсутствия базы stand-in указать значение dummy)

DB_EKPIT_MAIN_LOGIN

Логин (имя пользователя), под которым продукт будет обращаться к базе данных ekpit

DB_EKPIT_MAIN_PASSWORD

Пароль пользователя, под которым продукт будет обращаться к базе данных ekpit

DB_EKPIT_STANDIN_LOGIN

Логин (имя пользователя), под которым продукт будет обращаться к базе данных ekpit stand-in (в случае отсутствия базы stand-in указать значение dummy)

DB_EKPIT_STANDIN_PASSWORD

Пароль пользователя, под которым продукт будет обращаться к базе данных ekpit stand-in (в случае отсутствия базы stand-in указать значение dummy)

OTT_CERTSTORE_PWD

По аналогии с секретами от messanger текущие параметры несут в себе пароли от JKS для сервиса ott (в случае не использования сервиса указать значение dummy)

OTT_TRUST_STORE_PWD

По аналогии с секретами от messanger текущие параметры несут в себе пароли от JKS для сервиса ott (в случае не использования сервиса указать значение dummy)

OTT_CERTSTORE_PRIVATE_KEY_PWD

По аналогии с секретами от messanger текущие параметры несут в себе пароли от JKS для сервиса ott (в случае не использования сервиса указать значение dummy)

AJ_KEYSTORE_PASSWORD

По аналогии с секретами от messanger текущие параметры несут в себе пароли от JKS для сервиса ПЖ (в случае не использования сервиса указать значение dummy)

AJ_TRUSTORE_PASSWORD

По аналогии с секретами от messanger текущие параметры несут в себе пароли от JKS для сервиса ПЖ (в случае не использования сервиса указать значение dummy)

AJ_KEY_PRIVATE_KEY_PASSWORD

По аналогии с секретами от messanger текущие параметры несут в себе пароли от JKS для сервиса ПЖ (в случае не использования сервиса указать значение dummy)

  1. Далее зашифруйте файл _password.conf согласно инструкции компонента Deploy tools (CDJE) Продукта Platform V DevOps Tools. Для простоты шифрования существует возможность воспользоваться скриптом шифрования на powerShell. Создайте файл с тем же именем, что и файл который должен быть зашифрован, добавьте к имени окончание “_d”. Далее скрипт найдет все файлы с окончанием “_d” и зашифрует создав файл без окончания “_d”.

  2. В файл .gitignore добавьте *_d что бы нешифрованные файлы не попали в репозиторий.

$files = (Get-ChildItem *_d).FullName
$vault_cred_openshift_ops='<your pass encrypt>'
ForEach ($file in $files){
    echo $file

    openssl enc -aes-256-cbc -k $vault_cred_openshift_ops -in $file -out $file.TrimEnd('_d')
}
  1. Далее создайте файлы в директории openshift_extra_secrets с именами описанными в блоке extra-secrets. Имя секрета должно совпадать с именем файла. secret-aj:

kind: Secret
apiVersion: v1
metadata:
  name: secret-aj
type: Opaque
data:
  keystore.jks: <base64 enc jks store >
  truststore.jks: <base64 enc jks store >

secret-egress-ca-certs:

kind: Secret
apiVersion: v1
metadata:
  name: secret-egress-ca-certs
type: Opaque
data:
  ca.pem: <base 64 cert pem >

secret-egress-certs:

kind: Secret
apiVersion: v1
metadata:
  name: secret-egress-certs
  labels:
    app: dypx
type: Opaque
data:
  tls.crt: <base64 enc jks store >
  tls.key: <base64 enc jks store >

secret-ingress-ca-certs:

kind: Secret
apiVersion: v1
metadata:
  name: secret-ingress-ca-certs
type: Opaque
data:
  ca.pem:<base 64 cert pem>

secret-ingress-certs:

kind: Secret
apiVersion: v1
metadata:
  name: secret-ingress-certs
  labels:
    app: dypx
type: Opaque
data:
  tls.crt: <base64 enc jks store >
  tls.key: <base64 enc jks store >

secret-ott-certs:

kind: Secret
apiVersion: v1
metadata:
  name: secret-ott-certs
type: Opaque
data:
  keystore.jks: <base64 enc jks store >
  truststore.jks: <base64 enc jks store >

Имя секрета

Содержимое

secret-ott-certs

Секрет содержит jks хранилище keystote, truststore. Текущий секрет необходим для функционирования OTT (может быть опционален)

secret-ingress-certs

Секрет содержит сертификат в формате pem, необходим для реализации mTLS, монтируется в pod ingress istio/servicemesh

secret-ingress-ca-certs

Секрет содержит root сертификат центра сертификации в формате pem, необходим для реализации mtls, монтируется в pod ingress istio/servicemesh

secret-egress-certs

Секрет содержит сертификат в формате pem, необходим для реализации mTLS, монтируется в pod egress istio/servicemesh

secret-egress-ca-certs

Секрет содержит root сертификат центра сертификации в формате pem, необходим для реализации mTLS, монтируется в pod egress istio/servicemesh

secret-aj

Секрет содержит jks хранилище keystote, truststore. Текущий секрет необходим для функционирования ПЖ (может быть опционален)

Администратор самостоятельно выбирает как реализовать kind secret для k8s, использовать data или datastring, и какой тип секрета ему применить. Важно сохранить имя секрета и ключ значения параметра. Тип хранилища может быть как jks, так и PKCS12.

Пример создания хранилища сертификата УЦ

Процесс создания хранилища сертификата УЦ продемонстрирован на примере OTT.

Для того чтобы клиенты OTT при установке SLT(TLS) соединения доверяли SSL−сертификатам серверов OTT:

  1. Включите в trust store сертификат УЦ, который выпустил SSL−сертификат серверов OTT.

  2. Скачайте файл УЦ посредствами браузера, подключившись к серверу OTT (https://<ott−server>:8443/).

  3. Для импорта полученного сертификата в trust store используйте команду:

shell

keytool −importcert −file ./root_ca.cer −keystore ./ott_truststore.p12 −alias "root_ca"

Настройка Secret Management System#

Secret Management System позволяет хранить секреты, которые использует приложение. Секретами считаются:

  • пароль в БД;

  • используемые сертификаты и ключи к ним;

  • доверенные цепочки сертификатов;

  • хранилища и пароли к ним.

Включение Secret Management System#

Продукт может использовать Secret Management System вместо Secrets OpenShifht (Kubernetes). Чтобы задать Secret Management System, как место хранения секретов, необходимо выполнить следующие действия:

  1. Перейти в репозитории dypx_dypx в директорию /config/package/conf/, открыть конфигурационный файл в custom_property.conf.yml.

  2. Проверить, что для параметра конфигурации SECMAN_ENABLED задано значение true, если нет, то указать это значение. В обратном случае будет работать механизм секретов OpenShift (Kubernetes).

SECMAN_ENABLED: true;
Настройка параметров работы Secret Management System#

Параметры работы Secret Management System заданы по умолчанию, но при необходимости их можно переопределить. Для этого нужно выполнить следующие действия:

  1. Задать с помощью global-параметров следующие обязательные значения:

Параметр

Описание

Пример

secman_host

Адрес Secret Management System

secman-xxx.solution.yyy

secman_port

Порт Secret Management System

9092

secman_namespace

Пространство имен Secret Mangement System

secman_log_level

Уровень логирования. По умолчанию info, но можно выбрать одно из следующих значений: trace, debug, info, warn, err

debug

secman_role

Роль для доступа в Secret Management System

role-ga-secman-dypx

secman_secret_cr_path

Директория, в которой хранятся секреты с паролями от БД, паролями к хранилищам сертификатов и ключей (ПЖ (Прикладной журнал APLJ), ОТТ (OTTS), Kafka АРК, Kafka messenger)

DEV/DYPX/BD/KV/app/secrets

secman_secret_aj_path

Директория, в которой расположен секрет c хранилищем сертификатов и ключи ПЖ и ключи для хранилища доверенных сертификатов

DEV/DYPX/BD/KV/aj/secret

secman_secret_ott_path

Директория, в которой расположен секрет с хранилищем сертификатов и ключей для доступа к ОТТ и для хранилища доверенных сертификатов

DEV/DYPX/BD/KV/ott/secrets

secman_secret_ingress_path

Директория, в которой расположен секрет с сертификатом, ключом и цепочкой доверия для ingress

DEV/DYPX/BD/KV/ingress/secret

secman_secret_egress_path

Директория, в которой расположен секрет с сертификатом, ключом и цепочкой доверия для egress

DEV/DYPX/BD/KV/egress/secret

  1. При необходимости параметры, заданные в global, можно переопределить в репозитории common в директорию conf/config/parameters/ и открыть для редактирования файл dypx-istio.all.conf и dypx-secman.all.conf.

Содержимое dypx-istio.all.conf для блока Secret Management System:

istio_ose_istio_egress_secman_timeout: 2s
istio_ose_istio_egress_destination_rule_secman_TFP_CONN_POLL_TCP_MAX_CONN: 400
istio_ose_istio_egress_destination_rule_secman_OUT_DETECTION_CONSECUTIVE_GATEWAY_ERRORS: 5
istio_ose_istio_egress_destination_rule_secman_OUT_DETECTION_INTERVAL: 1m
istio_ose_istio_egress_destination_rule_secman_OUT_DETECTION_BASE_EJECTION_TIME: 5m
istio_ose_istio_egress_destination_rule_secman_OUT_DETECTION_MAX_EJECTION_PERCENT: 100

Содержимое dypx-istio.all.conf для блока Secret Management System:

dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_log_level=info
dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_role=${secman_role}
dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_namespace=${secman_namespace}

dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_secret_volume_path_secret_app_yaml=/app/secrets
dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_agent_inject_secret_secret_app_yaml=${secman_secret_dp_path}

dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_agent_inject_template_aj_keystore_jks=${secman_secret_aj_path}
dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_secret_volume_path_aj_keystore_jks=/app/certs/aj

dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_agent_inject_template_aj_truststore_jks=${secman_secret_aj_path}
dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_secret_volume_path_aj_truststore_jks=/app/certs/aj

dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_secret_volume_path_egress_chain_crt=/etc/istio/gateway-ca-certs
dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_secret_volume_path_egress_tls_crt=/etc/istio/gateway-certs
dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_secret_volume_path_egress_tls_key=/etc/istio/gateway-certs
dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_agent_inject_secret_egress_chain_crt=${secman_secret_egress_path}
dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_agent_inject_secret_egress_tls_crt=${secman_secret_egress_path}
dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_agent_inject_secret_egress_tls_key=${secman_secret_egress_path}

dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_secret_volume_path_ingress_chain_crt=/etc/istio/gateway-ca-certs
dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_secret_volume_path_ingress_tls_crt=/etc/istio/gateway-certs
dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_secret_volume_path_ingress_tls_key=/etc/istio/gateway-certs
dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_agent_inject_secret_ingress_chain_crt=${secman_secret_ingress_path}
dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_agent_inject_secret_ingress_tls_crt=${secman_secret_ingress_path}
dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_agent_inject_secret_ingress_tls_key=${secman_secret_ingress_path}

dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_secret_volume_path_ott_keystore_p12=/mnt/secrets
dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_secret_volume_path_ott_truststore_p12=/mnt/secrets
dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_agent_inject_secret_ott_keystore_p12=${secman_secret_ott_path}
dypx_secman_deployment_spec_template_metadata_annotations_vault_hashicorp_com_agent_inject_secret_ott_truststore_p12=${secman_secret_ott_path}
  1. Проверить, что секреты содержат необходимые параметры.

  • secman_secret_cr_path

{
"AJ_KEYSTORE_PASSWORD": "qqqq",
 "AJ_KEY_PRIVATE_PASSWORD": "qqqq",
 "AJ_TRUSTSTORE_PASSWORD": "qqqq",
 "DB_EKPIT_MAIN_LOGIN": "pgreader",
 "DB_EKPIT_MAIN_PASSWORD": "qqqq",
 "DB_EKPIT_STANDIN_LOGIN": "pgreader",
 "DB_EKPIT_STANDIN_PASSWORD": "qqqq",
 "DB_INDICATOR_MAIN_LOGIN": "pricing_service",
 "DB_INDICATOR_MAIN_PASSWORD": "qqqq",
 "DB_INDICATOR_STANDIN_LOGIN": "pricing_service",
 "DB_INDICATOR_STANDIN_PASSWORD": "qqqq",
 "DB_PRICING_MAIN_LOGIN": "pricing_service",
 "DB_PRICING_MAIN_PASSWORD": "qqqq",
 "DB_PRICING_STANDIN_LOGIN": "pricing_service",
 "DB_PRICING_STANDIN_PASSWORD": "qqqq",
 "OTT_CERTSTORE_PRIVATE_KEY_PWD": "qqqq",
 "OTT_CERTSTORE_PWD": "qqqq",
 "OTT_TRUST_STORE_PWD": "qqqq"
}

Также среди этих секретов могут быть указаны логин и пароль до БД ЕКПиТ (опционально, если отключен НСИ Фасад):

"DB_EKPIT_MAIN_LOGIN": "",
"DB_EKPIT_MAIN_PASSWORD": "",
"DB_EKPIT_STANDIN_LOGIN": "",
"DB_EKPIT_STANDIN_PASSWORD": ""
  • secman_secret_aj_path

    Значения секретов задаются в кодировке Base64.

{
"keystore.jks": "",
"truststore.jks": ""
}
  • secman_secret_ingress_path

    Значения секретов задаются в кодировке Base64.

{
"chain.crt": "",
"tls.crt": "",
"tls.key": ""
}
  • secman_secret_egress_path

    Значения секретов задаются в кодировке Base64.

{
"chain.crt": "",
"tls.crt": "",
"tls.key": ""
}
  • secman_secret_ott_path

    Значения секретов задаются в кодировке Base64.

{
"keystore.jks": "",
"truststore.jks": ""
}

Настройка сервиса Synapse Rate Limiter#

Synapse Rate Limiter — облачный сервис, позволяющий ограничивать доступ к приложениям на основе задаваемых квот (лимитов). Квоты задаются для отдельных точек вызова приложения и могут быть различными для разных потребителей приложения. При превышении лимитов потребителю возвращается ошибка.

Включение Synapse Rate Limiter#

Чтобы включить взаимодействие с Synapse Rate Limiter, необходимо выполнить действия:

  1. В репозитории с настройками Rate Limiter открыть конфигурационный файл в custom_property.conf.yml.

  2. Проверить, что для параметра конфигурации DEPLOY_LIMITS задано значение true, если нет, то указать это значение.

DEPLOY_LIMITS: true;
Настройка параметров работы Synapse Rate Limiter#
Создание артефакта для подключения вручную#

В OpenShift (Kubernetes) том же namespace, где располагается GlobalRateLimit, необходимо создать в openshift конфигурационный файл RateLimiterCRD.yalm. Файл должен иметь следующую структуру:

  name: rate-limit-config
  namespace: standname-dypx-vdc06-01
  labels:
    proj: synapse-rls
    agent: srls
    version: D-02.003.00-36
spec:
  endpoints: # 6 endpoints — на каждый gateway (https, https-geo, https-geo-smart, ott, ott-geo, ott-geo-smart)
    — endpoint: dypx-https-kb-standname-dypx-vdc06-01.apps.stands-vdc01.solution.sbt:8443
      name: dypx-https
      shortname: dypxh
      overall_limit: -1
      by_header:
        header: module_id
        unit: second
        value: -1
        uri_prefixes:
          — unit: second
            uri_prefix: /ru.sbt.currency.integration.api.cb.CentralBankRates
            value: -1
          — unit: second
            uri_prefix: /ru.sbt.currency.cloud.api.individual.ExchangeRatesForIndividuals
            value: -1
          — unit: second
            uri_prefix: /ru.sbt.currency.cloud.api.legal.ExchangeRatesForLegalEntities
            value: -1
          — unit: second
            uri_prefix: /ru.sbt.currency.cloud.api.financial.FinancialQuotes
            value: -1
          — unit: second
            uri_prefix: /ru.sbt.currency.cloud.api.interbank.InterbankRates
            value: -1
          — unit: second
            uri_prefix: /ru.sbt.currency.cloud.api.supplementary.ExchangeRatesSupplementary
            value: -1
      name: dypx-ott-geo
      shortname: dypxog
      overall_limit: -1
      by_header:
        header: module_id
        unit: second
        value: -1
        uri_prefixes:
          — unit: second
            uri_prefix: /ru.sbt.currency.integration.api.cb.CentralBankRates
            value: -1
          — unit: second
            uri_prefix: /ru.sbt.currency.cloud.api.individual.ExchangeRatesForIndividuals
            value: -1
          — unit: second
            uri_prefix: /ru.sbt.currency.cloud.api.legal.ExchangeRatesForLegalEntities
            value: -1
          — unit: second
            uri_prefix: /ru.sbt.currency.cloud.api.financial.FinancialQuotes
            value: -1
          — unit: second
            uri_prefix: /ru.sbt.currency.cloud.api.interbank.InterbankRates
            value: -1
          — unit: second
            uri_prefix: /ru.sbt.currency.cloud.api.supplementary.ExchangeRatesSupplementary
            value: -1
    — endpoint: dypx-kb-standname-dypx-vdc06-01.geo-smart.apps.stands-vdc01.solution.sbt:5443
      name: dypx-ott-geo-smart
      shortname: dypxogs
      overall_limit: -1
      by_header:
        header: module_id
        unit: second
        value: -1
        uri_prefixes:
          — unit: second
            uri_prefix: /ru.sbt.currency.integration.api.cb.CentralBankRates
            value: -1
          — unit: second
            uri_prefix: /ru.sbt.currency.cloud.api.individual.ExchangeRatesForIndividuals
            value: -1
          — unit: second
            uri_prefix: /ru.sbt.currency.cloud.api.legal.ExchangeRatesForLegalEntities
            value: -1
          — unit: second
            uri_prefix: /ru.sbt.currency.cloud.api.financial.FinancialQuotes
            value: -1
          — unit: second
            uri_prefix: /ru.sbt.currency.cloud.api.interbank.InterbankRates
            value: -1
          — unit: second
            uri_prefix: /ru.sbt.currency.cloud.api.supplementary.ExchangeRatesSupplementary
            value: -1
  rlnamespace: standname-dypx-vdc06-01
  rlserver: rate-limiter-headless-service.standname-dypx-vdc06-01.svc.cluster.local
  rlserverport: 8081
  visibility: namespace
  workloadSelector:
    labels:
      app: dypx-ingress
      istio: standname-dypx-vdc06-01-ingress

Параметры файла подробно описаны в разделе Описание параметров для интеграции.

Создание артефакта для интеграции с помощью DevOpsTools CDJE#

Чтобы конфигурационный файл RateLimiterCRD.yalm был сгенерирован автоматически, необходимо выполнить действия:

  1. Перейти в репозиторий /config/package/conf/, открыть для редактирования файл custom-propery.conf.yml.

  2. В поле enpoints необходимо добавить json следующего вида:

   endpoints: [
   {
   "endpoint": "dypx-https-kb-standname-dypx-vdc06-01.apps.stands-vdc01.solution.sbt:8443",
   "name": "dypx-https",
   "shortname": "dypxh",
   "overall_limit": -1,
   "by_header": {
   "header": "subsystemCode",
   "unit": "second",
   "value": -1,
   "uri_prefixes": [
   {
   "uri_prefix": "/ru.sbt.currency.integration.api.cb.CentralBankRates",
   "unit": "second",
   "value": -1
   },
   {
   "uri_prefix": "/ru.sbt.currency.cloud.api.individual.ExchangeRatesForIndividuals",
   "unit": "second",
   "value": -1
   },
   {
   "uri_prefix": "/ru.sbt.currency.cloud.api.legal.ExchangeRatesForLegalEntities",
   "unit": "second",
   "value": -1
   },
   {
   "uri_prefix": "/ru.sbt.currency.cloud.api.financial.FinancialQuotes",
   "unit": "second",
   "value": -1
   },
   {
   "uri_prefix": "/ru.sbt.currency.cloud.api.interbank.InterbankRates",
   "unit": "second",
   "value": -1
   },
   {
   "uri_prefix": "/ru.sbt.currency.cloud.api.supplementary.ExchangeRatesSupplementary",
   "unit": "second",
   "value": -1
   }
   ]
   }
   },
   {
   "endpoint": "dypx-kb-standname-dypx-vdc06-01.geo-smart.apps.stands-vdc01.solution.sbt:5443",
   "name": "dypx-ott-geo-smart",
   "shortname": "dypxogs",
   "overall_limit": -1,
   "by_header": {
   "header": "subsystemCode",
   "unit": "second",
   "value": -1,
   "uri_prefixes": [
   {
   "uri_prefix": "/ru.sbt.currency.integration.api.cb.CentralBankRates",
   "unit": "second",
   "value": -1
   },
   {
   "uri_prefix": "/ru.sbt.currency.cloud.api.individual.ExchangeRatesForIndividuals",
   "unit": "second",
   "value": -1
   },
   {
   "uri_prefix": "/ru.sbt.currency.cloud.api.legal.ExchangeRatesForLegalEntities",
   "unit": "second",
   "value": -1
   },
   {
   "uri_prefix": "/ru.sbt.currency.cloud.api.financial.FinancialQuotes",
   "unit": "second",
   "value": -1
   },
   {
   "uri_prefix": "/ru.sbt.currency.cloud.api.interbank.InterbankRates",
   "unit": "second",
   "value": -1
   },
   {
   "uri_prefix": "/ru.sbt.currency.cloud.api.supplementary.ExchangeRatesSupplementary",
   "unit": "second",
   "value": -1
   }
   ]
   }
   }
   ]

Параметры файла подробно описаны в разделе Описание параметров для интеграции.

Описание параметров для интеграции#

Таблица с общими параметрами

Параметр

Описание

Пример

workloadSelector

Набор labels для определения нужных pod Ingress Gateway

workloadSelector:
labels:
app: ingress-my-namespace
istio: ingress-my-namespace

rlserver

Адрес RLS-сервера (для децентрализованной установки следует указать hadless server rls например: «rate-limiter-headless-service», для централизованной установки здесь следует указать сервис Egress Gateway вашего namespace, рекомендованный формат — <headless_service_name>..svc.cluster.local)

egress-gateway-headless.my-namespace.svc.cluster.local

rlserverport

Порт RLS-сервера, по умолчанию — 12001, если не задан (для децентрализованной установки — 8081, для централизованной установки — 12001)

12001

rlnamespace

namespace, в котором развернут централизованный оператор, данное поле необходимо указать для возможности развертывания нескольких экземпляров централизованного SRLS в рамках одного кластера Kubernetes или Red Hat OpenShift (опционально), если данное поле не задано, необходимо проверить наличие прав на артефакт EnvoyFilter в прикладном namespace

rlservice-ns

visibility

Отвечает за область видимости CRD, на текущий момент поддерживается только одно значение — cluster

cluster

endpoints

Перечень ресурсов

— endpoint: …
— endpoint: …

Таблица с параметрами для задания endpoint

Параметр

Описание

Пример

shortname

Уникальное имя endpoint, используемое в работе.

some service1

endpoint

Адрес в формате host:port, здесь host — DNS адрес, на который поступает входящий трафик (определяется в артефакте Route, используется в артефактах Gateway, VirtualService для манипуляции трафиком с помощью Service Mesh), port — порт, который слушает Ingress (задается в артефакте Gateway), например 8080 для HTTP трафика или 8443 для HTTPS трафика.

test-server2-endpoint.apps.stands-vdc01.solution.sbt:8080

overall_limit

Максимальное ограничение квоты для endpoint; 0 — блокировка всех запросов, отрицательное значение — нет ограничения; если значение больше 0, дополнительно вводится счетчик запросов на endpoint; в случае превышения запрос будет отклонен, даже если потребитель еще не исчерпал свою квоту.

100

by_header

Список настроек для функционала идентификации потребителя по HTTP-заголовку. Параметр не может использоваться одновременно с by_path.

Список параметров см. таблицу

Параметры блока by_header

header

Произвольный http-заголовок (валидный для протокола HTTP)

module_id

unit

Опциональное поле, по умолчанию second, единица измерения лимитов, используется при расчете overall_limit, для запросов со значениями заголовка header, неуказанными в блоке invokers, и для неидентифицированных потребителей

second

anon_value

Опциональное поле, позволяет задать квоту для неидентифицированных потребителей, если не задано, используется значение поля value

3

value

Опциональное поле, по умолчанию 1, позволяет задать квоту для запросов со значениями заголовка header, неуказанными в блоке invokers, и для неидентифицированных потребителей

7

soft

Опциональный блок, если задан, создается метрика, показывающая приближение к лимиту. soft.value — значение квоты, после которой с шагом кратным soft.step будет инкрементирована метрика мониторинга превышения уровня soft квоты для конкретного потребителя вплоть до превышения основного лимита;

value: 10 step: 1

invokers

Опциональный блок, позволяет задать квоту для определенных потребителей независимо

Параметры блока invokers

header_value

Значение заголовка, указанного в поле header

synapse-dev-sandbox

name

Опциональное поле, позволяет указать метаданные для header_value

client1

unit

Опциональное поле, по умолчанию second, единица измерения лимитов для header_value

second

value

Опциональное поле, по умолчанию 1, позволяет задать квоту для запросов со значением заголовка header, равным header_value

5

soft

опциональный блок, если задан, создается метрика, показывающая приближение к лимиту. soft.value — значение квоты, после которой с шагом кратным soft.step будет инкрементирована метрика мониторинга превышения уровня soft квоты для header_value вплоть до превышения основного лимита;

value: 10 step: 1

by_path

Список настроек для функционала идентификации потребителя по resourceName. Параметр не может использоваться одновременно с by_header.

Параметры блока by_path

mask

Опциональное поле, по умолчанию rn/::*, маска для определения значимой части идентификатора потребителя

'rn/::_'

unit

Опциональное поле, по умолчанию second, единица измерения лимитов, используется при расчете overall_limit и потребителей, неуказанных в блоке tenants

second

quotas

Конфигурация квоты для потребителей, неуказанных в блоке tenants

tenants

Опциональный блок, позволяет задать квоту для определенных потребителей независимо

Параметры блока quotas

flat

Опциональное поле, по умолчанию 1, позволяет задать квоту для запросов

15

soft

Опциональный блок, если задан, создается метрика, показывающая приближение к лимиту. soft.value — значение квоты, после которой с шагом кратным soft.step будет инкрементирована метрика мониторинга превышения уровня soft квоты для конкретного потребителя вплоть до превышения основного лимита.

value: 10 step: 1

Параметры блока tenant

name

Опциональное поле, позволяет указать метаданные для resourceName

server1.path

quotas

Конфигурация квоты для потребителя, указанного в resourceName

value: 5 step: 1

resourceName

Идентификатор потребителя, значение необходимо указать в формате account-id:project-id:resource-id без разделителя, например accProjRes, если используется маска, необходимо указать только значимую часть, например accProj

account-2project-2

unit

Опциональное поле, по умолчанию second, единица измерения лимитов

second

Настройка сервиса Объединенный мониторинг Unimon#

Чтобы настроить сервис Объединенный мониторинг Unimon, необходимо выполнить следующие действия:

  1. Задать настройки в манифестах в среде контейнеризации. Большинство обязательных labels метрики будут добавлены автоматически на этапе сбора Unimon-agent. Но в прикладное приложение необходимо самостоятельно добавить следующие labels:

  • app — имя приложения;

  • version — версия приложения;

    Эти параметры необходимо добавить в labels POD приложения.

  1. Добавить в метрики unimonId/rn (необходимо при неавтономном режиме работы). Чтобы значения unimonId/rn появились во всех метриках пользователя, есть несколько вариантов.

  • UnimonId задать как label в pod'е прикладного сервиса.

  • UnimonId/rn задать как label в метрике.

  • rn задать в файле конфигурации unimon-sender (metric.label.rn). Варианты указаны в соответствии с приоритетностью применения значений. Если метка задана первым и последним вариантом и значения не равны, то в метрики будет добавлено значение, указанное в первом варианте. Если указан несуществующий unimonId/rn в метриках, выводится сообщение в лог (режим debug), что эти метрики не будут направлены в хранилище.

Если в метрике указан только rn и параметр работы Unimon указан как автономная работа, метрика будет отправлена в topic по умолчанию, указанный в unimon-sender.

Если в метрике указан только rn — задан параметр для неавтономной работы и отсутствует связь с сервером, то невозможно получить основной unimonId для rn. Маршрутизация в соответсвующий topic не выполнится, метрика не будет отправлена.

Пример Service.yaml

    apiVersion: v1
    kind: Service
    metadata:
        # Пример названия сервиса
        name: unimon-sandbox-micrometer
        annotations:
            description: "Exposes Micrometer-Prometheus App by CLuster Ip"
            # Аннотация для включения сбора метрик
            prometheus.io.scrape: "true"
            # Аннотация для указания HTTP endpoint с метриками приложения
            # Путь указывается полностью, например если при тестирование
            # вы переходите на endpoint http://localhost:8081/actuator/prometheus
            prometheus.io.path: "/actuator/prometheus"
            # Аннотация для указания порта подключения к HTTP endpoint с метриками
            # Внимание!!! порт может меняться на стороне потребителя, "8081" указан как пример
            prometheus.io.port: "8081"
        labels:
            app: unimon-sandbox-micrometer
    spec:
        ports:
        — name: http
          port: 8080
          targetPort: 8080
        — name: http-actuator
          port: 8081
          targetPort: 8081
    selector:
        app: unimon-sandbox-micrometer

Более подробно с настройками и параметрами можно ознакомиться в документации по установке и развертыванию сервиса Объединенный мониторинг Unimon.

Настройка клиента OTT#

Чтобы настроить клиент OTT на использование полученного сертификата OTT Service, необходимо задать параметры:

Параметр

Описание

Пример

ott.trust.store.path

Путь к хранилищу, содержащему сертификат OTT Service

/etc/pprb/ott/ott_truststore.p12

ott.trust.store.pwd

Пароль от хранилища, содержащего сертификат OTT Service. При получении сертификата задавался в параметре <password>

<здесь пароль от хранилища ключей>

ott.service.cert.alias

Alias сертификата OTT Service в хранилище

ott−service

ott.certstore.type=PKCS12

Тип хранилища (PKCS12 или JKS)

PKCS12

Для получения приватной части сертификата:

  1. Администратор прикладного модуля: выполняет генерацию ключевой пары в p12−контейнере.

    keytool −genkey −keyalg EC −sigalg SHA256withECDSA −keystore ${module_id}.p12 −storetype PKCS12 −keysize 256 −dname "CN=${module_id}" −alias ${module_id}
    

    Рекомендуется использовать версию OpenJDK не ниже 11

  2. Администратор прикладного модуля: формирует запрос на сертификат.

    keytool −certreq −keyalg EC −sigalg SHA256withECDSA −keystore ${module_id}.p12 −storetype PKCS12 −alias ${module_id} > ${module_id}_cert_req.pem
    

    В результате выполнения данной команды создастся файл CSR− ${module_id}_cert_req.pem, который необходимо передать Администратору OTT в заявке на генерацию сертификата для модуля. В заявке указать, что сертификат должен быть сгенерирован из приложенного запроса по данной инструкции.

  3. Администратор OTT: выписывает сертификат.

    ./ejbcawsracli.sh certreq %{module_id} "CN=%{module_id}" NULL PlatformCA_EC PPRBModule %{module_id}_cert_req.pem PKCS10 PEM NONE
    

    В результате выполнения данной команды будет создан файл с сертификатом− %{module_id}.pem, который необходимо передать Администратору прикладного модуля.

  4. Администратор OTT: вместе с сертификатом модуля передает сертификат УЦ OTT PlatformCA_EC.pem. CN=PlatformCA_EC CA certificate: Download as PEM

  5. Администратор прикладного модуля: импортирует сертификат УЦ OTT и сертификат модуля в keystore, созданный на 1 шаге (строго в указанном порядке).

    keytool −import −keystore ${module_id}.p12 −storetype PKCS12 −file PlatformCA_EC.pem −alias PlatformCA_EC
    keytool −import −keystore ${module_id}.p12 −storetype PKCS12 −file ${module_id}.pem −alias ${module_id}
    
  6. После выполнения шагов должно быть два файла (необязательно с такими именами):

    1. ott_service_truststore.p12 − публичная часть (truststore);

    2. pricing−service.p12 − приватная часть (keystore).

Подготовка файла конфигурации стенда зависимых параметров#

Это текстовый файл в формате: имя_параметра: значение_параметра. Цифровые значения задаются в одинарных кавычках. Пример файла параметров Expand source

CR_NAMESPACE: ci00642380−idevgen2−dynamic−pricing−ift

При изменении строки подключения к БД (имена, ip адреса, порты), списка брокеров ПЖ (имена, ip адреса, порты) необходимо изменение необязательных параметров по умолчанию в части маршрутизации трафика. Без этих изменений не произойдет соединение с хостом. Если количество хостов брокеров ПЖ увеличиться потребуется новый релиз с поддержкой новой конфигурации. Если один из портов преобразования будет использоваться в строке подключения к БД и/или как порт подключения к брокеру ПЖ, его значение придется переназначить на другой порт. При этом нужно учесть, что эти порты преобразования указаны в сервисе выходного шлюза. Нужно будет выбрать незанятый порт среди списка портов сервиса выходного шлюза.

В репозитории common можно добавить параметры представленные в таблице ниже.

Имя параметра

Описание

global_docker_registry

Имя вашего приватного хранилища докер контейнеров

dypx_pricing_cloud_app_docker_part

Имя тега докер контейнера в разрезе сервисов без указания доменной части приватного хранилища docker и версии

dypx_indicator_cloud_app_docker_part

Имя тега докер контейнера в разрезе сервисов без указания доменной части приватного хранилища docker и версии

global_docker_secret

Имя секрета для доступа к docker хранилищу

global_docker_registry_path

Место хранения docker-контейнера

NAMESPACE_CDNS

Доменные имена балансировшика на которых будут созданы url для текущей инсталляции

NAMESPACE_CDNS_GEO

Доменные имена балансировшика на которых будут созданы url для текущей инсталляции

NAMESPACE_CDNS_SMART_GEO

Доменные имена балансировшика на которых будут созданы url для текущей инсталляции

ott_image

Полная ссылка на образ ott

ott_servers_urls

Список хостов для ott в формате host:port

fluent_bit_image

Полная ссылка на образ fluent_bit

fluent_bit_loggerHost

Хост elk

fluent_bit_loggerPort

Порт elk

fluent_bit_standId

Имя стенда

fluent_bit_zoneId

Имя Зоны

image_istio_image

Полная ссылка на образ ingress (envoy-proxy) istio/servicemesh

Параметры базы данных

Имя параметра

Описание

Пример

jdbc_db_indicator_main_url

Строка подключение к базе приложения в формате jdbc

jdbc:postgresql://: /?

jdbc_db_indicator_si_url

Строка подключение к базе приложения stand-in в формате jdbc

jdbc:postgresql://: /?

jdbs_db_curate_owner

Указание владельца схемы базы данных приложения

ekpit

jdbc_db_ekpit_main_url

Строка подключение к базе ekpit в формате jdbc

jdbc:postgresql://: /?

jdbc_db_ekpit_si_url

Строка подключение к базе ekpit stand-in в формате jdbc

jdbc:postgresql://: /?

jdbc_db_ekpit_owner_schema

Указание владельца схемы базы данных ekpit

ekpit

jdbc_db_ekpit_driver

Тип используемого драйвера jdbc

org.postgresql.Driver

jdbc_db_indicator_main_url

Строка подключение к базе приложения в формате jdbc (используется для сервиса dypx-indicator-cloud-app )

Текущий параметр дублирует значение jdbc:postgresql://: /? . Используется отдельный параметр так как текущий Продукт можно настроить на отдельную базу, или развернуть в отличном пространстве

jdbc_db_indicator_si_url

Строка подключение к базе приложения stand-in в формате jdbc

Текущий параметр дублирует значение jdbc:postgresql://: /? . Используется отдельный параметр так как текущий сервис можно настроить на отдельную базу , или развернуть в отличном пространстве

jdbc_db_dypx_driver

Тип используемого драйвера jdbc (используется для сервиса dypx-indicator-cloud-app )

org.postgresql.Driver

jdbc_db_dypx_main_url

Cтрока подключения к основной БД приложения

jdbc:postgresql://10.2x.xx.xx:6544/ekpitift01?currentSchema=ekpit

jdbc_db_dypx_main_host

Имя хоста БД приложения

srv-1.pf.dev.sbt

jdbc_db_dypx_main_ip

ip-адрес хоста основной БД приложения

99.99.99.1

jdbc_db_dypx_main_port

Порт хоста основной БД приложения

9092

jdbc_db_dypx_main_failover_host

Имя резервного хоста БД

srv-1.pf.dev.sbt1

jdbc_db_dypx_main_failover_ip

ip-адрес резервного хоста БД

99.99.99.2

jdbc_db_dypx_main_failover_port

Порт хоста резервной БД приложения

9091

jdbc_db_dypx_si_failover_host

Имя резервного хоста БД stand-in

srv-1.pf.dev.sbt2

jdbc_db_dypx_si_host

Имя хоста stand-in БД приложения

srv-1.pf.dev.sbt3

jdbc_db_dypx_si_port

Порт хоста stand-in БД приложения

9091

jdbc_db_dypx_si_failover_port

Порт резервного хоста БД stand-in

9091

jdbc_db_dypx_si_failover_ip

ip-адрес резервного хоста БД stand-in

99.99.99.3

jdbc_db_dypx_si_ip

ip-адрес хоста БД stand-in

99.99.99.4

jdbc_db_dypx_si_url

Cтрока подключения к stand-in БД приложения

jdbc:postgresql://10.2x.xx.xx:6544/ekpitift01?currentSchema=si

jdbc_db_dypx_driver

Имя java-класса jdbc-драйвера БД

jdbcClass

jdbc_db_ekpit_main_host

В текущем параметре передается host name или ip адреc базы данных ekpit (если у базы нет FQDN)

db.ekpit.xxxxx.ru

jdbc_db_ekpit_main_failover_host

В текущем параметре передается host name или ip адреc базы данных ekpit (если у базы нет FQDN)

db.ekpit.xxxxx.ru

jdbc_db_ekpit_si_host

В текущем параметре передается host name или ip адреc базы данных ekpit (если у базы нет FQDN)

db.ekpit.xxxxx.ru

jdbc_db_ekpit_si_failover_host

В текущем параметре передается host name или ip адреc базы данных ekpit (если у базы нет FQDN)

db.ekpit.xxxxx.ru

jdbc_db_ekpit_main_failover_ip

В текущих параметрах передается ip адреc базы данных ekpit

10.2x.xx.xx

jdbc_db_ekpit_si_ip

В текущих параметрах передается ip адреc базы данных ekpit

10.2x.xx.xx

jdbc_db_ekpit_si_failover_ip

В текущих параметрах передается ip адрес базы данных ekpit

10.2x.xx.xx

jdbc_db_ekpit_main_ip

В текущих параметрах передается ip адреc базы данных ekpit

10.2x.xx.xx

jdbc_db_ekpit_main_port

В текущих параметрах передается порт базы данных ekpit

5432

jdbc_db_ekpit_main_failover_port

В текущих параметрах передается порт базы данных ekpit

5432

jdbc_db_ekpit_si_port

В текущих параметрах передается порт базы данных ekpit

5432

jdbc_db_ekpit_si_failover_port

В текущих параметрах передается порт базы данных ekpit

5432

jdbc_db_pricing_si_url

URL для подключения к StandIn базе данных ДП

jdbc:postgresql://10.2x.xx.xx:6544/ekpitift01?currentSchema=si

Параметры интеграционных сервисов

В случае использования продукта Platform V Synapse Service Mesh для подключения в url используется протокол http, https(mtls), или ott. В случае неиспользования продукта Platform V Synapse Service Mesh Продукт может поддерживать http и https в режиме simple.

Имя параметра

Описание

audit_url_host

url для отправки метрик аудита

audit_disable

Параметр отключения Метрик аудита

indicator_url

Опциональны параметры, url для подключения к интегрированным системам банка

fxp_rate_request_url

Опциональны параметры, url для подключения к интегрированным системам банка

nsi_facade_sql_api_url

Опциональны параметры, url для подключения к интегрированным системам банка

client_api_service_url

Опциональны параметры, url для подключения к интегрированным системам банка

organization_api_service_url

Опциональны параметры, url для подключения к интегрированным системам банка

get_salary_agreement_info

Опциональны параметры, url для подключения к интегрированным системам банка

individual_tariffs_host

Опциональны параметры, url для подключения к интегрированным системам банка

digital_price_url

Опциональны параметры, url для подключения к интегрированным системам банка

aj_kafka_brokers

Список брокеров для ПЖ

aj_client_stub

Отключение прикладной репликации

aj_zone_id

Зона репликации ПЖ

Параметры для выполнения скрипта liquibase DevOps Tools:

Имя параметра

Описание

jdbc.db.price.main.url

URL для подключения к Main базе данных ДПs

jdbc.db.price.si.url

URL для подключения к StandIn базе данных ДП

jdbc.db.price.schema

Имя схемы в БД ДП

Для обеспечения безопасности передаваемых данных используется mTLS + OTT. Все входящие и исходящие межсервисные соединения проходят через ingress/egress proxy. Для входящих/исходящих взаимодействий используются mTLS.

В таблице ниже приведены параметры для развертывания OTT sidecar:

Имя параметра

Описание

ott_sidecar_egress_run_cmd

Командная строка для запуска OTT в egress

ott_sidecar_egress_mon_run_cmd

Командная строка для запуска OTT в egress (для мониторинга)

ott_sidecar_ingress_run_cmd

Командная строка для запуска OTT в ingress

Стендозависимые параметры ISTIO/ServiceMesh

Имя параметра

Описание

global.multiClusters.openshiftControlPlaneIstiodService

Параметр берется из контекста описания среды в файле multiClusters.json в common репозитории. Содержит ссылку на control plane istio/servicemesh

NAMESPACE_CDNS

Доменная часть url создаваемого route/ingress В промышленной среде это балансировщики

NAMESPACE_CDNS_GEO

Доменная часть url создаваемого route/ingress В промышленной среде это балансировщики

NAMESPACE_CDNS_SMART_GEO

Доменная часть url создаваемого route/ingress В промышленной среде это балансировщики

appFQDN_https

Хостовая часть url

appFQDN_https_ott

Хостовая часть url

В результате развертывания ingress/router будут созданы 6 ingress. Такое количество связано с циклом жизни приложения.

Параметры «тонкой» настройки продукта Platform V Synapse Service Mesh

Текущие параметры настраивают сущности Gateway, Virtual Service, Service Entry, Envoy Filter. Также, текущие параметры настраивают проксирование и выполняют роль firewall.

Пример: При указании параметров для подключения к базе данных приложения:

jdbc_db_pricing_main_url= jdbc:postgresql://xxxx/dypx?currentSchema=dypx

Текущий параметр отвечает за настройку сервиса. Далее настройте среду чтобы текущий трафик мог быть разрешен в сервисной сети. Для этого заполните параметры. Пример для базы данных

jdbc_db_pricing_main_host = xxxxx
jdbc_db_pricing_main_ip = xxxxx
jdbc_db_pricing_main_port = xxxxx

Эти параметры переобозначаются в репозитории сервиса в файле dypx.istio.all.conf

#pricing db egrees
# const mapping port
istio_ose_istio_egress_svc_spec_ports_db_pricing_main_mapping_port: xxxx
istio_ose_istio_egress_svc_spec_ports_db_pricing_main_failover_mapping_port: xxxx
istio_ose_istio_egress_svc_spec_ports_db_pricing_si_mapping_port: xxxx
istio_ose_istio_egress_svc_spec_ports_db_pricing_si_failover_mapping_port: xxxx
#host
istio_ose_istio_egress_db_pricing_main_host: ${jdbc_db_pricing_main_host}
istio_ose_istio_egress_db_pricing_main_failover_host: ${jdbc_db_pricing_main_failover_host}
istio_ose_istio_egress_db_pricing_si_host: ${jdbc_db_pricing_si_host}
istio_ose_istio_egress_db_pricing_si_failover_host: ${jdbc_db_pricing_si_failover_host}
# ip
istio_ose_istio_egress_db_pricing_main_ip: ${jdbc_db_pricing_main_ip}
istio_ose_istio_egress_db_pricing_main_failover_ip: ${jdbc_db_pricing_main_failover_ip}
istio_ose_istio_egress_db_pricing_si_ip: ${jdbc_db_pricing_si_ip}
istio_ose_istio_egress_db_pricing_si_failover_ip: ${jdbc_db_pricing_si_failover_ip}
# port
istio_ose_istio_egress_db_pricing_main_port: ${jdbc_db_pricing_main_port}
istio_ose_istio_egress_db_pricing_main_failover_port: ${jdbc_db_pricing_main_failover_port}
istio_ose_istio_egress_db_pricing_si_port: ${jdbc_db_pricing_si_port}
istio_ose_istio_egress_db_pricing_si_failover_port: ${jdbc_db_pricing_si_failover_port}

Пример конфигурации istio/servicemesh, который будет сформирован из дистрибутива:

apiVersion: networking.istio.io/v1alpha3
    kind: ServiceEntry
    metadata:
      name: se-db-pricing-main
    spec:
      addresses:
        — {{istio_ose_istio_egress_db_pricing_main_ip }}/32
      endpoints:
        — address: {{ istio_ose_istio_egress_db_pricing_main_ip }}
      exportTo:
        — .
      hosts:
        — {{ istio_ose_istio_egress_db_pricing_main_host }}
      location: MESH_EXTERNAL
      ports:
        — name: tcp-{{ istio_ose_istio_egress_db_pricing_main_port }}
          number: {{ istio_ose_istio_egress_db_pricing_main_port }}
          protocol: TCP
      resolution: STATIC

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: gw-dp-egress-db-pricing-main
    spec:
      selector:
        istio: dypx-egress
      servers:
        — hosts:
            — {{ istio_ose_istio_egress_db_pricing_main_host }}
          port:
            name: tcp-{{ istio_ose_istio_egress_db_pricing_main_port }}
            number: {{ istio_ose_istio_egress_db_pricing_main_port }}
            protocol: TCP


      apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: vs-dp-egress-db-pricing-main
    spec:
      exportTo:
        — .
      gateways:
        — gw-dp-egress-db-pricing-main
        — mesh
      hosts:
        — {{ istio_ose_istio_egress_svc_spec_ports_db_pricing_main_host }}
      tcp:
        — match:
            — gateways:
                — mesh
              port: {{ istio_ose_istio_egress_svc_spec_ports_db_pricing_main_port }}
          route:
            — destination:
                host: svc-dp-egress
                port:
                  number: {{ istio_ose_istio_egress_svc_spec_ports_db_pricing_main_mapping_port }}
              weight: 100
        — match:
            — gateways:
                — gw-dp-egress-db-pricing-main
              port: {{ istio_ose_istio_egress_svc_spec_ports_db_pricing_main_mapping_port }}
          route:
            — destination:
                host: {{ istio_ose_istio_egress_db_pricing_main_host }}
                port:
                  number: {{ istio_ose_istio_egress_db_pricing_main_port }}
              weight: 100

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
 labels:
   external: database
name: dr-dp-egress-${DB_PRICING_MAIN_HOST}
spec:
  exportTo:
    — .
  host: {{ istio_ose_istio_egress_db_pricing_main_host }}
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
    portLevelSettings:
      — port:
       number: {{ istio_ose_istio_egress_db_pricing_main_mapping_port }}
      connectionPool:
        tcp:
          connectTimeout: {{ istio_ose_istio_egress_db_connectionPool_tcp_connectTimeout }}

          maxConnections:{{ istio_ose_istio_egress_db_connectionPool_tcp_maxConnections }}
          tcpKeepalive:
            time: {{ istio_ose_istio_egress_db_connectionPool_tcpKeepalive_time }}
            interval: {{ istio_ose_istio_egress_db_connectionPool_tcpKeepalive_interval }}

Параметры базы данных приложения

Имя параметра

Описание

jdbc_db_pricing_main_host

В текущем параметре передается host name или ip адрес базы данных (если у базы нет FQDN)

jdbc_db_pricing_main_failover_host

В текущем параметре передается host name или ip адрес базы данных (если у базы нет FQDN)

jdbc_db_pricing_si_host

В текущем параметре передается host name или ip адрес базы данных (если у базы нет FQDN)

jdbc_db_pricing_si_failover_host

В текущем параметре передается host name или ip адрес базы данных (если у базы нет FQDN)

jdbc_db_pricing_main_ip

В текущих параметрах передается ip адреc базы данных приложения

jdbc_db_pricing_main_failover_ip

В текущих параметрах передается ip адрес базы данных приложения

jdbc_db_pricing_si_ip

В текущих параметрах передается ip адрес базы данных приложения

jdbc_db_pricing_si_failover_ip

В текущих параметрах передается ip адрес базы данных приложения

istio_ose_istio_egress_db_pricing_main_port

В текущих параметрах передается порт базы данных приложения

istio_ose_istio_egress_db_pricing_main_failover_port

В текущих параметрах передается порт базы данных приложения

istio_ose_istio_egress_db_pricing_si_port

В текущих параметрах передается порт базы данных приложения

istio_ose_istio_egress_db_pricing_si_failover_port

В текущих параметрах передается порт базы данных приложения

Параметры базы данных ekpit

Имя параметра

Описание

jdbc_db_ekpit_main_host

В текущем параметре передается host name или ip адрес базы данных ekpit (если у базы нет FQDN)

jdbc_db_ekpit_main_failover_host

В текущем параметре передается host name или ip адрес базы данных ekpit (если у базы нет FQDN)

jdbc_db_ekpit_si_host

В текущем параметре передается host name или ip адрес базы данных ekpit (если у базы нет FQDN)

jdbc_db_ekpit_si_failover_host

В текущем параметре передается host name или ip адрес базы данных ekpit (если у базы нет FQDN)

jdbc_db_ekpit_main_failover_ip

В текущих параметрах передается ip адрес базы данных ekpit

jdbc_db_ekpit_si_ip

В текущих параметрах передается ip адрес базы данных ekpit

jdbc_db_ekpit_si_failover_ip

В текущих параметрах передается ip адрес базы данных ekpit

jdbc_db_ekpit_main_ip

В текущих параметрах передается ip адрес базы данных ekpit

jdbc_db_ekpit_main_port

В текущих параметрах передается порт базы данных ekpit

jdbc_db_ekpit_main_failover_port

В текущих параметрах передается порт базы данных ekpit

jdbc_db_ekpit_si_port

В текущих параметрах передается порт базы данных ekpit

jdbc_db_ekpit_si_failover_port

В текущих параметрах передается порт базы данных ekpit

Параметры ПЖ

Имя параметра

Описание

aj_host_1

В текущем параметре передается Fqdn или ip адрес брокеров ПЖ (если у базы нет FQDN)

aj_host_2

В текущем параметре передается Fqdn или ip адрес брокеров ПЖ (если у базы нет FQDN)

aj_host_3

В текущем параметре передается Fqdn или ip адрес брокеров ПЖ (если у базы нет FQDN)

aj_host_4

В текущем параметре передается Fqdn или ip адрес брокеров ПЖ (если у базы нет FQDN)

aj_host_5

В текущем параметре передается Fqdn или ip адрес брокеров ПЖ (если у базы нет FQDN)

aj_host_6

В текущем параметре передается Fqdn или ip адрес брокеров ПЖ (если у базы нет FQDN)

aj_ip_1

В текущем параметре передается ip адрес брокеров ПЖ

aj_ip_2

В текущем параметре передается ip адрес брокеров ПЖ

aj_ip_3

В текущем параметре передается ip адрес брокеров ПЖ

aj_ip_4

В текущем параметре передается ip адрес брокеров ПЖ

aj_ip_5

В текущем параметре передается ip адрес брокеров ПЖ

aj_ip_6

В текущем параметре передается ip адрес брокеров ПЖ

aj_port_1

В текущих параметрах передается порт endpoint broker ПЖ

aj_port_2

В текущих параметрах передается порт endpoint broker ПЖ

aj_port_3

В текущих параметрах передается порт endpoint broker ПЖ

aj_port_4

В текущих параметрах передается порт endpoint broker ПЖ

aj_port_5

В текущих параметрах передается порт endpoint broker ПЖ

aj_port_6

В текущих параметрах передается порт endpoint broker ПЖ

После заполнения всех перечисленных параметров и подготовки ufc pipline можно приступать к установке.

Файл параметров установки#

Для обеспечения безопасности передаваемых данных используется mTLS + OTT. Все входящие и исходящие межсервисные соединения проходят через ingress/egress proxy. Для входящих/исходящих взаимодействий используются mTLS. Все входящие запросы проходят через router и ingress-proxy. Все исходящие запросы проходят через egress-proxy. На ingress/egress proxy реализованы механизмы аутентификации и авторизации через использование ОТТ.

Для исходящего трафика используется два сервиса Egress-istio:

  • dypx-egress – используется для «полезного трафика» приложения выступает в качестве балансировoщика и выходного шлюза на границе сервисной сети;

  • dypx-egress-2-0-mon – используется для сервисного трафика, предназначен для балансирования и терминации трафика на границе сети, для служб и сервисов аудита, логирования, мониторинга.

Шаблон установки, dypx-egress-2-0: istio-core-egress-nodev.yaml и dypx-egress-2-0-mon: istio-core-egress-mon-nodev.yaml Каждый из этих шаблонов разворачивает egress-envoy и ott сервис, подключенный как sidecar. Для активации авторизации на envoy с применением ott используется настройка envoyfiltra:

- apiVersion: networking.istio.io/v1alpha3
    kind: EnvoyFilter
    metadata:
      name: envoyfilter-dp-egress
    spec:
      configPatches:
        — applyTo: HTTP_FILTER
          match:
            context: GATEWAY
            listener:
              filterChain:
                filter:
                  name: envoy.http_connection_manager
              portNumber: xxxx
          patch:
            operation: INSERT_BEFORE
            value:
              name: envoy.ext_authz
              config:
                failure_mode_allow: false
                grpc_service:
                  google_grpc:
                    stat_prefix: ext_authz
                    target_uri: unix:/mnt/ott-uds-socket/ott.socket
                  timeout: 1s
                with_request_body:
                  allow_partial_message: false
                  max_request_bytes: 1048576
      workloadSelector:
        labels:
          app: ${EGRESSGATEWAY_NAME}-${DP_NAMESPACE}
          istio: ${EGRESSGATEWAY_ISTIO_LABEL}

pricing-egress-2-0-mon – использует два порта 8080 для http трафика и 5443 для mtls + ott в качестве выходного шлюза.

  — apiVersion: v1
    kind: Service
    metadata:
      name: svc-dp-egress-for-mon
      labels:
        app.kubernetes.io/component: istio-discovery
        app.kubernetes.io/instance: ${ISTIO_CONTROL_PLANE}
        app.kubernetes.io/managed-by: maistra-istio-operator
        app.kubernetes.io/name: istio-discovery
        app.kubernetes.io/part-of: istio
        app.kubernetes.io/version: ${ISTIO_VERSION}
        istio.io/rev: basic
        maistra-version: 2.0.2
        maistra.io/owner: ${ISTIO_CONTROL_PLANE}
        release: istio
    spec:
      ports:
        — {name: http-8080, port: 8080, protocol: TCP, targetPort: 8080}
        — {name: https-5443, port: 5443, protocol: TCP, targetPort: 5443}
      selector:
        app: ${EGRESS_MON_GATEWAY_NAME}-${DP_NAMESPACE}
        istio: ${EGRESS_MON_GATEWAY_ISTIO_LABEL}
    type: ClusterIP

pricing-egress-2-0 использует порт 5443 (mtls + ott), http 8080 в качестве выходного шлюза. Все остальные порты используются для маппинга портов.

  — apiVersion: v1
    kind: Service
    metadata:
      name: svc-dp-egress
      labels:
        app.kubernetes.io/component: istio-discovery
        app.kubernetes.io/instance: ${ISTIO_CONTROL_PLANE}
        app.kubernetes.io/managed-by: maistra-istio-operator
        app.kubernetes.io/name: istio-discovery
        app.kubernetes.io/part-of: istio
        app.kubernetes.io/version: ${ISTIO_VERSION}
        istio.io/rev: basic
        maistra-version: 2.0.2
        maistra.io/owner: ${ISTIO_CONTROL_PLANE}
        release: istio
    spec:
      ports:
        — {name: http-8080, port: 8080, protocol: TCP, targetPort: 8080}
        — {name: https-5443, port: 5443, protocol: TCP, targetPort: 5443}
        — {name: tcp-1518, port: 1518, protocol: TCP, targetPort: 1518}
        — {name: tcp-1521, port: 1521, protocol: TCP, targetPort: 1521}
        — {name: tcp-1522, port: 1522, protocol: TCP, targetPort: 1522}
        — {name: tcp-1523, port: 1523, protocol: TCP, targetPort: 1523}
        — {name: tcp-1524, port: 1524, protocol: TCP, targetPort: 1524}
        — {name: tcp-1525, port: 1525, protocol: TCP, targetPort: 1525}
        — {name: tcp-1526, port: 1526, protocol: TCP, targetPort: 1526}
        — {name: tcp-1527, port: 1527, protocol: TCP, targetPort: 1527}
        — {name: tcp-9092, port: 9092, protocol: TCP, targetPort: 9092}
        — {name: tcp-9093, port: 9093, protocol: TCP, targetPort: 9093}
        — {name: tcp-9094, port: 9094, protocol: TCP, targetPort: 9094}
        — {name: tcp-9095, port: 9095, protocol: TCP, targetPort: 9095}
        — {name: tcp-9096, port: 9096, protocol: TCP, targetPort: 9096}
        — {name: tcp-9097, port: 9097, protocol: TCP, targetPort: 9097}
        — {name: tcp-9098, port: 9098, protocol: TCP, targetPort: 9098}
        — {name: tcp-6543, port: 6543, protocol: TCP, targetPort: 6543}
        — {name: tcp-6544, port: 6544, protocol: TCP, targetPort: 6544}
        — {name: tcp-6545, port: 6545, protocol: TCP, targetPort: 6545}
      selector:
        app: ${EGRESSGATEWAY_NAME}-${DP_NAMESPACE}
        istio: ${EGRESSGATEWAY_ISTIO_LABEL}
    type: ClusterIP


Взаимодействие через mTLS+OTT#

- apiVersion: networking.istio.io/v1alpha3
   kind: ServiceEntry
   metadata:
     labels:
       external: integration-cr
     name: se-dp-cr-service
   spec:
     exportTo:
       — .
     hosts:
       — ${CR_HOST}
     location: MESH_EXTERNAL
     ports:
       — name: http-80
         number: 80
         protocol: HTTP
       — name: https-443
         number: 443
         protocol: TLS
     resolution: DNS
 — apiVersion: networking.istio.io/v1alpha3
   kind: Gateway
   metadata:
     labels:
       external: integration-cr
     name: gw-dp-egress-cr
   spec:
     selector:
       app: ${EGRESSGATEWAY_NAME}-${DP_NAMESPACE}
       istio: ${EGRESSGATEWAY_ISTIO_LABEL}
     servers:
       — hosts:
           — ${CR_HOST}
         port:
           name: http-5443
           number: 5443
           protocol: HTTP

 — apiVersion: networking.istio.io/v1alpha3
   kind: VirtualService
   metadata:
     labels:
       external: integration-cr
     name: vs-dp-egress-cr
   spec:
     exportTo:
       — .
     gateways:
       — gw-dp-egress-cr
       — mesh
     hosts:
       — ${CR_HOST}
     http:
       — match:
           — gateways:
               — mesh
             port: 80
         rewrite:
           authority: ${CR_HOST}
         route:
           — destination:
               host: svc-dp-egress
               port:
                 number: 5443
             weight: 100
         retries:
           attempts: 2
           perTryTimeout: 1s
           retryOn: gateway-error,connect-failure,refused-stream
       — match:
           — gateways:
               — gw-dp-egress-cr
             port: 5443
         route:
           — destination:
               host: ${CR_HOST}
               port:
                 number: 443
             weight: 100
         retries:
           attempts: 2
           perTryTimeout: 1s
           retryOn: gateway-error,connect-failure,refused-stream

# CR_HOST DestinationRule
 — apiVersion: networking.istio.io/v1alpha3
   kind: DestinationRule
   metadata:
     labels:
       external: integration-cr
     name: dr-dp-egress-cr
   spec:
     exportTo:
       — .
     host: ${CR_HOST}
     trafficPolicy:
       loadBalancer:
         simple: ROUND_ROBIN
       portLevelSettings:
         — port:
             number: 443
           tls:
             caCertificates: /etc/istio/gateway-ca-certs/ca.pem
             clientCertificate: /etc/istio/gateway-certs/tls.crt
             mode: MUTUAL
             privateKey: /etc/istio/gateway-certs/tls.key
             sni: ${CR_HOST}

Взаимодействие mTLS#

- apiVersion: networking.istio.io/v1alpha3
    kind: ServiceEntry
    metadata:
      labels:
        external: integration-individual-tariffs
      name: se-dp-individual-tariffs
    spec:
      exportTo:
        — .
      hosts:
        — ${INDIVIDUAL_TARIFFS_HOST}
      location: MESH_EXTERNAL
      ports:
        — name: http-80
          number: 80
          protocol: HTTP
        — name: https-443
          number: 443
          protocol: TLS
      resolution: DNS

  — apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      labels:
        external: integration-individual-tariffs
      name: gw-dp-egress-individual-tariffs
    spec:
      selector:
        app: ${EGRESSGATEWAY_NAME}-${DP_NAMESPACE}
        istio: ${EGRESSGATEWAY_ISTIO_LABEL}
      servers:
        — hosts:
            — ${INDIVIDUAL_TARIFFS_HOST}
          port:
            name: http-8080
            number: 8080
            protocol: HTTP

  — apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      labels:
        external: integration-individual-tariffs
      name: vs-dp-egress-individual-tariffs
    spec:
      exportTo:
        — .
      gateways:
        — gw-dp-egress-individual-tariffs
        — mesh
      hosts:
        — ${INDIVIDUAL_TARIFFS_HOST}
      http:
        — match:
            — gateways:
                — mesh
              port: 80
          route:
            — destination:
                host: svc-dp-egress
                port:
                  number: 8080
          retries:
            attempts: 2
            perTryTimeout: 1s
            retryOn: gateway-error,connect-failure,refused-stream
        — match:
            — gateways:
                — gw-dp-egress-individual-tariffs
              port: 8080
          route:
            — destination:
                host: ${INDIVIDUAL_TARIFFS_HOST}
                port:
                  number: 443
          retries:
            attempts: 2
            perTryTimeout: 1s
            retryOn: gateway-error,connect-failure,refused-stream

# INDIVIDUAL_TARIFFS_HOST DestinationRule
  — apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
      labels:
        external: integration-individual-tariffs
      name: dr-dp-egress-individual-tariffs
    spec:
      exportTo:
        — .
      host: ${INDIVIDUAL_TARIFFS_HOST}
      trafficPolicy:
        loadBalancer:
          simple: ROUND_ROBIN
        portLevelSettings:
          — port:
              number: 443
            tls:
              caCertificates: /etc/istio/gateway-ca-certs/ca.pem
              clientCertificate: /etc/istio/gateway-certs/tls.crt
              mode: MUTUAL
              privateKey: /etc/istio/gateway-certs/tls.key
              sni: ${INDIVIDUAL_TARIFFS_HOST}

- apiVersion: networking.istio.io/v1alpha3
    kind: ServiceEntry
    metadata:
      labels:
        external: integration-digital-price
      name: se-dp-digital-price
    spec:
      exportTo:
        — .
      hosts:
        — ${DIGITAL_PRICE_HOST}
      location: MESH_EXTERNAL
      ports:
        — name: http-80
          number: 80
          protocol: HTTP
        — name: https-443
          number: 443
          protocol: TLS
      resolution: DNS
  — apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      labels:
        external: integration-digital-price
      name: gw-dp-egress-digital-price
    spec:
      selector:
        app: ${EGRESSGATEWAY_NAME}-${DP_NAMESPACE}
        istio: ${EGRESSGATEWAY_ISTIO_LABEL}
      servers:
        — hosts:
            — ${DIGITAL_PRICE_HOST}
          port:
            name: http-8080
            number: 8080
            protocol: HTTP

  — apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      labels:
        external: integration-digital-price
      name: vs-dp-egress-digital-price
    spec:
      exportTo:
        — .
      gateways:
        — gw-dp-egress-digital-price
        — mesh
      hosts:
        — ${DIGITAL_PRICE_HOST}
      http:
        — match:
            — gateways:
                — mesh
              port: 80
          route:
            — destination:
                host: svc-dp-egress
                port:
                  number: 8080
          retries:
            attempts: 2
            perTryTimeout: 1s
            retryOn: gateway-error,connect-failure,refused-stream
        — match:
            — gateways:
                — gw-dp-egress-digital-price
              port: 8080
          route:
            — destination:
                host: ${DIGITAL_PRICE_HOST}
                port:
                  number: 443
          retries:
            attempts: 2
            perTryTimeout: 1s
            retryOn: gateway-error,connect-failure,refused-stream

# DIGITAL_PRICE_HOST DestinationRule
  — apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
      labels:
        external: integration-digital-price
      name: dr-dp-egress-digital-price
    spec:
      exportTo:
        — .
      host: ${DIGITAL_PRICE_HOST}
      trafficPolicy:
        loadBalancer:
          simple: ROUND_ROBIN
        portLevelSettings:
          — port:
              number: 443
            tls:
              caCertificates: /etc/istio/gateway-ca-certs/ca.pem
              clientCertificate: /etc/istio/gateway-certs/tls.crt
              mode: MUTUAL
              privateKey: /etc/istio/gateway-certs/tls.key
              sni: ${DIGITAL_PRICE_HOST}

Компонент Журналирование (LOGA) продукта Platform V Monitor#

  — apiVersion: networking.istio.io/v1alpha3
    kind: ServiceEntry
    metadata:
      labels:
        external: logger
      name: se-dp-logger-service
    spec:
      exportTo:
        — .
      hosts:
        — ${DP_LOGGER_CLUSTER}
      location: MESH_EXTERNAL
      ports:
        — name: http-80
          number: 80
          protocol: HTTP
        — name: https-443
          number: 443
          protocol: TLS
      resolution: DNS

  — apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      labels:
        external: logger
      name: gw-dp-egress-logger
    spec:
      selector:
        istio: ${EGRESS_MON_GATEWAY_ISTIO_LABEL}
      servers:
        — hosts:
            — ${DP_LOGGER_CLUSTER}
          port:
            name: http-5443 # Порт на egress MTLS+OTT
            number: 5443
            protocol: HTTP

  — apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      labels:
        external: logger
      name: vs-dp-egress-logger
    spec:
      exportTo:
        — .
      gateways:
        — gw-dp-egress-logger
        — mesh
      hosts:
        — ${LOGGER_HOST}
      http:
        — match:
            — gateways:
                — mesh
              port: 80
          rewrite:
            authority: ${DP_LOGGER_CLUSTER}
          route:
            — destination:
                host: svc-dp-egress-for-mon
                port:
                  number: 5443
              weight: 100
          retries:
            attempts: 2
            perTryTimeout: 1s
            retryOn: gateway-error,connect-failure,refused-stream
        — match:
            — gateways:
                — gw-cr-egress-logger
              port: 5443
          route:
            — destination:
                host: ${LOGGER_HOST}
                port:
                  number: 443
              weight: 100
          retries:
            attempts: 2
            perTryTimeout: 1s
            retryOn: gateway-error,connect-failure,refused-stream

  — apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
      labels:
        external: logger
      name: dr-cr-egress-logger
    spec:
      exportTo:
        — .
      host:  ${DP_LOGGER_CLUSTER}
      trafficPolicy:
        loadBalancer:
          simple: ROUND_ROBIN
        portLevelSettings:
          — port:
              number: 443
            tls:
              caCertificates: /etc/istio/gateway-ca-certs/ca.pem
              clientCertificate: /etc/istio/gateway-certs/tls.crt
              mode: MUTUAL
              privateKey: /etc/istio/gateway-certs/tls.key
              sni: ${LOGGER_HOST}

Компонент AUDT продукта Platform V Audit SE SE#

AUDIT
Взаимодействие MTLS + OTT
СТЕНД
ИФТ	${AUDIT_HOST}	ift.audit2-http-proxy-ott.ift-pprb-apps.ocp-geo.xxxxx.yyy.ru
НТ	${AUDIT_HOST}	demo.audit2-client-proxy.apps.dev-gen.maindomain.mycompany.ru
ПСИ	${AUDIT_HOST}	-
ПРОМ	${AUDIT_HOST}	-
  — apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      labels:
        external: integration-audit
      name: gw-dp-egress-audit
    spec:
      selector:
        istio: ${EGRESS_MON_GATEWAY_ISTIO_LABEL}
      servers:
        — hosts:
            — ${AUDIT_HOST}
          port:
            name: http-5443
            number: 5443
            protocol: HTTP

  — apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      labels:
        external: integration-audit
      name: vs-dp-egress-audit
    spec:
      exportTo:
        — .
      gateways:
        — gw-dp-egress-audit
        — mesh
      hosts:
        — ${AUDIT_HOST}
      http:
        — match:
            — gateways:
                — mesh
              port: 80
          rewrite:
            authority: ${AUDIT_HOST}
          route:
            — destination:
                host: svc-dp-egress-for-mon
                port:
                  number: 5443
              weight: 100
          retries:
            attempts: 2
            perTryTimeout: 1s
            retryOn: gateway-error,connect-failure,refused-stream
        — match:
            — gateways:
                — gw-dp-egress-audit
              port: 5443
          route:
            — destination:
                host: ${AUDIT_HOST}
                port:
                  number: 443
              weight: 100
          retries:
            attempts: 2
            perTryTimeout: 1s
            retryOn: gateway-error,connect-failure,refused-stream

  — apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
      labels:
        external: integration-audit
      name: dr-dp-egress-audit
    spec:
      exportTo:
        — .
      host: ${AUDIT_HOST}
      trafficPolicy:
        loadBalancer:
          simple: ROUND_ROBIN
        portLevelSettings:
          — port:
              number: 443
            tls:
              caCertificates: /etc/istio/gateway-ca-certs/ca.pem
              clientCertificate: /etc/istio/gateway-certs/tls.crt
              mode: MUTUAL
              privateKey: /etc/istio/gateway-certs/tls.key
              sni: ${AUDIT_HOST}

Взаимодействие с Platform V Exchange Rates#

# CRTX_HOST DestinationRule
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  labels:
    external: integration-crtx
  name: dypx-dr-egress-crtx
spec:
  exportTo:
    — .
  host: {{ istio_ose_istio_egress_crtx_host }}
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
    portLevelSettings:
      — port:
          number: 443
        tls:
          caCertificates: /etc/istio/gateway-ca-certs/ca.pem
          clientCertificate: /etc/istio/gateway-certs/tls.crt
          mode: MUTUAL
          privateKey: /etc/istio/gateway-certs/tls.key
          sni: {{ istio_ose_istio_egress_crtx_host }}
        connectionPool:
          tcp:
            connectTimeout: {{ istio_ose_istio_egress_destination_rule_crtx_TFP_CONN_POLL_TCP_CONN_TIMEOUT }}
            maxConnections: {{ istio_ose_istio_egress_destination_rule_crtx_TFP_CONN_POLL_TCP_MAX_CONN }}
          outlierDetection:
            consecutiveGatewayErrors: {{ istio_ose_istio_egress_destination_rule_crtx_OUT_DETECTION_CONSECUTIVE_GATEWAY_ERRORS }}
            interval: {{ istio_ose_istio_egress_destination_rule_crtx_OUT_DETECTION_INTERVAL }}
            baseEjectionTime: {{ istio_ose_istio_egress_destination_rule_crtx_OUT_DETECTION_BASE_EJECTION_TIME }}
            maxEjectionPercent: {{ istio_ose_istio_egress_destination_rule_crtx_OUT_DETECTION_MAX_EJECTION_PERCENT }}

Взаимодействие с системой Цифровая Цена#

# DIGITAL_PRICE_HOST DestinationRule
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  labels:
    external: integration-digital-price
  name: dypx-dr-egress-digital-price
spec:
  exportTo:
    — .
  host: {{ istio_ose_istio_egress_digital_price_host }}
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
    portLevelSettings:
      — port:
          number: 443
        tls:
          caCertificates: /etc/istio/gateway-ca-certs/ca.pem
          clientCertificate: /etc/istio/gateway-certs/tls.crt
          mode: MUTUAL
          privateKey: /etc/istio/gateway-certs/tls.key
          sni: {{ istio_ose_istio_egress_digital_price_host }}
        connectionPool:
          tcp:
            connectTimeout: {{ istio_ose_istio_egress_destination_rule_digital_price_TFP_CONN_POLL_TCP_CONN_TIMEOUT }}
            maxConnections: {{ istio_ose_istio_egress_destination_rule_digital_price_TFP_CONN_POLL_TCP_MAX_CONN }}
          outlierDetection:
            consecutiveGatewayErrors: {{ istio_ose_istio_egress_destination_rule_digital_price_OUT_DETECTION_CONSECUTIVE_GATEWAY_ERRORS }}
            interval: {{ istio_ose_istio_egress_destination_rule_digital_price_OUT_DETECTION_INTERVAL }}
            baseEjectionTime: {{ istio_ose_istio_egress_destination_rule_digital_price_OUT_DETECTION_BASE_EJECTION_TIME }}
            maxEjectionPercent: {{ istio_ose_istio_egress_destination_rule_digital_price_OUT_DETECTION_MAX_EJECTION_PERCENT }}

Обновление#

Обновление осуществляется так же как первоначальная установка: запускается задача установки с параметром updateMode равным fullInstall. В процедуру установки включен процесс обновления базы данных с помощью утилиты liquibase (не ниже версии 3.8.7). При обновлении продукта с помощью ручной установки, процедура обновления базы данных с помощью утилиты liquibase, выполняется вручную, смотрите раздел настоящего руководства Ручная установка. При обновлении продукта с помощью опционального варианта, процедура обновления базы данных с помощью утилиты liquibase, выполняется автоматически, смотрите раздел настоящего руководства Установка с помощью компонента Deploy tools Продукта Platform V DevOps Tools. Дополнительных настроек не требуется. Удаление предыдущей версии перед установкой обновления не требуется.

Удаление#

Удаление дополнительных средств защиты информации осуществляется в соответствии с документацией к ним. Для удаления продукта необходимо удалить в Kubernetes (OpenShift) следующие объекты:

  • ConfigMap:

  • dypx-cm-pricing-cloud-app-logback;

  • dypx-cm-pricing-cloud-app.

  • Deployment.

  • DeploymentConfig.

  • ServiceEntry.

  • VirtualService.

  • EnvoyFilter.

  • DestinationRule.

  • Gateway.

  • Service.

  • Route.

  • Policy.

Проверка работоспособности#

Проверку успешной установки необходимо проводить через web-интерфейс Среды контейнеризации.

Для проверки корректности установки:

  1. Проверьте, что задача установки завершилась со статусом SUCCESS (успешно).

  2. В веб-панели администратора Среды контейнеризации убедитесь, что все pod работоспособны (у всех контейнеров, входящих в pod, статус ready). Пример экрана web-панели администратора Среды контейнеризации в разделе с pod:

Без доступности БД Продукт не запуститься, признаки работоспособности приложения:

  • все приложения находятся в статусе «Running»;

  • нет pods в статусе «Error»;

  • в колонке «Ready» все контейнеры работают: 2/2, 3/3 и т.д;

  • в колонке «Created» должны появиться pods с текущей датой установки.

  1. Способ проверки взаимодействия по ОТТ. При инициировании запроса в продукт проверьте логи, если в логах нет ошибки и получен корректный ответ выполнено успешное обновление/установка.

  2. Проверить работоспособность интеграций. Для этого необходимо проверить лог-файлы на отсутствие ошибок.

При проверке работоспособности продукта, могут быть вызваны опциональные внешние сервисы интеграция с которыми может оказаться недоступна на момент проверки. В этом случае в ответном сообщении продукта будет отражен факт недоступности внешнего сервиса.

Откат#

Автоматической процедуры отката нет. При ручной установке для отката необходимо выполнить установку предыдущей стабильной версии в соответствии с настоящей инструкцией, пункт Установка текущего документа. Удаление предыдущей версии не требуется.

Часто встречающиеся проблемы и пути их устранения#

В данном разделе приведены наиболее частые проблемы и описаны пути их устранения.

Проблема

Причина

Способ устранения

Осталась старая версия приложения

Версия ПО не успела развернуться за timeout в 30 секунд

Выполнить команду rollout

Не успела обновиться сетевая конфигурация istio.

Повторить команду rollout через некоторое время. Время ожидания зависит от многих факторов (может составлять до 1,5 часов. Даная проблема не наблюдается при использовании Platform V Synapse Service Mesh 2.0. На версии 1.0 такая проблема возникала когда оператор не был ограничен namespace)

Произошли ошибки при старте приложения

Следует собрать логи с приложения, на котором возникает ошибка и связаться с разработкой. Возможные причины: ошибки в конфигурации, параметрах, сетевой маршрутизации, настройки баз данных, не верные сертификаты доступа и т.д.

Чек-лист валидации установки#

После установки необходимо проверить:

  • Для проекта в Среде контейнеризации создались объекты приложений на основании файлов конфигурации: DeploymentConfig, ConfigMap, Service, Route, Pod.

  • Для проекта в Среде контейнеризации создались объекты istio: ingress/egress на основании файлов конфигурации: Deployment, VirtualService, ServiceEntry, DestinationRule, Gateway, ConfigMap.

  • В логах отсутствуют ошибки.

  • Соединение с БД выполнено успешно.

  • Интеграции работоспособны.