Развертывание сервиса поиска и объединения дублей через
Kubernetes
В данной статье описан механизм установки, настройки и проверки сервиса поиска и объединения дублей через Kubernetes. Описание сервиса поиска и объединения дублей представлено в статье Сервис поиска и объединения дублей.
Подготовка к развертыванию
Перед установкой пакета сервиса поиска и объединения дублей выполните следующее:
- Для предоставления доступа к архиву с файлами для развертывания обратитесь в Техническую поддержку BPMSoft.
- Перед установкой убедитесь в том, что среда, на которую вы хотите устанавливать сервис, соответствует системным требованиям.
- Для работы необходимо настроить:
- Кластер Kubernetes. Подробно о том, как настроить и администрировать кластер, читайте на сайте документации Kubernetes;
- Пакетный менеджер Helm. Установка пакетного менеджера подробно описана на сайте документации Helm.
- Выполните удаление предыдущего релиза сервиса поиска и объединения дублей, если он у вас установлен. Подробнее: Удаление предыдущего релиза.
- Создайте namespace и добавьте необходимые секреты. Подробнее: Создание namespace и добавление секретов.
- Установите инфраструктурные компоненты, необходимые для работы сервиса глобального поиска. Подробнее: Развертывание инфраструктурных компонентов.
- Убедитесь, что в файле ConnectionStrings.config на стороне BPMSoft присутствует параметр elasticsearchCredentials.
После выполнения предварительных действий можно выполнить установку сервиса поиска и объединения дублей. Подробнее: Развертывание сервиса поиска и объединения дублей.
Удаление предыдущего релиза
Для удаления предыдущего релиза сервиса поиска и объединения дублей выполните следующее:
- Получите список установленных релизов, выполнив команду:
helm ls --namespace dd
- Выполните удаление развертывания сервиса поиска и объединения дублей, выполнив команду:
helm uninstall dd --namespace dd
Чтобы полностью удалить MongoDB, выполните следующие шаги:
- Войдите в Lens и перейдите в раздел Persistent Volume Claims. Выберите нужное пространство имен и удалите все Persistent Volume Claims, связанные с MongoDB.
- Перейдите в Lens → Persistent Volumes и удалите все Claim, связанные с MongoDB, у которых статус Released.
Создание namespace и добавление секретов
- Добавьте namespace, выполнив следующую команду:
kubectl create namespace dd
- Если используется свой прокси-репозиторий, то добавьте секрет, выполнив команду:
kubectl create secret docker-registry regcred --docker-server=repo.bpmsoft.ru --docker-username=<Пользователь> --docker-password=<Пароль> --namespace dd
Вместо repo.bpmsoft.ru можно указать свой прокси-репозиторий, а вместо <Пользователь> и <Пароль> — ваши данные.
Развертывание инфраструктурных компонентов
Инфраструктурные элементы сервиса устанавливаются отдельно. В таблице 1 указаны обязательные компоненты.
Таблица 1 — Описание инфраструктурных компонентов
| Название компонента | Краткая сводка | Автор | Источник | Версия helm | Версия приложения |
| MongoDB | NoSQL СУБД | Bitnami | oci://docker.company.ru/ghcr.io/hub.docker.com/bitnamicharts/mongodb | v16.5.1 | v8.0.9 |
MongoDB
Установка
- Выполните аутентификацию в OCI-прокси репозиторий вашей компании:
helm registry login <docker.company.ru>
- Перейдите в директорию, в которой будет располагаться helm chart. Выполните команду:
helm pull oci://<docker.company.ru>/hub.docker.com/bitnamicharts/mongodb --version 16.5.1
- В результате выполнения команды появится директория mongodb с helm chart. Перейдите в директорию:
cd mongodb
- Выполните команду для развертывания MongoDB:
helm install dd-mongodb oci://docker.company.ru/hub.docker.com/bitnamicharts/mongodb \
--version <16.5.1> \
--namespace <dd namespace> \
--create-namespace \
--set image.pullSecrets={regcred} \
--set global.security.allowInsecureImages=true \
--set image.repository=<docker.company.ru>/bitnamilegacy \
--set auth.enabled="false"
Описание параметров команды:
- version — версия helm чарта для установки MongoDB определенной версии. Подробнее с версиями helm чарта можно ознакомиться по ссылке;
- namespace — имя пространства имен для установки сервиса поиска и объединения дублей;
- image.pullSecrets={regcred} — указывает какой секрет использовать для подключения к Docker прокси-репозиторию;
- global.security.allowInsecureImages=true — разблокирует возможность установки docker образов с прокси репозитория;
- global.imageRegistry=<docker.company.ru>/bitnamilegacy — указывает прокси-репозиторий для скачивания Docker образов;
- auth.enabled="false" — установить значение false или true, в зависимости, будете вы использовать авторизацию для MongoDB или нет.
Обновление
Для обновления релиза необходимо выполнить следующую команду:
helm upgrade dd-mongodb oci://docker.company.ru/hub.docker.com/bitnamicharts/mongodb \
--version <16.5.1> \
--namespace <dd namespace> \
--create-namespace \
--set image.pullSecrets={regcred} \
--set global.security.allowInsecureImages=true \
--set image.repository=docker.company.ru/hub.docker.com \
--set auth.enabled="false"
Удаление
- Получите список доступных релизов:
helm ls --namespace dd
- Удалите развертывание MongoDB:
helm uninstall mongodb --namespace dd
- В Lens удалите все PVS, относящиеся к MongoDB.
Развертывание сервиса поиска и объединения дублей
После установки инфраструктурных компонентов переходите к установке компонентов микросервиса, указанных в таблице 2.
Таблица 2 — Компоненты сервиса поиска и объединения дублей
| Название компонента | Автор | Источник | Версия helm | Версия приложения |
| data-service-web-api | BPMSoft | hub.docker.com | 4.0.0 | 4.0.0 |
| task-api | ||||
| cleaner-api | ||||
| confirmation-api | ||||
| deletion-api | ||||
| preparation-api | ||||
| search-api | ||||
| task-diagnostic-api | ||||
| web-api |
- Распакуйте helm пакет из архива, который вы получили в технической поддержке BPMSoft, и перейдите в директорию, где будет располагаться распакованный пакет.
- Перед развертыванием необходимо ознакомиться с выбранным профилем и внести в него корректировки как минимум для следующих параметров:
- rabbitmq.server — адрес сервиса брокера сообщений RabbitMQ;
- dragonfly.server — адрес сервиса кэширования Redis или Dragonfly;
- config.endpoints.ddWebApiUrl — адрес сервиса конфигурирования компонентов сервиса поиска дублей;
- opentelemetry.server — адрес сервиса приема телеметрии от компонентов глобального поиска;
- opensearch.server — адрес сервиса OpenSearch.
Значения этих параметров определяют, к какому хосту (доменному имени) будут применяться правила маршрутизации на уровне Ingress-контроллера.
- Для развертывания приложений сервиса поиска и объединения дублей выполните одну из следующих команд на выбор:
helm install dd . \
--namespace dd
helm install dd . \
--namespace dd \
--set global.profile="demo-hub"
helm install dd . \
--namespace dd \
--set global.profile="demo-hub" \
--set global.overrideValues="true" \
--set images.tag= \
--set mongodb.auth_enabled=true \
--set mongodb.user= \
--set mongodb.password= \
--set rabbitmq.password=
Release name и Namespace должны быть одноименными (для корректной работы Grafana dashboards).
Откат изменений
Для отката изменений выполните следующее:
- Получите список релизов, выполнив команду:
helm ls --namespace dd
- Для удаления развертывания сервиса поиска и объединения дублей, выполните следующую команду:
helm uninstal --namespace dd
- Создайте директорию dd-old:
mkdir dd-old
- Распакуйте helm пакет c предыдущей версией сервиса поиска и объединения дублей и перейдите в директорию, где будет располагаться распакованный пакет.
- Выполните команду для развертывания приложений сервиса поиска и объединения дублей:
helm install dd --namespace dd --create-namespace bpmsoft/deduplication --version 3.1.5 \ --set webApi.ingress.enabled=true --set webApi.ingress.host=deduplication-api.omnichannel.ru --set webApi.ingress.className= --set global.elasticsearch.host=elk-bpm.omnichannel.ru \ --set global.rabbitmq.host=rabbit-bpm.omnichannel.ru --set global.rabbitmq.vhost=/deduplication --set global.rabbitmq.user=deduplication --set global.rabbitmq.password=deduplication \ --set global.redis.host=redis-bpm.omnichannel.ru --set global.redis.database=2 --set global.mongodb.host=mongo-bpm.omnichannel.ru --set global.mongodb.user=sa --set global.mongodb.password=123 \ --set dataService.mongodb.dbname=dup-bulk-deduplication --set dataService.mongodb.cache.dbname=dup-bulk-deduplication-cache --set log4Net.level=INFO --set log4Net.grayLog.enabled=true \ --set log4Net.grayLog.AMQP.host=rabbit-bpm.omnichannel.ru --set log4Net.grayLog.AMQP.virtualHost=/ --set log4Net.grayLog.AMQP.userName=deduplication \ --set log4Net.grayLog.AMQP.password=deduplication
Проверка работоспособности компонентов
Для проверки работоспособности системы используются Liveness и Readiness в манифестах deployments:
- Если поды развернутся корректно, при их проверке будут возвращаться коды 200. В Lens успешно запущенные поды будут иметь зеленый статус в разделе Containers;
- Если поды развернутся с ошибками, при их проверке будут возвращаться коды 500. В Lens поды с ошибками будут иметь оранжевый статус в разделе Containers, восклицательный знак в разделе "Namespace" и происходить рестарты подов.
Настройка на стороне BPMSoft
- Заполните системную настройку DeduplicationWebApiUrl значением URL к dd-web-api, строка следующего типа: http://external.deduplication-web-api:8086;
- Настройте права на системную операцию CanSearchDuplicates — раздайте права необходимым пользователям/ролям, которые смогут выполнять поиск дублей;
- Включите в системе функциональность массового поиска дублей. Для включения функциональности массового поиска дублей (Deduplication, ESDeduplication, BulkESDeduplication) необходимо выполнить SQL-скрипт:
- Скрипт включения функциональности для Microsoft SQL Server;
- Скрипт включения функциональности для PostgreSQL.
- Очистите кэш, перезапустите приложение и выполните вход в приложение.
Ресурсы
Скрипт включения функциональности для Microsoft SQL Server
DECLARE @DeduplicationFeature NVARCHAR(50) = 'Deduplication';
DECLARE @DeduplicationFeatureId UNIQUEIDENTIFIER = (SELECT TOP 1 Id FROM Feature WHERE Code = @DeduplicationFeature);
DECLARE @ESDeduplicationFeature NVARCHAR(50) = 'ESDeduplication';
DECLARE @ESDeduplicationFeatureId UNIQUEIDENTIFIER = (SELECT TOP 1 Id FROM Feature WHERE Code = @ESDeduplicationFeature);
DECLARE @Bulk_ES_DD_Feature NVARCHAR(50) = 'BulkESDeduplication';
DECLARE @Bulk_ES_DD_FeatureId UNIQUEIDENTIFIER = (SELECT TOP 1 Id
FROM Feature WHERE Code =@Bulk_ES_DD_Feature);
DECLARE @allEmployeesId UNIQUEIDENTIFIER = 'A29A3BA5-4B0D-DE11-9A51-005056C00008';
IF (@DeduplicationFeatureId IS NOT NULL)
BEGIN
IF EXISTS (SELECT * FROM AdminUnitFeatureState WHERE FeatureId = @DeduplicationFeatureId)
UPDATE AdminUnitFeatureState SET FeatureState = 1 WHERE FeatureId =@DeduplicationFeatureId
ELSE
INSERT INTO AdminUnitFeatureState (SysAdminUnitId, FeatureState, FeatureId) VALUES (@allEmployeesId, '1',
@DeduplicationFeatureId)
END;
ELSE
BEGIN
SET @DeduplicationFeatureId = NEWID()
INSERT INTO Feature (Id, Name, Code) VALUES
(@DeduplicationFeatureId, @DeduplicationFeature, @DeduplicationFeature)
INSERT INTO AdminUnitFeatureState (SysAdminUnitId, FeatureState, FeatureId) VALUES (@allEmployeesId, '1', @DeduplicationFeatureId)
END;
IF (@ESDeduplicationFeatureId IS NOT NULL)
BEGIN
IF EXISTS (SELECT * FROM AdminUnitFeatureState WHERE FeatureId = @ESDeduplicationFeatureId)
UPDATE AdminUnitFeatureState SET FeatureState = 1 WHERE FeatureId = @ESDeduplicationFeatureId
ELSE
INSERT INTO AdminUnitFeatureState (SysAdminUnitId, FeatureState, FeatureId) VALUES (@allEmployeesId, '1', @ESDeduplicationFeatureId)
END;
ELSE
BEGIN
SET @ESDeduplicationFeatureId = NEWID()
INSERT INTO Feature (Id, Name, Code) VALUES (@ESDeduplicationFeatureId, @ESDeduplicationFeature, @ESDeduplicationFeature)
INSERT INTO AdminUnitFeatureState (SysAdminUnitId, FeatureState, FeatureId) VALUES (@allEmployeesId, '1', @ESDeduplicationFeatureId)
END;
IF (@Bulk_ES_DD_FeatureId IS NOT NULL)
BEGIN
IF EXISTS (SELECT * FROM AdminUnitFeatureState WHERE FeatureId = @Bulk_ES_DD_FeatureId)
UPDATE AdminUnitFeatureState SET FeatureState = 1 WHERE FeatureId =@Bulk_ES_DD_FeatureId
ELSE
INSERT INTO AdminUnitFeatureState (SysAdminUnitId, FeatureState,FeatureId) VALUES (@allEmployeesId, '1', @Bulk_ES_DD_FeatureId)
END;
ELSE
BEGIN
SET @Bulk_ES_DD_FeatureId = NEWID()
INSERT INTO Feature (Id, Name, Code) VALUES (@Bulk_ES_DD_FeatureId, @Bulk_ES_DD_Feature, @Bulk_ES_DD_Feature)
INSERT INTO AdminUnitFeatureState (SysAdminUnitId, FeatureState, FeatureId) VALUES (@allEmployeesId, '1', @Bulk_ES_DD_FeatureId)
END;
↑ Вернуться к шагу Настройка на стороне BPMSoft
Скрипт включения функциональности для PostgreSQL
DO $$
DECLARE
DeduplicationFeature VARCHAR(50) := 'Deduplication';
DeduplicationFeatureId uuid;
ESDeduplicationFeature VARCHAR(50) := 'ESDeduplication';
ESDeduplicationFeatureId uuid;
Bulk_ES_DD_Feature VARCHAR(50) := 'BulkESDeduplication';
Bulk_ES_DD_FeatureId uuid;
allEmployeesId uuid := 'A29A3BA5-4B0D-DE11-9A51-005056C00008';
BEGIN
SELECT "Id" INTO DeduplicationFeatureId FROM "Feature"
WHERE "Code" = DeduplicationFeature
LIMIT 1;
IF (DeduplicationFeatureId IS NOT NULL)
THEN
IF EXISTS (SELECT * FROM "AdminUnitFeatureState" WHERE "FeatureId" = DeduplicationFeatureId) THEN
UPDATE "AdminUnitFeatureState" SET "FeatureState" = 1 WHERE "FeatureId" = DeduplicationFeatureId;
ELSE
INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState", "FeatureId") VALUES (allEmployeesId, '1', DeduplicationFeatureId);
END IF;
ELSE
DeduplicationFeatureId := uuid_generate_v4();
INSERT INTO "Feature" ("Id", "Name", "Code") VALUES (DeduplicationFeatureId, DeduplicationFeature, DeduplicationFeature);
INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState", "FeatureId") VALUES (allEmployeesId, '1', DeduplicationFeatureId);
END IF;
SELECT "Id" INTO ESDeduplicationFeatureId FROM "Feature"
WHERE "Code" = ESDeduplicationFeature
LIMIT 1;
IF (ESDeduplicationFeatureId IS NOT NULL)
THEN
IF EXISTS (SELECT * FROM "AdminUnitFeatureState" WHERE "FeatureId" = ESDeduplicationFeatureId) THEN
UPDATE "AdminUnitFeatureState" SET "FeatureState" = 1 WHERE "FeatureId" = ESDeduplicationFeatureId;
ELSE
INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState", "FeatureId") VALUES (allEmployeesId, '1', ESDeduplicationFeatureId);
END IF;
ELSE
ESDeduplicationFeatureId := uuid_generate_v4();
INSERT INTO "Feature" ("Id", "Name", "Code") VALUES (ESDeduplicationFeatureId, ESDeduplicationFeature, ESDeduplicationFeature);
INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState", "FeatureId") VALUES (allEmployeesId, '1', ESDeduplicationFeatureId);
END IF;
SELECT "Id" INTO Bulk_ES_DD_FeatureId FROM "Feature"
WHERE "Code" = Bulk_ES_DD_Feature
LIMIT 1;
IF (Bulk_ES_DD_FeatureId IS NOT NULL)
THEN
IF EXISTS (SELECT * FROM "AdminUnitFeatureState" WHERE "FeatureId" = Bulk_ES_DD_FeatureId) THEN
UPDATE "AdminUnitFeatureState" SET "FeatureState" = 1 WHERE "FeatureId" = Bulk_ES_DD_FeatureId;
ELSE
INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState", "FeatureId") VALUES (allEmployeesId, '1', Bulk_ES_DD_FeatureId);
END IF;
ELSE
Bulk_ES_DD_FeatureId := uuid_generate_v4();
INSERT INTO "Feature" ("Id", "Name", "Code") VALUES (Bulk_ES_DD_FeatureId, Bulk_ES_DD_Feature, Bulk_ES_DD_Feature);
INSERT INTO "AdminUnitFeatureState" ("SysAdminUnitId", "FeatureState", "FeatureId") VALUES (allEmployeesId, '1', Bulk_ES_DD_FeatureId);
END IF;
END $$;
↑ Вернуться к шагу Настройка на стороне BPMSoft