Руководство по установке#
В руководстве приведены инструкции по установке Продукта.
Системные требования#
Настройки безопасности окружения и перечень платформенных (дополнительных внешних) продуктов, используемых для установки, настройки и контроля в конечной информационной системе (далее — ИС), выбираются клиентом при разработке конечной ИС, исходя из характера обрабатываемой в ней информации и иных требований информационной безопасности (далее — ИБ), предъявляемых к ней.
Предусловия#
Системное программное обеспечение#
Ниже представлены категории системного программного обеспечения (далее — ПО), которые обязательны или опциональны для установки, настройки, контроля и функционирования компонента. В каждой категории перечислены все поддерживаемые продукты сторонних правообладателей. Отдельно обозначены варианты, которые рекомендует АО «СберТех» (маркировка «Рекомендовано» в столбце «Продукт, функциональная совместимость с которым подтверждена»). Клиенту необходимо выбрать один из продуктов в каждой категории, исходя из условий использования конечной ИС.
Категория ПО |
Обязательность установки |
Наименование ПО |
Версия |
Продукт, функциональная совместимость с которым подтверждена |
Назначение категории ПО |
|---|---|---|---|---|---|
Операционная система |
Да |
ОС Альт 8 СП |
10.0 |
Рекомендовано |
ОС контейнеров для запуска модулей компонента |
Среда контейнеризации |
Да |
1.0 |
Рекомендовано |
Платформа контейнеризации для запуска компонентов сервиса |
|
Red Hat OpenShift |
4.0 и выше |
Опционально |
|||
Средство контейнеризации |
Да |
1.23 и выше |
Рекомендовано |
Инструмент для автоматизации работы с контейнерами |
|
Инструмент сборки, тестирования, развертывания контейнеризированных приложений |
Да |
2.263.x и выше |
Рекомендовано |
Сервер автоматизации, используемый для внедрения непрерывной интеграции и непрерывной доставки (CI/CD) для проектов программного обеспечения |
|
Java-машина |
Да |
8 |
Рекомендовано |
Окружение для работы модулей компонента |
|
Система управления базами данных (СУБД) |
Да |
42.2.5 |
Рекомендовано. Правообладателем АО «СберТех» также рекомендована СУБД, основанная на PostgreSQL, – Platform V Pangolin SE, см. раздел «Платформенные зависимости» |
ПО, взаимодействующее с конечными пользователями, приложениями и базой данных для сбора и анализа данных |
|
Сервер приложений |
Да |
WildFly |
15.0.1.Finalе |
Рекомендовано |
СПО для тестирования, отладки и исполнения веб-приложений на основе Java |
Сервис ограничения входящих запросов |
Да |
Synapse Rate Limiter |
1.7 |
Рекомендовано |
Сервис, позволяющий ограничивать доступ к приложениям на основе задаваемых лимитов |
Сервис централизованного хранения репозиториев исходного кода |
Да |
15.0 |
Рекомендовано |
Хранение конфигураций при автоматизированной установке |
|
Система управления секретами |
Нет |
Secret Management System |
1.7.0 |
Рекомендовано |
Система управления аутентификационными данными сервисных аккаунтов или учетных записей |
Сервис интеграции и оркестрации микросервисов в облаке |
Да |
1.12 и выше |
Рекомендовано. Правообладателем АО «СберТех» также рекомендован сервис интеграции и оркестрации микросервисов в облаке, основанный на Istio, Platform V Synapse Service Mesh, см. раздел «Платформенные зависимости» |
Сервис интеграции микросервисов в облаке |
|
Система мониторинга (сбор и хранение метрик) |
Нет |
2.31 и выше |
Рекомендовано. Правообладателем АО «СберТех» также рекомендован Сервис для сбора прикладных и инфраструктурных метрик и отправки их в целевую систему хранения – Объединенный мониторинг Unimon Platform V Monitor, см. раздел «Платформенные зависимости» |
Система для сбора и хранения численных метрик |
|
Программа для обновления базы данных |
Да |
Liquibase |
4.5.0 и выше |
Рекомендовано |
Библиотека для отслеживания, управления и применения изменений схемы базы данных |
Сервис централизованного хранения репозиториев артефактов (хранилище артефактов) |
Да |
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.
На рисунке представлены необходимые параметры для сборки.
При первом запуске нажмите на кнопку Собрать. В результате будет создан интерфейс для 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')
}
Задайте метку Jenkins agenta, который существует в вашем окружении.
Заведите конфигурационный файл Settings.xml для maven.
В job передайте ссылки на текущий дистрибутив.
Выполните сборку.
Установка#
Существует два способа установки Продукта Platform V Dynamic Decisions:
Целевой (основной) способ с помощью ручной установки.
Опциональный вариант с помощью компонента Deploy tools (CDJE) Продукта Platform V DevOps Tools.
Ручная установка#
Текущий тип установки является целевым (основным) вариантом установки. Для ручной установки:
Скачайте дистрибутив на персональный компьютер.
Разархивируйте дистрибутив.
Подготовьте директорию:
Подготовьте 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 >
Установите все secret командой
kubectl apply -f <имя файла манифеста> -n <пространство имен для установки>
В результате будут созданы все секреты из блока extra-secrets в distib.yaml и secret-dypx.unver.
Шаблонизируйте в ручную yaml манифесты из дистрибутива.
Перейдите в директорию 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: ./<Директория для хранения итоговых манифестов>
Далее вызовите 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
В примере шаблонизируется сервис dypx-pricing-cloud-app и ему передаются параметры с соответствующим именем, а также дополнительные параметры которые общие для всех файлов.
В дистрибутиве находиться файл custom_property.conf.yml в текущий файл можно добавить недостающие переменные, которые напрямую подтягиваться с common репозитория.
Результат работы 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
Далее проверьте этот манифест и замените строки содержащие ${}. Так как efc pipline поддерживает различные механизмы шаблонизации, то могут быть переменные типа .${distrib.release.version} которые не были заменены.
Значение текущей переменной замените на unver, выполнив команду:
Kubectl apply -f <ваш обработаный. Манифест > -n <пространсвто имен в k8s>
Для успешного разворачивания любого сервиса разверните все манифесты в директории сервиса. Ручная установка завершена.
Подготовка к автоматизированному развертыванию#
Для подготовки к развертыванию продукта выполните следующие шаги:
Создание секрета в jenkins для доступа в Среду контейнеризации.
Создание задачи в jenkins по установке дистрибутива.
Создание секрета.
Создание файла _passwords.conf в репозитории common (См. пункт Разворачивание job компонента Deploy tools (CDJE) Продукта Platform V DevOps Tools.
Создание файла зависимых параметров установки (См. пункт Разворачивание job компонента Deploy tools (CDJE) Продукта Platform V DevOps Tools.
Создание секрета в jenkins для доступа в Среду контейнеризации
Секрет для доступа к проекту Среды контейнеризации представляет собой секрет с типом «Service Account Tokens».
Поле ID − имя секрета.
Description − описание назначения секрета.
Token − токен сервис аккаунта jenkins из Среды контейнеризации.
Получение токена Получение токена выполняется при создании сервисного аккаунта
Для того чтобы создать сервисный аккаунт (в случае его отсутствия):
Выполните команду.
kubectl create serviceaccount jenkins
В результате получите ответ.
serviceaccount "jenkins" created
Получите список секретов привязанных к сервисному аккаунту.
kubectl get serviceaccounts jenkins -o yaml
В полученном ответе найдите имя секрета, который содержит токен формата: <имя сервисного аккаунта>-token-*.
Выполните команду.
kubectl get secret <имя сервисного аккаунта>-token-* -o yaml
Пример ответа на вышеуказанную команду.
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#
Пререквизиты для установки: Перед установкой убедитесь, что выполнены все следующие условия:
Наличие у пользователя, производящего установку возможности создания репозиториев в GitLab CE, Nexus Public и получения прав на чтение/запись, включая права на чтение/запись в ветке master.
Наличие технической учетной записи для работы с репозиториями.
Должны быть созданы следующие репозитории GitLab CE в проектной области:
Репозитории pipeline, например:
dypx pipeline — репозиторий с кодовой базой релизов pipeline (на каждый стенд свой репозиторий, например dypx_pipeline_ift / dypx_pipeline_lt);
dypx_common — репозиторий с глобальными (одинаковыми для всех компонент в рамках одного стенда) переменными среды (на каждый стенд свой репозиторий, например dypx_common_ift / dypx_common_lt).
Репозитории с конфигурациями функциональных подсистем, например:
dypx_dypx (на каждый стенд свой репозиторий).
Должны быть прописаны доступы в репозитории по протоколам SSH + HTTP на чтение/запись во все ветки, в т.ч. в ветку master.
В Nexus Public должны быть размещены дистрибутивы разворачиваемых функциональных подсистем, к данным репозиториям должен быть доступ с правами на чтение для технической учетной записи.
В Nexus Public должны быть созданы следующие репозитории, в которые загружены дистрибутивы всех компонентов pipeline (Installer.Base, Installer.Migration, Installer.Common):
AS_EFS_Installer.Base* — глобальные настройки и утилиты для pipeline;
AS_EFS_Installer.Migration — дистрибутив утилиты миграции;
AS_EFS_Installer.Common — базовый дистрибутив common — это глобальные параметры по умолчанию для pipeline. К перечисленным в данном пункте репозиториям должен быть доступ с правами на чтение для ТУЗ.
В GitLab CE должны быть созданы репозитории, в которые загружены дистрибутивы всех компонентов pipeline.
Подготовка инструментов развертывания#
Предусмотрены следующие инструменты развертывания:
JOB Service — job обновления (первичная загрузка кода JOB Deploy на полигон, обновление кода JOB Deploy при выпуске новых релизов JOB Deploy);
JOB Deploy — job развертывания дистрибутивов.
Далее перейдите к созданию секретов и последующих параметров, касающихся сервиса.
Пример. Создание секрета входного шлюза
Секрет входного шлюза состоит из двух ресурсов типа secret. Создание ресурса выполняется с помощью утилиты командной строки − OC client с локальной машины.
Перед началом создания секретов получите следующие файлы:
приватный ключ;
серверный сертификат, подписанный удостоверяющим центром;
цепочка сертификатов.
Выпуск сертификата для создания секрета входного шлюза#
Выдача сертификатов осуществляется удостоверяющим центром.
Выполните следующие шаги:
Создайте конфигурационный файл запроса на сертификат 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
Подпишите сертификат в вашем УЦ.
Получите файл request.cer (подписанный сертификат в формате DER) и цепочку сертификатов, которым он подписан.
Преобразуйте полученный сертификат в формат PEM.
openssl x509 −inform DER −in request.cer −out tls.crtПреобразуйте полученный корневой сертификат в формат PEM.
openssl x509 −inform DER −in "Test Root CA 2.cer" −out root.pemПреобразуйте полученный промежуточный сертификат в формат PEM.
openssl x509 −inform DER −in "Test Issuing CA 2.cer" −out issuing.pemОбъедините корневой и промежуточный сертификат в один файл.
cat root.pem issuing.pem > ca.pemПолучите три файла:
tls.key − приватный ключ;
tls.crt − серверный сертификат;
ca.pem − доверенная цепочка.
Создание секретов#
Дальнейшие действия проводятся в проекте, где у пользователя есть права на создание секретов. Сами файлы секретов хранятся в common репозитории в зашифрованном виде.
Для создания секретов в Среде контейнеризации изучите файл 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"
]
В случае использование компонента 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) |
Далее зашифруйте файл _password.conf согласно инструкции компонента Deploy tools (CDJE) Продукта Platform V DevOps Tools. Для простоты шифрования существует возможность воспользоваться скриптом шифрования на powerShell. Создайте файл с тем же именем, что и файл который должен быть зашифрован, добавьте к имени окончание “_d”. Далее скрипт найдет все файлы с окончанием “_d” и зашифрует создав файл без окончания “_d”.
В файл .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')
}
Далее создайте файлы в директории 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:
Включите в trust store сертификат УЦ, который выпустил SSL−сертификат серверов OTT.
Скачайте файл УЦ посредствами браузера, подключившись к серверу OTT (https://<ott−server>:8443/).
Для импорта полученного сертификата в 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, как место хранения секретов, необходимо выполнить следующие действия:
Перейти в репозитории dypx_dypx в директорию /config/package/conf/, открыть конфигурационный файл в custom_property.conf.yml.
Проверить, что для параметра конфигурации SECMAN_ENABLED задано значение true, если нет, то указать это значение. В обратном случае будет работать механизм секретов OpenShift (Kubernetes).
SECMAN_ENABLED: true;
Настройка параметров работы Secret Management System#
Параметры работы Secret Management System заданы по умолчанию, но при необходимости их можно переопределить. Для этого нужно выполнить следующие действия:
Задать с помощью 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 |
При необходимости параметры, заданные в 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}
Проверить, что секреты содержат необходимые параметры.
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, необходимо выполнить действия:
В репозитории с настройками Rate Limiter открыть конфигурационный файл в custom_property.conf.yml.
Проверить, что для параметра конфигурации 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 был сгенерирован автоматически, необходимо выполнить действия:
Перейти в репозиторий /config/package/conf/, открыть для редактирования файл custom-propery.conf.yml.
В поле 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: |
rlserver |
Адрес RLS-сервера (для децентрализованной установки следует указать hadless server rls например: «rate-limiter-headless-service», для централизованной установки здесь следует указать сервис Egress Gateway вашего namespace, рекомендованный формат — <headless_service_name>. |
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
Параметр |
Описание |
Пример |
|---|---|---|
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, необходимо выполнить следующие действия:
Задать настройки в манифестах в среде контейнеризации. Большинство обязательных labels метрики будут добавлены автоматически на этапе сбора Unimon-agent. Но в прикладное приложение необходимо самостоятельно добавить следующие labels:
app — имя приложения;
version — версия приложения;
Эти параметры необходимо добавить в labels POD приложения.
Добавить в метрики 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 |
Для получения приватной части сертификата:
Администратор прикладного модуля: выполняет генерацию ключевой пары в p12−контейнере.
keytool −genkey −keyalg EC −sigalg SHA256withECDSA −keystore ${module_id}.p12 −storetype PKCS12 −keysize 256 −dname "CN=${module_id}" −alias ${module_id}Рекомендуется использовать версию OpenJDK не ниже 11
Администратор прикладного модуля: формирует запрос на сертификат.
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 в заявке на генерацию сертификата для модуля. В заявке указать, что сертификат должен быть сгенерирован из приложенного запроса по данной инструкции.
Администратор OTT: выписывает сертификат.
./ejbcawsracli.sh certreq %{module_id} "CN=%{module_id}" NULL PlatformCA_EC PPRBModule %{module_id}_cert_req.pem PKCS10 PEM NONEВ результате выполнения данной команды будет создан файл с сертификатом− %{module_id}.pem, который необходимо передать Администратору прикладного модуля.
Администратор OTT: вместе с сертификатом модуля передает сертификат УЦ OTT PlatformCA_EC.pem. CN=PlatformCA_EC CA certificate: Download as PEM
Администратор прикладного модуля: импортирует сертификат УЦ 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}После выполнения шагов должно быть два файла (необязательно с такими именами):
ott_service_truststore.p12 − публичная часть (truststore);
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-интерфейс Среды контейнеризации.
Для проверки корректности установки:
Проверьте, что задача установки завершилась со статусом SUCCESS (успешно).
В веб-панели администратора Среды контейнеризации убедитесь, что все pod работоспособны (у всех контейнеров, входящих в pod, статус
ready). Пример экрана web-панели администратора Среды контейнеризации в разделе с pod:

Без доступности БД Продукт не запуститься, признаки работоспособности приложения:
все приложения находятся в статусе «Running»;
нет pods в статусе «Error»;
в колонке «Ready» все контейнеры работают: 2/2, 3/3 и т.д;
в колонке «Created» должны появиться pods с текущей датой установки.
Способ проверки взаимодействия по ОТТ. При инициировании запроса в продукт проверьте логи, если в логах нет ошибки и получен корректный ответ выполнено успешное обновление/установка.
Проверить работоспособность интеграций. Для этого необходимо проверить лог-файлы на отсутствие ошибок.
При проверке работоспособности продукта, могут быть вызваны опциональные внешние сервисы интеграция с которыми может оказаться недоступна на момент проверки. В этом случае в ответном сообщении продукта будет отражен факт недоступности внешнего сервиса.
Откат#
Автоматической процедуры отката нет. При ручной установке для отката необходимо выполнить установку предыдущей стабильной версии в соответствии с настоящей инструкцией, пункт Установка текущего документа. Удаление предыдущей версии не требуется.
Часто встречающиеся проблемы и пути их устранения#
В данном разделе приведены наиболее частые проблемы и описаны пути их устранения.
Проблема |
Причина |
Способ устранения |
|---|---|---|
Осталась старая версия приложения |
Версия ПО не успела развернуться за 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.
В логах отсутствуют ошибки.
Соединение с БД выполнено успешно.
Интеграции работоспособны.
