Установка#
Выбор способа установки#
Установка дистрибутива производится с использованием одного из вариантов:
Ручная установка без использования скриптов развертывания;
Ручная установка с использованием инструмента установки Platform V Monitor, расположенного в дистрибутиве по пути package/bh/installer/deploy-pvm.zip (инструкция по его использованию находится внутри архива);
Автоматическая установка (опционально) компонентом Deploy tools в составе Platform V DevOps Tools.
Установка на стенды k8s#
Ниже в разделе - Конфигурирование указаны стендозависимые параметры для заполнения, которые применимы для различных сред контейнеризации, в том числе и k8s. Автоматическая установка Единого коллектора телеметрии в среде k8s возможна с помощью компонента Deploy tools. Для применения специфичных конфигураций k8s необходимо выполнить донастройку multiCluster.json в common-репозитории. А именно, добавить секцию overrides с пустым значением и проверить корректность значения указанной ControlPlane. Пример:
{
"datacenters": {
"stands-vdc01-(st-xxxx-01-k8s)": {
"openshiftCluster": "https://api.k8s.xxxxx.wwwww.zzz:6443",
"openshiftSATokenCred": "xxxx-st-sa-k8s",
"openshiftProjectName": "tribe-om-st-xxxxx-01",
"openshiftAppsDomain": "apps.k8s.xxxxx.wwwww.zzz",
"openshiftControlPlane": "gt-xxx-eee-controlplane-01",
"openshiftWebConsole": "https://console.apps.k8s.xxxxx.wwwww.zzz/k8s/cluster/projects",
"openshiftRoutersFQDN": [
"1.1.1.1"
],
"overrides": [
""
]
}
}
}
Также необходимо проверить заполнение параметров в конфигурационном файле telemetry-collector.all.conf
Параметры отвечают за SecurityContext для pod в Kubernetes
* fs-group (spec.securityContext.fsGroup) - Group ID владельца файлов в Volume. Определяет группу, в которой Kubernetes будет изменять разрешения для всех файлов в томах, когда тома монтируются в Pod
telemetry-collector.k8s.deployment.spec.template.spec.securityContext.fsGroup=
* uid (spec.securityContext.runAsUser) - ID пользователя в контейнере.
telemetry-collector.k8s.deployment.spec.template.spec.securityContext.runAsUser=
Подготовка окружения#
Настройка Apache Kafka#
Статическая конфигурация#
Для корректной работы Единого коллектора необходимы настройки Apache Kafka. Выполнить их можно автоматически или вручную.
Автоматизированная настройка представляет собой автоматическое создание приведенных ниже топиков Apache Kafka и добавление прав. Чтобы воспользоваться автоматизированной настройкой, нужно сконфигурировать и выбрать playbook при установке Единого коллектора компонентом Deploy tools. Подробно конфигурирование описано в документе Автоматизированная настройка Apache Kafka, который поставляется в рамках документации на компонент Alert Manager (ALRT).
Для настройки Apache Kafka вручную, когда отсутствует возможность выдачи прав на CLUSTER необходимо отключить создание ACL (acl_mode=false) при создании топиков и вручную назначить права для клиентского сертификата, который будет использоваться приложением:
Resource type |
Resource name |
Principal |
Host |
Operation |
Permission type |
Pattern type |
|---|---|---|---|---|---|---|
CLUSTER |
kafka-cluster |
DN сертификата |
* |
IDEMPOTENT_WRITE |
ALLOW |
LITERAL |
transactional-id |
TC_TX |
DN сертификата |
* |
WRITE |
ALLOW |
PREFIXED |
transactional-id |
TC_TX |
DN сертификата |
* |
DESCRIBE |
ALLOW |
PREFIXED |
TOPIC |
{prefix} |
DN сертификата |
* |
DESCRIBE |
ALLOW |
PREFIXED |
TOPIC |
{prefix} |
DN сертификата |
* |
DESCRIBE_CONFIGS |
ALLOW |
PREFIXED |
TOPIC |
{prefix} |
DN сертификата |
* |
READ |
ALLOW |
PREFIXED |
TOPIC |
{prefix} |
DN сертификата |
* |
WRITE |
ALLOW |
PREFIXED |
GROUP |
* |
DN сертификата |
* |
READ |
ALLOW |
LITERAL |
Параметр для указания {prefix} указан ниже.
Примеры команд для добавления прав:
sudo ./kafka-acls --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=zookeeper:2181 \ --add --allow-principal User:* --operation WRITE --operation DESCRIBE --transactional-id TC_TX \ --resource-pattern-type prefixed
sudo ./kafka-acls --authorizer kafka.security.auth.SimpleAclAuthorizer --add --allow-principal User:* --operation IdempotentWrite --cluster
В процессе работы Единый коллектор будет взаимодействовать со следующими топиками Kafka:
Все перечисленные топики обязательны, кроме {prefix}.runtime-secret-refresh, он необходим только при интеграции с Secman. Подробная информация о создании и настройке представлена в Руководстве оператора сервиса Abyss (LGDB). {prefix} - префикс, задается параметром telemetry_collector.ose.common.kafka_internal_topic_prefix в конфигурационном файле telemetry-collector.all.conf, имеет значение по умолчанию "telemetry-collector".
№ |
Название топика |
Описание |
Рекомендуемое количество партиций |
Рекомендуемое значение retention.policy |
|---|---|---|---|---|
1 |
{prefix}.quota-limit-count-per-minute-exceed-queue |
Топик для сообщений о превышениях квоты |
3-5 |
1 час |
2 |
{prefix}.quota-usage-topic |
Топик для сообщений об использовании квоты |
3-5 |
1 час |
3 |
{prefix}.pull-pipeline-events-queue |
Топик для сообщений об изменении pull-pipelines |
3-5 |
1 час |
4 |
{prefix}.push-pipeline-events-queue |
Топик для сообщений об изменении push-pipelines |
3-5 |
1 час |
5 |
{prefix}.pull-pipeline-test |
Топик для сообщений о тестировании pull-pipelines |
3-5 |
1 час |
6 |
{prefix}.push-pipeline-test |
Топик для сообщений о тестировании push-pipelines |
3-5 |
1 час |
7 |
{prefix}.lock-events-queue |
Топик для сообщений о наступлении действия блокировки |
3-5 |
1 час |
8 |
{prefix}.runtime-secret-refresh |
Топик для сообщений об изменении секретов (необходим только при интеграции с Secman) |
3-5 |
1 час |
9 |
{prefix}.data-source-events-queue |
Топик для сообщений об обновлении datasources |
3-5 |
1 час |
Для топиков необходимо обязательно выставить ACLs для чтения и записи.
Динамическая конфигурация#
Динамические топики, на текущий момент необязательны. Нужны они только, если какой-либо проект будет использовать pull-processing, с распределением через Kafka (способ запуска проверок - CRON_ASYNC_KAFKA). Для их работоспособности нужно будет вручную создать топик с именем вида: "{prefix}.pull-processing-queries_" + project_name, где project_name - это имя соответствующего проекта.
Количество партиций должно быть минимум равно количеству instance pull-коллектора текущей инсталляции.
Retention-policy может быть небольшим, например, 1 час.
Подключение к внутренней Apache Kafka#
Сервис предусматривает возможность использования различных инсталляций Apache Kafka:
для внутренних нужд;
для распределения нагрузки Pull Collector рекомендуется использовать одну инсталляцию, для этого нужно для различных параметров задать одинаковые параметры (см. таблицу ниже).
Общее назначение |
Параметр |
Наименование |
Список микросервисов |
Значения |
|---|---|---|---|---|
Настройка соединения с Apache Kafka |
kafka.internal.bootstrap-servers и kafka.internal.pull.bootstrap-servers |
Настройки подключения к внутренней Apache Kafka (internal и internal.pull) |
Management Application, Pull Collector, Push Collector |
true |
Конфигурирование#
Ниже представлено описание стендозависимых параметров, содержащихся в конфигурационных файлах:
resources/telemetry-collector.all.conf
Общее назначение |
Параметр |
Описание |
Пример заполнения |
|---|---|---|---|
Настройки Apache Kafka для внутреннего использования |
ssl.store.securityProtocol |
Протокол безопасности для внутреннего взаимодействия |
SSL |
kafka.internal.bootstrap-servers |
Список хостов/портов, которые будут использоваться для установления первоначального подключения к кластеру Kafka |
host1:port1,host2:port2,… |
|
kafka.internal.pull.bootstrap-servers |
Список хостов/портов для внутреннего использования, которые будут использоваться для установления первоначального подключения к кластеру Kafka |
host1:port1,host2:port2,… |
|
Настройки подключения к БД |
postgres.host |
Хост + порт (или список хостов) для подключения к БД |
xx-postgres-01.opsmon.xxx:port1, xx-postgres-01.opsmon.xxx:port2 |
database.pvm_collector.hikari.pool_name |
Имя пула БД |
pvm_collector |
|
database.pvm_collector.hikari.maximum-pool-size |
Количество одновременно возможных подключений к БД |
20 |
|
database.pvm_collector.name |
Наименование БД, если необходимо задать дополнительные параметры для БД, в значении указать символ ? и после него дополнительные параметры |
dbname?targetServerType=master&prepareThreshold=0 |
|
database.pvm_collector.schema |
Схема БД |
telemetry_collector |
|
database.shedlock.hikari.pool_name |
Имя пула БД блокировок |
pvm_collector |
|
database.shedlock.hikari.maximum-pool-size |
Количество одновременно возможных подключений к БД shedlock |
10 |
|
database.shedlock.name |
Наименование базы данных блокировок (shedlock) |
telemetry_collector_db |
|
database.shedlock.schema |
Схема БД для подключения к базе данных блокировок |
telemetry_collector |
|
Многопоточность при маршрутизации |
config.env.pipeline.execution.synchronization |
Параметр для указания того, нужно ли использовать многопоточность при маршрутизации (sync, async) |
async |
Настройки аутентификации и авторизации |
service.core.secure.url |
URL API сервиса авторизации, входящего в состав компонента Abyss (LGDB) |
http://{HOST}/pvm_auth/v1 |
service.core.project.url |
URL API сервиса проектов |
http://{HOST}/coordinator/api/gateway/v1 |
|
auth.jwksUrl |
Endpoint IAM Proxy, по которому можно получить JWKS-ключ для сверки с тем, что указан в токене |
http://{HOST}/auth/realms/PlatformAuth/protocol/openid-connect/certs |
|
service.core.secure.auth.field |
Наименование поля в токене, указывающее на идентификатор пользователя, используемый в сервисе авторизации, входящего в состав компонента Abyss (LGDB) |
sub |
|
authentication.api-key.enabled |
Включение аутентификации с использованием API-ключей |
true |
|
authentication.api-key.stub-value |
Включение заглушки для аутентификации с использованием API-ключей |
||
authentication.api-key.cache.ttl.seconds |
Длительность кеширования запросов получения пользователя по API-ключу в секундах (по умолчанию 300 с) |
60 |
|
authentication.api-key.cache.max.records |
Максимальный размер кеш для API-ключей (по умолчанию 100) |
100 |
|
client.cache.ttl.seconds |
Длительность кеширования запросов (pipeline, проектов, прав) в секундах. (по умолчанию 120 с) |
120 |
|
client.cache.max.records |
Максимальный размер кеш запросов (pipeline, проектов, прав). (по умолчанию 1000) |
1000 |
|
Параметры Docker Image |
registry |
Адрес registry |
ddo.xx.xxx.space |
registry_path |
Путь до образа Единого коллектора телеметрии (должен начинаться с"/") |
/sss/ci0000000_tlmcltr |
|
registry.fluent-bit.repo |
Путь до образа FluentBit Sidecar |
/sss_dev/ci0000000_xxxxxxxx_dev |
|
image.pull.secrets.name |
Имя секрета для скачивания образа из registry |
opsmon-image-pull |
|
Роутинг |
stand.name |
Имя стенда |
st |
Отключение Istio для Pull Collector |
istio.pull.enabled |
Признак использования Istio для Pull Collector |
false |
Конфигурация аудита |
audit.enabled |
Признак использования аудита |
true |
audit.useLog |
Признак записи событий аудита в лог |
true |
|
audit.nodeId |
Идентификатор узла |
telemetry-collector |
|
audit.url |
URL аудита |
http://{HOST} |
|
Дополнительная конфигурация сервиса |
pipeline-management.processors.sort-by-pipeline-order |
Определяет необходимость сортировки процессоров в API методах поставляющих список процессоров в составе pipelines |
true |
telemetry.collector.datasource.pool.enabled |
Признак использования пула hikari. Рекомендуется включить пулы соединений на основе результатов НТ. |
true |
|
spring.zipkin.enabled |
Признак активности трассировки распределенной системой отслеживания данных в формате Zipkin |
true |
|
spring.zipkin.base-url |
Базовый URL для отправки трассировок Zipkin в Единый коллектор телеметрии |
http://{host}:{port}/push/project/{projectName}/pipeline/{pipelineName} , где {projectName} - имя проекта, используемого для сбора данных, {pipelineName} - имя pipeline |
|
management_app.host |
Хост Management Application |
xxx-telemetry-collector-management-app |
|
management_app.port |
Порт Management Application |
8082 |
|
logging.path |
Путь к лог-файлам |
/fluent-bit/etc/logs |
|
logback.path |
Путь до файла конфигурации logback |
/etc/telemetry-collector/logging |
|
logger.labels.standid |
Имя стенда для поиска логов по этому стенду |
st |
|
authentication.api-key.validation.url |
URL Abyss, отвечающий за валидацию Api ключей |
http://{HOST} |
resources/telemetry-collector.collector-pull.conf
Общее назначение |
Параметр |
Описание |
Пример заполнения |
|---|---|---|---|
Настройки ОТТ |
collector_pull.ose.common.ott_enabled |
Признак использования сервиса OTT для Pull Collector |
true |
resources/telemetry-collector.ott-sidecar.all.conf
Общее назначение |
Параметр |
Описание |
Пример заполнения |
|---|---|---|---|
Настройки ОТТ |
ott.sidecar.enabled |
Признак использования сервиса OTT |
true |
ott.module.id |
Идентификатор модуля |
tlmcltr |
|
ott.client.tls |
Версия протокола TLS для подключения к серверам OTT |
TLSv1.2 |
|
ott.authz.realm |
Значение realm для аутентификации |
ott |
|
ott.module.attribute.id |
Атрибут контекста авторизации, в котором передается идентификатор приложения/namespace в OTT |
urn:ssss:names:pppp:1.0:module:id |
|
ott.token.type.attribute.id |
Атрибут контекста авторизации, в котором передается тип запрашиваемого токена |
urn:ssss:names:pppp:1.0:token:type |
|
ott.service.cert.alias |
Alias сертификата сервиса |
tlmcltr |
|
ott.client.cert.alias |
Alias сертификата клиента |
tlmcltr |
resources/telemetry-collector-push.conf
Общее назначение |
Параметр |
Описание |
Пример заполнения |
|---|---|---|---|
Настройки аутентификации/авторизации Push Collector |
collector_push.ose.configmap.collector_push.authorization_enabled |
Признак использования авторизации для Push Collector |
false |
collector_push.ose.configmap.collector_push.authentication_enabled |
Признак использования аутентификации для Push Collector |
false |
|
collector_push.ose.configmap.collector_push.authentication_jwt_enabled |
Признак использования аутентификации с использованием jwt токена для Push Collector |
false |
|
collector_push.ose.configmap.collector_push.service_core_project_enabled |
Признак использования режима проверки соответствия доступа пользователя к проекту для Push Collector |
false |
|
authorization.cache.ttl.seconds |
Длительность кеширования запросов авторизации по проекту в секундах для модуля push (по умолчанию 120 с) |
120 |
|
pipeline.cache.ttl.seconds |
Длительность кеширования запросов получения проектов по наименованию для модуля push (по умолчанию 60 с) |
60 |
|
Размеры заголовков |
collector_push.max.http.header.size |
Настройка максимального размера заголовка при обращении к collector_push |
32Kb |
resources/telemetry-collector.istio.all.conf
Общее назначение |
Параметр |
Описание |
Пример заполнения |
|---|---|---|---|
Настройки Vault агента |
istio.egress.common.vault_gateway_port |
Внутренний порт на Egress при обращении к Secman |
0000 |
istio.image.pull.secrets.name |
Имя секрета для скачивания образа Envoy |
opsmon-image-pull |
|
Настройки для маппинга Istio |
service.auth.api.host |
Хост сервиса аутентификации |
xx-keycloak-01.opsmon.xxx |
service.core.api.host |
Хост сервиса проектов |
xx-abyss-nginx-01.opsmon.sss |
|
service.audit.host |
Хост сервиса Audit |
xx-xxx.audit2-xxxxx.apps1.solution.sss |
|
service.abyss.host |
Адрес хоста сервиса Abyss (LGDB) |
xxxx-abyss-xxxxx-01.oooooo.sss |
|
service.auth.api.port |
Порт сервиса аутентификации (указывается реальный порт) |
0000 |
|
service.core.api.port |
Порт сервиса проектов |
000 |
|
service.audit.port |
Порт сервиса Audit |
000 |
|
service.abyss.port |
Порт сервиса Abyss |
0000 |
|
istio.egress.common.pg_balancer_virtual_port |
Внутренний (mesh) порт при обращении к БД Postgres |
5002 |
resources/telemetry-collector.management-app.conf
Общее назначение |
Параметр |
Описание |
Пример заполнения |
|---|---|---|---|
Настройки авторизации/аутентификации Management Application |
management_app.ose.configmap.management_app.authorization_enabled |
Признак использования авторизации для Management app |
true |
management_app.ose.configmap.management_app.authentication_enabled |
Признак использования аутентификации для Management app |
true |
|
management_app.ose.configmap.management_app.authentication_jwt_enabled |
Признак использования аутентификации с использованием jwt токена для Management app |
true |
|
management_app.ose.configmap.management_app.service_core_project_enabled |
Признак использования режима проверки соответствия доступа пользователя к проекту для Management app |
true |
|
Размеры заголовков |
management_app.max.http.header.size |
Настройка максимального размера заголовка при обращении к management_app |
32Kb |
Настройка Platform V Pangolin SE#
Сервис работает с БД двумя различными способами:
хранение своих данных (конфигурации pipeline, настройки, квоты и др.);
синхронизация распределенного scheduling.
Подключение к БД рекомендуется выполнять через hikari pool.
Если подключение к PostgreSQL SE выполняется через pg-bouncer, то с точки зрения конфигурации приложения, оно ничем не отличается от прямого подключения. За исключением того что указывается хост pg-bouncer, а не БД. Для хранения данных может быть использована одна и та же БД или разные. Для использования одной БД необходимо указать одинаковую конфигурацию для различных БД, указанных ниже по тексту.
В случае использования схемы cluster-patroni-etcd-pgbouncer необходимую логику по выбору ведущего сервера необходимо реализовать через строчку подключения к БД, на примере JDBC драйвера:
jdbc:postgresql://127.0.0.1:6544,127.0.0.2:6544/dbname?targetServerType=master&prepareThreshold=0
Описание параметров:
prepareThreshold = int - определяет количество выполнений PreparedStatement, необходимых перед переключением на использование подготовленных операторов на стороне сервера. Значение по умолчанию - 5, что означает начало использования подготовленных операторов на стороне сервера при пятом выполнении того же объекта PreparedStatement. До версии PostgreSQL SberEdition 5.1.0 рекомендованное значение 0, так как pgBouncer не умеет работать с подготовленными транзакциями.
targetServerType = String - позволяет открывать соединения только к серверам с указанной ролью, разрешенные значения: any, master, primary, slave, secondary, preferSlave, preferSecondary. Различие между primary и secondary в настоящее время выполняется путем проверки того, разрешает ли сервер запись. Значение preferSecondary пытается подключиться к ведомому серверу, если таковые имеются, в противном случае позволяет подключиться к ведущему.
currentSchema = String - не работает при использовании pgBouncer. Рекомендуется назначать search_path для пользователя.
ALTER USER <имя_пользователя> SET SEARCH_PATH TO <значение_параметра>;
Для работы Единого Коллектора и для работы скриптов развертывания в БД необходимо создать технологические учетные записи (ТУЗ), имена указаны для примера, можно задать другие:
Имя ТУЗ |
Назначение |
Условия использования |
|---|---|---|
pvm_collector_user |
Владелец схемы БД |
При использование Platform V Pangolin в роль pvm_collector_user включается заранее созданная доменная ТУЗ владельца схемы БД |
management_app_user |
Для работы скриптов развертывания Единого Коллектора — создание объектов схемы БД средствами Liquibase |
При использование Platform V Pangolin в роль management_app_user включается заранее созданная доменная ТУЗ владельца схемы БД. Доменная ТУЗ с ролью management_app_user, должна являться владельцем объектов БД, для этого перед выполнением DDL-команд должна выполняться команда |
DDL накатываются автоматически, но базу необходимо проинициализировать.
Пример скрипта для инициализации:
CREATE USER pvm_collector_user WITH PASSWORD 'pvm_collector_password';
CREATE DATABASE pvm_collector OWNER pvm_collector_user;
GRANT ALL PRIVILEGES ON DATABASE pvm_collector TO pvm_collector_user;
CREATE SCHEMA IF NOT EXISTS pvm_collector;
CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA pvm_collector;
ALTER DATABASE pvm_collector SET SEARCH_PATH TO 'pvm_collector';
ALTER ROLE pvm_collector_user SET SEARCH_PATH TO 'pvm_collector';
GRANT ALL PRIVILEGES ON SCHEMA pvm_collector TO pvm_collector_user;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA pvm_collector TO pvm_collector_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA pvm_collector TO pvm_collector_user;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA pvm_collector TO pvm_collector_user;
GRANT ALL PRIVILEGES ON ALL ROUTINES IN SCHEMA pvm_collector TO pvm_collector_user;
GRANT ALL PRIVILEGES ON ALL PROCEDURES IN SCHEMA pvm_collector TO pvm_collector_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA pvm_collector GRANT ALL PRIVILEGES ON TABLES TO pvm_collector_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA pvm_collector GRANT ALL PRIVILEGES ON SEQUENCES TO pvm_collector_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA pvm_collector GRANT ALL PRIVILEGES ON FUNCTIONS TO pvm_collector_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA pvm_collector GRANT ALL PRIVILEGES ON ROUTINES TO pvm_collector_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA pvm_collector GRANT ALL PRIVILEGES ON TYPES TO pvm_collector_user;
CREATE USER management_app_user WITH PASSWORD 'management_app_password';
GRANT USAGE ON SCHEMA pvm_collector TO management_app_user;
GRANT SELECT, UPDATE, INSERT, DELETE ON ALL TABLES IN SCHEMA pvm_collector TO management_app_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA pvm_collector TO management_app_user;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA pvm_collector TO management_app_user;
GRANT EXECUTE ON ALL ROUTINES IN SCHEMA pvm_collector TO management_app_user;
GRANT EXECUTE ON ALL PROCEDURES IN SCHEMA pvm_collector TO management_app_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA pvm_collector GRANT SELECT, INSERT, UPDATE, DELETE, TRUNCATE ON TABLES TO management_app_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA pvm_collector GRANT ALL PRIVILEGES ON SEQUENCES TO management_app_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA pvm_collector GRANT EXECUTE ON FUNCTIONS TO management_app_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA pvm_collector GRANT EXECUTE ON ROUTINES TO management_app_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA pvm_collector GRANT USAGE ON TYPES TO management_app_user;
, где пароли, имена схем, пользователей и БД могут быть (пароли должны) выставлены на усмотрение администратора. Скрипт должен соответствовать статической конфигурации сервиса.
Далее необходимо сделать backup БД Единого Коллектора следующим, либо другим удобным способом:
pg_dump -h [имя_хоста] -p [номер_порта] -U [имя_пользователя] -n [имя_схемы] -v -f [имя_файла_c_backup].sql [имя_бд]
Пример:
pg_dump -h st-abyss-name-01.opsmon.sss -p 5432 -U postgres -n cote -v -f namedb.sql namedb_db
Настройка облачного окружения#
Необходимо создать namespace в кластере Kubernetes или OpenShift. Также необходимо подключить созданный namespace к Istio Control Plane (istiod).
Ручная установка без использования скриптов развертывания#
Рекомендуем использовать скрипты для автоматизации установки. Скрипты расположены в дистрибутиве, в папке bh/installer в архиве deploy-pvm.zip. В архиве также находится документация по использованию скриптов.
Для установки сервиса Единый коллектор вручную необходимо:
Получить дистрибутив сервиса Единый коллектор;
Заказать схему БД Postgres или СУБД Platform V Pangolin SE для Единого коллектора (Приложению требуется СУБД Postgres, рекомендуется использовать Platform V Pangolin SE. Требования по инсталляции СУБД отсутствуют, т.е. схему можно создать в любой инсталляции, на усмотрение клиента);
Выполнить скрипты инициализации БД, расположенные в архиве, в директории db дистрибутива;
Сделать backup БД Единого Коллектора следующим, либо другим удобным способом:
pg_dump -h [имя_хоста] -p [номер_порта] -U [имя_пользователя] -n [имя_схемы] -v -f [имя_файла_c_backup].sql [имя_бд]
Пример:
pg_dump -h st-abyss-name-01.opsmon.sss -p 5432 -U postgres -n cote -v -f namedb.sql namedb_db
Во всех файлах .yaml расположенных в директориях заполнить значения переменных;
Для настройки окружения - внести изменения в файл telemetry-collector.all.conf;
Для файлов вида *-certs.yaml, необходимо вручную создать yaml;
Создать секреты с именем из secret-telemetry-collector и значениями из секции secrets файла distrib.yaml;
Необходимо подключить проект к Istio Control Panel (Platform V Synapse Service Mesh);
Заполнить значения переменных для всех файлов *.yaml из директории k8s;
Далее необходимо установить все заполненные файлы *.yaml в платформе приложений-контейнеров с помощью команды;
Применить все yaml-конфигурации.
Конфигурирование Platform V DevOps Tools (DOT)#
Сервис устанавливается с помощью стандартного Platform V DevOps Tools (DOT).
Секреты, пароли, сертификаты#
При установке Единого коллектора доступно выбрать способ хранения секретов, паролей и сертификатов:
Secure Password Manager (далее - Secman);
Common-репозиторий.
Одновременное использование двух вариантов хранения недоступно.
Для корректной работы Единого Коллектора используются следующие сертификаты:
Сертификат Apache Kafka;
Сертификат OTT;
Сертификат Istio для Pull Collector;
Сертификат Istio;
Сертификат для БД.
Общий корневой сертификат расположен в common-репозитории и используется независимо от способа хранения секретов (в Secman или в common-репозитории).
Рекомендованное расположение цепочки сертификатов УЦ, указано в конфигурационном файле telemetry-collector.all.conf:
Параметр |
Описание |
Пример заполнения |
|---|---|---|
telemetry_collector.ose.common.ca_location |
Расположение цепочки сертификатов УЦ в common-репозитории |
ansible/files/ssl/caCertificates.pem |
В этот файл необходимо поместить цепочку сертификатов УЦ в формате PEM для Apache Kafka, Istio, OTT, БД.
Secman#
Для хранения сертификатов в Secman необходимо в конфигурационных файлах заполнить общие параметры:
telemetry-collector.vault-agent-sidecar.all.conf:
Общее назначение |
Параметр |
Наименование |
Возможные значения |
|---|---|---|---|
Настройки подключения к Secman |
cote.vault.enabled |
Признак использования интеграции с Secman |
true |
cote.vault.host |
URL для подключения к Vault (SecMan) |
secman-ddo.solution.sss |
|
cote.vault.port |
Порт для подключения к Vault (SecMan) |
8200 |
|
cote.vault.config.service_account.token.location |
Параметр, указывающий на расположение токена из Service account |
/var/run/secrets/kubernetes.io/serviceaccount/token |
|
cote.vault.config.auto_auth.kubernetes_auth_method_path |
Метод для аутентификации в Secman для роли kubernetes (без auth) |
os/stands-vdc01.solution.sss |
|
cote.vault.config.auto_auth.method.config.role |
Роль пользователя, которому доступно получать/обновлять/удалять секреты в Secman |
role-ga-secman-mona |
|
cote.vault.config.auto_auth.method.namespace |
Параметр namespace для подключения к Secman |
DEV_DDO |
|
vault.database.shedlock.username |
Нотация логина от БД блокировок |
$__vault{kv:DEV_DDO/A/ST/OM/COTE/KV:cote-secret-vault-r5:config.env.database.shedlock.username} |
|
vault.database.shedlock.password |
Нотация пароля от БД блокировок |
$__vault{kv:DEV_DDO/A/ST/OM/COTE/KV:cote-secret-vault-r5:config.env.database.shedlock.password} |
|
vault.database.pvm_collector.username |
Нотация логина от БД |
$__vault{kv:DEV_DDO/A/ST/OM/COTE/KV:cote-secret-vault-r5:config.env.database.pvm_collector.username} |
|
vault.database.pvm_collector.password |
Нотация пароля от БД |
$__vault{kv:DEV_DDO/A/ST/OM/COTE/KV:cote-secret-vault-r5:config.env.database.pvm_collector.password} |
|
vault.authentication.api_key.internal_key |
Нотация Api-ключа |
$__vault{kv:DEV_DDO/A/ST/OM/COTE/KV:cote-secret-vault-r5:config.env.authentication.api-key.internal-key.api-key} |
|
vault.authentication.api_key.validation.auth.basic.user |
Нотация логина от сервиса валидации Api-ключа |
$__vault{kv:DEV_DDO/A/ST/OM/COTE/KV:cote-secret-vault-r5:config.env.authentication.api-key.validation.auth.basic.user} |
|
vault.authentication.api_key.validation.auth.basic.pass |
Нотация пароля от сервиса валидации Api-ключа |
$__vault{kv:DEV_DDO/A/ST/OM/COTE/KV:cote-secret-vault-r5:config.env.authentication.api-key.validation.auth.basic.pass} |
|
vault.service.core.secure.auth.basic.user |
Нотация логина от Сервиса авторизации компонента Abyss (LGDB) |
$__vault{kv:DEV_DDO/A/ST/OM/COTE/KV:cote-secret-vault-r5:vault.service.core.secure.auth.basic.user} |
|
vault.service.core.secure.auth.basic.pass |
Нотация пароля от Сервиса авторизации компонента Abyss (LGDB) |
$__vault{kv:DEV_DDO/A/ST/OM/COTE/KV:cote-secret-vault-r5:vault.service.core.secure.auth.basic.pass} |
|
vault.service.kafka.ssl.privateKeyPassword |
Нотация пароля от приватного ключа для Apache Kafka |
stub |
|
vault.service.database.ssl.privateKeyPassword |
Нотация пароля от приватного ключа для БД |
stub |
|
vault.service.pull.ssl.privateKeyPassword |
Нотация пароля от приватного ключа для Pull Collector |
stub |
|
vault.telemetry_collector.ose.common.kafka_ssl_key_filepath |
Нотация от приватного ключа для Apache Kafka |
$__vault{kv:DEV_DDO/A/ST/OM/COTE/KV:cote-secret-vault-r5:kafka_private-key_pem} |
|
vault.telemetry_collector.ose.common.kafka_ssl_certificate_filepath |
Нотация от клиентского сертификата для Apache Kafka |
$__vault{kv:DEV_DDO/A/ST/OM/COTE/KV:cote-secret-vault-r5:kafka_cert_pem} |
|
vault.telemetry_collector.ose.common.database_ssl_key_filepath |
Нотация от приватного ключа для БД |
$__vault{kv:DEV_DDO/A/ST/OM/COTE/KV:cote-secret-vault-r5:database_private-key_pem} |
|
vault.telemetry_collector.ose.common.database_ssl_certificate_filepath |
Нотация от клиентского сертификата для БД |
$__vault{kv:DEV_DDO/A/ST/OM/COTE/KV:cote-secret-vault-r5:database_cert_pem} |
|
vault.istio.egress.common.privateKey_name |
Нотация от приватного ключа для Pull Collector (приватного ключ Istio Egress) |
$__vault{kv:DEV_DDO/A/ST/OM/COTE/KV:cote-secret-vault-r5:pull-collector_private-key_pem} |
|
vault.istio.egress.common.clientCertificate_name |
Нотация от клиентского сертификата для Pull Collector (сертификат Istio Egress) |
$__vault{kv:DEV_DDO/A/ST/OM/COTE/KV:cote-secret-vault-r5:pull-collector_cert_pem} |
|
vault.telemetry_collector.ose.common.crypt.password.key |
Нотация для ключа шифрования секретов (произвольное значение для ключа шифрования) |
$__vault{kv:DEV_DDO/A/ST/OM/COTE/KV:cote-secret-vault-r5:crypt_key} |
|
cote.vault.secrets.runtime.ttl |
Настройка времени обновления runtime секрета (сек) |
300 |
|
cote.vault.secrets.runtime.location.prefix |
Путь до хранения секретов |
DEV_DDO/A/ST/OM/MONA/KV |
Также необходимо проверить наличие топика для сообщений об изменении секретов - {prefix}.runtime-secret-refresh. Описание характеристик топика указано в разделе - Статическая конфигурация.
При работе в режиме генерации сертификатов через PKI#
Создать PKI в Secman для вашего приложения (если оно еще не существует).
Для выпуска сертификатов можно использовать роль по имени "role-название-созданной-группы-в-AD" (в данном случае, в отличие от остальных, важен регистр). У данной роли разрешены домены sbt и gt, а также выпуск сертификатов для поддоменов. Если требуется, то можно создать собственную роль (отличается от роли для доступа к vault), которая будет содержать параметры выпуска сертификатов.
В конфигурационном файле telemetry-collector.vault-agent-sidecar.all.conf необходимо заполнить параметры:
Общее назначение |
Параметр |
Наименование |
Возможные значения |
|---|---|---|---|
Настройки при использовании PKI в Secman |
cote.vault.secrets.certs.method |
Метод генерации сертификатов |
issue |
cote.vault.secrets.certs.cn |
Указание common-name, c которым будет генерироваться сертификат |
tribe-om-dev-collect-01.apps.secman-ddd.sss |
|
cote.vault.secrets.certs.source |
Путь к секретам в хранилище Secman |
ST/COTE/OM/PKI |
|
cote.vault.config.certificates.ttl |
Настройка времени жизни сертификата, сгенерированного Secman PKI |
1800h |
telemetry-collector.istio.all.conf:
Общее назначение |
Параметр |
Наименование |
Возможные значения |
|---|---|---|---|
Настройки при использовании PKI в Secman |
istio.egress.common.pki_ttl |
Указание времени жизни сертификата для Egress |
1800h |
istio.ingress.common.pki_ttl |
Указание времени жизни сертификата для Ingress |
1800h |
Параметры ttl по-умолчанию имеют значение 1800h, их нужно переопределить на стенде, так как на Secman может стоять ограничение.
При работе с хранилищем KV#
Разместить в Secman данные (логины, пароли, сертификаты, и т. д.):
Создать в Secman хранилище KV для вашего приложения (если оно еще не существует).
Создать в UI Secman в KV secret для хранения секретов (кнопка Create secret+)
можно задать любое имя секрета, например cote-secret (это имя необходимо указать в нотациях сервисов)
ingressgateway-certs
egressgateway-certs
В конфигурационных файлах задать значения параметров:
telemetry-collector.vault-agent-sidecar.all.conf:
Общее назначение |
Параметр |
Наименование |
Возможные значения |
|---|---|---|---|
Настройки при использовании KV в Secman |
cote.vault.secrets.kv.source |
Путь к секретам в хранилище Secman |
A/ST/OM/COTE/KV/ |
telemetry-collector.istio.all.conf:
Общее назначение |
Параметр |
Наименование |
Возможные значения |
|---|---|---|---|
Настройки при использовании KV в Secman |
istio.egress.common.kv_certs_full_path |
Полный путь до секрета, который используется для Egressgateway Istio |
A/ST/OM/COTE/KV/egressgateway-certs |
istio.ingress.common.kv_certs_full_path |
Полный путь до секрета, который используется для Ingressgateway Istio |
A/ST/OM/COTE/KV/ingressgateway-certs |
|
istio.egress.common.pki_ttl |
Указание времени жизни сертификата для Egress |
1800h |
|
istio.ingress.common.pki_ttl |
Указание времени жизни сертификата для Ingress |
1800h |
Добавить в созданный на предыдущем шаге secret необходимые секреты в текстовом формате, где
Key - имя файла сертификата, по которому будет происходить lookup сертификата и его нужно будет указать в нотациях сервисов
Value - тело сертификата
Следующие параметры задаются в secret с произвольным именем (например cote-secret):
Наименование параметра |
Пример Key |
Пример Value |
|---|---|---|
Параметр для указания пароля для подключения к БД хранения данных |
config.env.database.pvm_collector.password |
password |
Параметр для указания имени пользователя для подключения к БД хранения данных |
config.env.database.pvm_collector.username |
tlmclrt_user |
Параметр для указания пароля для подключения к БД для синхронизации |
config.env.database.shedlock.password |
password |
Параметр для указания имени пользователя для подключения к БД для синхронизации |
config.env.database.shedlock.username |
tlmclrt_user |
Параметр для указания пароля для базовой аутентификации в компоненте IAM Proxy (AUTH) продукта Platform V IAM SE |
config.env.service.authentication.password |
password |
Параметр для указания имя пользователя для базовой аутентификации в Cервисе авторизации компонента Abyss (LGDB) |
config.env.service.core.user |
admin |
Параметр для указания пароля для базовой аутентификации в Cервисе авторизации компонента Abyss (LGDB) |
config.env.service.core.password |
password |
Параметр для указания Api ключа, для микросервисных взаимодействий, полученный в Abyss |
config.env.service.authentication.internal-key.api-key |
eyJrZXlJZCI6NSwia2V5IjoiNDI4MmIyODdkNjBkNmM1MGI4M2Q1NmMxMjQ4ZDdj |
Параметр для указания пароля пользователя для аутентификации Api ключа (задается при создании Api ключа в Abyss) |
config.env.authentication.api-key.validation.auth.basic.pass |
password |
Параметр для указания имени пользователя для аутентификации Api ключа (задается при создании Api ключа в Abyss) |
config.env.authentication.api-key.validation.auth.basic.user |
admin |
Параметр для указания клиентского сертификата для Kafka |
kafka_cert.pem |
-----BEGIN CERTIFICATE----- MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQsF |
Параметр для указания приватного ключа для Kafka |
kafka_private-key.pem |
-----BEGIN PRIVATE KEY----- MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQsF |
Параметр для указания клиентского сертификат для БД |
database_cert.pem |
-----BEGIN CERTIFICATE----- MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQsF |
Параметр для указания приватного ключа для БД |
database_private-key.pem |
-----BEGIN PRIVATE KEY----- MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQsF |
Параметр для указания ключа для шифрования паролей в БД COTE |
config.env.crypt.password.key |
dev_key |
Имена следующих сертификатов (Key) изменять не рекомендуется.
Имя secret |
Key |
Пример Value |
Описание сертификатов |
|---|---|---|---|
ingressgateway-certs |
tls.crt |
-----BEGIN CERTIFICATE----- MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQsF |
Клиентский сертификат для Ingressgateway Istio |
tls.key |
-----BEGIN PRIVATE KEY----- MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQsF |
Приватный ключ для Ingressgateway Istio |
|
egressgateway-certs |
tls.crt |
-----BEGIN CERTIFICATE----- MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQsF |
Клиентский сертификат для Egressgateway Istio |
tls.key |
-----BEGIN PRIVATE KEY----- MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQsF |
Приватный ключ для Egressgateway Istio |
API key выдается администраторами Abyss. Подробнее о создании API ключей в Руководстве оператора, инструкция поставляется в рамках компонента Abyss (LGDB) в составе продукта Platform V Monitor (OPM). В наименовании заголовка API ключа должен быть UID из SUB.
В случае необходимости ротации сертификатов, добавьте ключ ttl в secret Secman со значением времени перечитывания хранилища.
При использовании ОТТ#
Необходимо добавить новый secret и сертификаты для ОТТ.
Создать в UI Secman в KV новый secret для хранения сертификатов telemetry-collector-ott-certs (кнопка Create secret+)
Задать значения параметров в конфигурационных файлах:
telemetry-collector.ott-sidecar.all.conf:
Общее назначение |
Параметр |
Наименование |
Возможные значения |
|---|---|---|---|
Настройки при использовании OTT |
cote.vault.secrets.certs.ott.ttl |
Указание времени жизни сертификата для OTT |
1800h |
ott.sidecar.ose.secman.common.kv_ott_full_path |
Полный путь до секретов в Secman для OTT |
ST/COTE/OM/KV/telemetry-collector-ott-certs |
|
ott.sidecar.ose.secman.common.enablePki |
Настройки для pki ott |
по умолчанию имеет значение переменной cote.vault.secrets.certs.source.pki, при необходимости изменить значение на false |
telemetry-collector.vault-agent-sidecar.all.conf:
Общее назначение |
Параметр |
Наименование |
Возможные значения |
|---|---|---|---|
Настройки при использовании OTT |
vault.telemetry_collector_pull.ose.ott.moduleCertificate_name |
Нотация от сертификата модуля ОТТ для Pull Collector |
$__vault{kv:DEV_DDO/A/ST/OM/COTE/KV:telemetry-collector-ott-certs:moduleCert.pem} |
vault.telemetry_collector_pull.ose.ott.modulePrivateKey_name |
Нотация от приватного ключа модуля ОТТ для Pull Collector |
$__vault{kv:DEV_DDO/A/ST/OM/COTE/KV:telemetry-collector-ott-certs:moduleKey.pem} |
|
vault.telemetry_collector_pull.ose.ott.serviceCertificate_name |
Нотация от сертификата сервиса ОТТ для Pull Collector |
$__vault{kv:DEV_DDO/A/ST/OM/COTE/KV:telemetry-collector-ott-certs:ottService.pem} |
Добавить сертификаты:
Имя secret |
Key |
Value (пример) |
Комментарий |
|---|---|---|---|
telemetry-collector-ott-certs |
moduleCert.pem |
-----BEGIN CERTIFICATE----- MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQsF |
Клиентский сертификат для OTT |
moduleKey.pem |
-----BEGIN PRIVATE KEY----- MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQsF |
Приватный ключ OTT клиента |
|
ottService.pem |
-----BEGIN CERTIFICATE----- MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQsF |
Сертификат OTT сервиса |
Common-репозиторий#
Таблица со списком секретов:
Название |
Значение |
|---|---|
database.pvm_collector.password |
Пароль для подключения к БД хранения данных |
database.pvm_collector.username |
Имя пользователя для подключения к БД хранения данных |
database.shedlock.password |
Пароль для подключения к БД для синхронизации |
database.shedlock.username |
Имя пользователя для подключения к БД для синхронизации |
database.pvm_collector.liquibase.password |
Пароль для проката DDL скриптов |
service.core.secure.auth.basic.pass |
Пароль для базовой аутентификации в компоненте IAM Proxy (AUTH) продукта Platform V IAM SE |
service.core.secure.auth.basic.user |
Имя пользователя для базовой аутентификации в компоненте IAM Proxy (AUTH) продукта Platform V IAM SE |
ott.certstore.pwd |
Пароль от key-store для компонента Platform V One-Time-Token |
ott.certstore.private.key.pwd |
Пароль для ключа key-store |
ott.trust.store.pwd |
Пароль от trust-store для компонента Platform V One-Time-Token |
authentication.api-key.validation.auth.basic.pass |
Пароль пользователя для аутентификации Api ключа (задается при создании Api ключа в Abyss) |
authentication.api-key.internal-key |
Api ключ, для микросервисных взаимодействий, полученный в Abyss |
authentication.api-key.validation.auth.basic.user |
Имя пользователя для аутентификации Api ключа (задается при создании Api ключа в Abyss) |
crypt.password.key |
Ключ для шифрование паролей в БД COTE |
crypt.reencrypt.old-key |
Ключ для дешифрования паролей, подробнее о механизме дешифрования в документе Руководство по безопасности раздел "Безопасность данных" |
Для работы с паролями и секретами Platform V DevOps Tools (DOT) можно использовать файл _passwords.conf, который хранится в зашифрованном виде в common-репозитории.
ssl.ose.keyStore.mq.password=PWD
ssl.kubernetes.keyStore.mq.password=PWD
ssl.istio.keyStore.ingress.password=PWD
ssl.istio.keyStore.egress.password=PWD
ssl.ose.istio.keyStore.ingress.password=PWD
ssl.ose.istio.keyStore.egress.password=PWD
ssl.kubernetes.istio.keyStore.ingress.password=PWD
ssl.kubernetes.istio.keyStore.egress.password=PWD
database.pvm_collector.password=PWD
database.shedlock.password=PWD
database.pvm_collector.liquibase.password=PWD
service.core.secure.auth.basic.pass=admin
ott.certstore.private.key.pwd=PWD
ott.certstore.pwd=PWD
ott.trust.store.pwd=PWD
authentication.enabled.api-key.validation.auth.basic.pass=PWD
Все сертификаты, кроме Istio, необходимо положить в common-репозиторий для того, чтобы Platform V DevOps Tools (DOT) их смог найти и установить в инфраструктуру. Istio-сертификат настраивается отдельно, стандартно для Platform V DevOps Tools (DOT) способом.
В telemetry-collector.all.conf должны быть прописаны пути к:
файлам Kafka в common-репозитории
telemetry_collector.ose.secret.secret-telemetry-collector-kafka-certs.key_location=ansible/files/ssl/pg-key.pem
telemetry_collector.ose.secret.secret-telemetry-collector-kafka-certs.cert_location=ansible/files/ssl/pg-cert.pem
файлам БД в common-репозитории
telemetry_collector.ose.secret.secret-telemetry-collector-db-certs.key_location=ansible/files/ssl/pg-key.pem
telemetry_collector.ose.secret.secret-telemetry-collector-db-certs.cert_location=ansible/files/ssl/pg-cert.pem
общим корневым сертификатам
config.env.service.common.ssl.rootCertificatePath=/etc/ssl/certs/caCertificates.pem
Конфигурация окружения#
Значения database.pvm_collector.name и database.shedlock.name должны быть одинаковы, если имя базы данных для database.shedlock.name отличается, то требуется убедиться, что в БД присутствует таблица shedlock:
Атрибут |
Тип |
Описание |
|---|---|---|
name |
varchar(64) |
Имя блокировка |
lock_until |
timestamp |
Время окончания блокировки |
locked_at |
timestamp |
Время начала блокировки |
locked_by |
varchar(255) |
Имя узла, создавшего блокировку |
В common-репозитории в common.conf.yaml указать значения параметров для подключения к БД, в которую будет происходить миграция liquibase-скриптов: TLMCLTR_POSTGRES_DB_URL: "jdbc:postgresql://…" - url для подключения к БД TLMCLTR_POSTGRES_DB_SCHEMA: "telemetry_schema" - схема БД для которой применяются скрипты TLMCLTR_POSTGRES_DB_LIQUIBASE_USER: "tlmclrt_user" - пользователь с правами на CRUD-операции с таблицами БД
В состав дистрибутива входят конфигурационные файлы с рекомендуемыми значениями не стендозависимых параметров для настройки продукта. Их изменение может нарушить безопасность продукта. Пример типовой конфигурации:
Запуск Platform V DevOps Tools (DOT)#
Установка сервиса происходит через установку дистрибутива Единого коллектора централизованным Platform V DevOps Tools (DOT).
Выполнить миграцию конфигураций, используя playbook: MIGRATION_FP_CON.
Выполнить конфигурирование параметров и окружения.
Создать системные задачи сбора данных.
Выполнить установку дистрибутива Единого коллектора телеметрии в среде контейнеризации, используя playbook: DB_UPDATE, OPENSHIFT_INGRESS_EGRESS_DEPLOY, OPENSHIFT_DEPLOY DEBUG (опционально, для подробных логов при отладке). Данный параметр применим, как для Kubernetes, так и для OpenShift.


Проверка установки и диагностика#
После завершения работы Platform V DevOps Tools (DOT), необходимо произвести проверку результата выполнения. Должно быть развернуто минимум по одному POD'у:
telemetry-collector-management-app;
telemetry-collector-pull;
telemetry-collector-push.
Количество POD'ов может меняться и задается в конфигурации сервисов параметром replicas.
Рекомендуется проверить логи сервисов management-app, push-collector, pull-collector.
Настройка обслуживания сервиса#
Единый коллектор предоставляет в стандартном виде информацию о своем состоянии:
Трассировки в формате Zipkin;
Логи, JSON формат, допустимый для fluent-bit;
Метрики в формате Prometheus;
Для нормальной эксплуатации сервиса эти данные необходимо собирать и сохранять в Abyss, для возможности дальнейшей визуализации.
Для сбора данных необходим проект в Abyss. Этот проект должен быть использован для конфигурирования, которое описано далее. Также на проект нужна достаточная квота. Подробности о создании проектов и квот в интерфейсе Abyss можно выяснить в документации Abyss в документе «Руководство оператора». Все телеметрические данные самомониторинга должны записываться в хранилище Abyss.
Подробнее о создании системных задач сбора данных описано в пункте Системные задачи сбора данных Единого коллектора телеметрии.
Трассировки#
Сбор данных происходит с помощью Spring Zipkin. Трассировки пишутся для всех приложений сервиса: pull/push collector, management application.
Конфигурация (статическая конфигурация сервиса):
spring.zipkin.enabled: true
spring.zipkin.base-url: http://{HOST}:{PORT}/push/project/{projectName}/pipeline/{pipelineName}
spring.zipkin.api-path: /
spring.zipkin.sender.type: WEB
, где {projectName} - это имя проекта, используемого для сбора данных, {pipelineName} - это имя pipeline.
Конфигурация pipeline для импорта:
{
"quota": {
"limitTrafficPerMin": 10000000
},
"name": "self-tracing-pipe",
"input": {
"typeName": "standard-http-api",
"config": "{}"
},
"processors": [
{
"typeName": "http-jackson-converter",
"config": "{\"required\": false, \"headersToEnrich\": []}",
"order": 1
},
{
"typeName": "pipeline-data-enrichment-processor",
"config": "{}",
"order": 2
},
{
"typeName": "json-flattener-processor",
"config": "{\"flattenMode\": \"KEEP_ARRAYS\", \"standardFlatteningForFieldsWithDots\": false}",
"order": 3
}
],
"outputs": [
{
"typeName": "kafka-output",
"config": "{\"acks\": -1, \"topic\": \"TRACING_TOPIC_NAME\", \"clientId\": \"cid-3\", \"lingerMs\": 0, \"batchSize\": 16384, \"maxBlockMs\": 60000, \"keySerializer\": \"org.apache.kafka.common.serialization.StringSerializer\", \"sslClientAuth\": false, \"requestTimeout\": 30000, \"deliveryTimeout\": 120000, \"valueSerializer\": \"org.springframework.kafka.support.serializer.JsonSerializer\", \"bootstrapServers\": \"KAFKA_ADDRESS_AND_PORT\", \"securityProtocol\": \"SSL\", \"idempotenceEnabled\": true, \"sslEnabledProtocols\": \"TLSv1.2\", \"maxInFlightRequestsPerConnection\": 5, \"sslEndpointIdentificationAlgorithm\": \"https\"}"
}
]
}
, где TRACING_TOPIC_NAME - это имя топика Apache Kafka для записи трассировок (нужно создать через UI Abyss), KAFKA_ADDRESS_AND_PORT - список bootstrap серверов kafka Abyss (можно запросить у администратора PVM).
Метрики#
Данные предоставляются в формате Actuator Prometheus. Эти данные необходимо собирать с помощью Prometheus-агента (Unimon-агент).
Конфигурация носит информативный характер. Пример конфигурация Unimon-агента (фактически в scrape_configs нужно оставить kubernetes-pods и kubernetes-pods-https и далее задать endpoint).
kind: ConfigMap
apiVersion: v1
metadata:
name: unimon-agent-config.r4
labels:
app: unimon-agent
data:
prometheus.yml: |-
global:
scrape_interval: %GLOBAL_SCRAPE_INTERVAL%
scrape_timeout: %GLOBAL_SCRAPE_TIMEOUT%
scrape_configs:
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: endpoints
namespaces:
names:
- "ci02707148-idevgen-audit-mmv"
relabel_configs:
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
regex: true
action: keep
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
regex: (.+)
target_label: __metrics_path__
action: replace
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
action: drop
regex: https
- source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
action: replace
target_label: __address__
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
- source_labels: [__meta_kubernetes_namespace]
separator: ;
regex: (.*)
target_label: namespace
replacement: $1
action: replace
- source_labels: [__meta_kubernetes_pod_name]
separator: ;
regex: (.*)
target_label: pod
replacement: $1
action: replace
- source_labels: [__meta_kubernetes_service_name]
separator: ;
regex: (.*)
target_label: service
replacement: $1
action: replace
- source_labels: [__meta_kubernetes_pod_node_name]
separator: ;
regex: (.*)
target_label: nodeName
replacement: $1
action: replace
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- source_labels: [__address__]
separator: ;
regex: (.*)
target_label: unimonVersion
action: replace
replacement: "D-04.000.00-2373_client"
- source_labels: [__address__]
separator: ;
regex: (.*)
target_label: tenant
action: replace
replacement: "undefined"
- source_labels: [__address__]
separator: ;
regex: (.*)
target_label: source
action: replace
replacement: OpenShift
- job_name: 'kubernetes-pods-https'
scheme: https
tls_config:
ca_file: /etc/prom-certs/root-cert.pem
cert_file: /etc/prom-certs/cert-chain.pem
key_file: /etc/prom-certs/key.pem
insecure_skip_verify: true
kubernetes_sd_configs:
- role: endpoints
namespaces:
names:
- "ci02707148-idevgen-audit-mmv"
relabel_configs:
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
regex: true
action: keep
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
regex: (.+)
target_label: __metrics_path__
action: replace
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
action: keep
regex: https
- source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
action: replace
target_label: __address__
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
- source_labels: [__meta_kubernetes_namespace]
separator: ;
regex: (.*)
target_label: namespace
replacement: $1
action: replace
- source_labels: [__meta_kubernetes_pod_name]
separator: ;
regex: (.*)
target_label: pod
replacement: $1
action: replace
- source_labels: [__meta_kubernetes_service_name]
separator: ;
regex: (.*)
target_label: service
replacement: $1
action: replace
- source_labels: [__meta_kubernetes_pod_node_name]
separator: ;
regex: (.*)
target_label: nodeName
replacement: $1
action: replace
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- source_labels: [__address__]
separator: ;
regex: (.*)
target_label: unimonVersion
action: replace
replacement: "D-04.000.00-2373_client"
- source_labels: [__address__]
separator: ;
regex: (.*)
target_label: tenant
action: replace
replacement: "undefined"
- source_labels: [__address__]
separator: ;
regex: (.*)
target_label: source
action: replace
replacement: OpenShift
remote_write:
- url: "http://{HOST}:{PORT}/push/project/{projectName}/pipeline/{pipelineName}/prometheus-proto"
, где http://{HOST}:{PORT}/push/project/{projectName}/pipeline/{pipelineName}/prometheus-proto – это http-endpoint push-коллектора для отправки метрик, , {projectName} - имя проекта, используемого для сбора данных, {pipelineName} - имя pipeline.
Конфигурация pipeline для импорта:
{
"quota": {
"limitTrafficPerMin": 10000000
},
"name": "self-monitoring-pipe",
"input": {
"typeName": "standard-http-api",
"config": "{}"
},
"processors": [
{
"typeName": "prometheus-unimon-converter",
"config": "{\"allowNan\": false, \"required\": false, \"headersToEnrich\": []}",
"order": 1
},
{
"typeName": "jackson-mapper-processor",
"config": "{}",
"order": 2
},
{
"typeName": "pipeline-data-enrichment-processor",
"config": "{}",
"order": 3
},
{
"typeName": "json-flattener-processor",
"config": "{\"flattenMode\": \"KEEP_ARRAYS\", \"standardFlatteningForFieldsWithDots\": false}",
"order": 4
}
],
"outputs": [
{
"typeName": "kafka-output",
"config": "{\"acks\": -1, \"topic\": \"METRICS_TOPIC_NAME\", \"clientId\": \"cidddd\", \"lingerMs\": 0, \"batchSize\": 16384, \"maxBlockMs\": 60000, \"keySerializer\": \"org.apache.kafka.common.serialization.StringSerializer\", \"sslClientAuth\": false, \"requestTimeout\": 30000, \"deliveryTimeout\": 120000, \"valueSerializer\": \"org.springframework.kafka.support.serializer.JsonSerializer\", \"bootstrapServers\": \"KAFKA_ADDRESS_AND_PORT\", \"securityProtocol\": \"SSL\", \"idempotenceEnabled\": true, \"sslEnabledProtocols\": \"TLSv1.2\", \"maxInFlightRequestsPerConnection\": 5, \"sslEndpointIdentificationAlgorithm\": \"https\"}"
}
]
}
, где METRICS_TOPIC_NAME - это имя топика Apache Kafka для записи метрик (подробнее о создании в Руководстве оператора, инструкция поставляется в рамках компонента Abyss (LGDB) в составе продукта Platform V Monitor), KAFKA_ADDRESS_AND_PORT - список bootstrap серверов Apache Kafka Abyss(можно запросить у администратора PVM).
Настройка индексирования данных#
Топик для хранения метрик нужно проиндексировать с помощью сервиса Abyss. Документацию по этому процессу можно найти в документе «Руководство оператора» Abyss.
Чтобы панели мониторинга сервиса Единый коллектора работали в компоненте Indicator, необходимо при создании аналитического индекса выполнить следующие условия:
В разделе "Столбцы" после выполнения "Сгенерировать автоматически" изменить тип столбца value на double;
В разделе "Конфигурация" указать нужный проект, "Имя таблицы" collector_table_name, "Столбец времени" timestamp;
После создания индекса зайти в редактирование и в разделе "Безопасность" отметить "Данный ресурс является публичным" или добавить ниже пользователя (группу), которому необходимо предоставить доступ к данным.
Панели мониторинга в компоненте Indicator находятся в разделе "V.Инструменты эксплуатации"
Настройка взаимодействия c Indicator#
в Indicator настроить Datasource приложения с доступом к endpoint Management Application (подробнее в документации Indicator - Руководство оператора -> Руководство оператора приложения «Источники данных» -> Параметры настройки);
в Nginx Abyss прописать endpoint Management Application (подробнее в документации по установке Abyss)
Настройка логирования (компонент Журналирование (LOGA) в составе продукта Platform V Monitor (OPM))#
Логи приложений записываются в файл в формате JSON и в лог в обычном формате.
На файлы логов подписан fluent-bit sidecar, который отправляет логи дальше через pipeline.
Конфигурация fluent-bit, носит информативный характер:
[SERVICE]
Flush 1
Daemon Off
Parsers_File /fluent-bit/etc/parsers.conf
HTTP_Server On
HTTP_Listen 0.0.0.0
HTTP_PORT 8085
[INPUT]
Name tail
Tag file.tail
Path /fluent-bit/etc/logs/*.json
Mem_Buf_Limit 10MB
Skip_Long_Lines On
Refresh_Interval 2
Rotate_Wait 1
Read_from_Head Off
DB /fluent-bit/etc/logs/kube.db
Parser custom
[OUTPUT]
Name stdout
Match *
[OUTPUT]
Name http
Match file.tail
Host telemetry-collector-push-service
Port 8083
URI push/project/{projectName}/pipeline/{pipelineName}
Format json
, где OUTPUT - это настройка вывода логов до Apache Kafka через единый коллектор, {projectName} - имя проекта, используемого для сбора данных, {pipelineName} - имя pipeline, который будет обрабатывать логи.
Конфигурация logback.xml, носит информативный характер:
<configuration debug="true" scan="true" scanPeriod="30 seconds">
<property scope="context" resource="application.yml"/>
<appender name="JSON" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<fieldName>serverEventDatetime</fieldName>
<pattern>[UNIX_TIMESTAMP_AS_NUMBER]</pattern>
</timestamp>
<logLevel>
<fieldName>level</fieldName>
</logLevel>
<loggerName>
<fieldName>logger</fieldName>
</loggerName>
<threadName>
<fieldName>thread</fieldName>
</threadName>
<message/>
<stackTrace>
<fieldName>stackTrace</fieldName>
<throwableConverter class="net.logstash.logback.stacktrace.ShortenedThrowableConverter">
<maxDepthPerThrowable>30</maxDepthPerThrowable>
<maxLength>4096</maxLength>
<rootCauseFirst>true</rootCauseFirst>
</throwableConverter>
</stackTrace>
<mdc>
<excludeMdcKeyName>serverEventDatetime</excludeMdcKeyName>
<excludeMdcKeyName>level</excludeMdcKeyName>
<excludeMdcKeyName>logger</excludeMdcKeyName>
<excludeMdcKeyName>thread</excludeMdcKeyName>
</mdc>
</providers>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>/fluent-bit/etc/logs/log_%d{yyyy-MM-dd}_%i.json</fileNamePattern>
<maxFileSize>5MB</maxFileSize>
<maxHistory>5</maxHistory>
<totalSizeCap>50MB</totalSizeCap>
</rollingPolicy>
</appender>
<appender name="active_check_system_data_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>/fluent-bit/etc/logs/active_check_system_data_logs/log_%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<maxFileSize>5MB</maxFileSize>
<maxHistory>20</maxHistory>
<totalSizeCap>100MB</totalSizeCap>
</rollingPolicy>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date %level [%thread] %logger{5} - %msg %n %xEx</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="JSON"/>
</root>
<logger name="active-check-system-data-logger" level="INFO">
<appender-ref ref="active_check_system_data_file"/>
</logger>
</configuration>
Pipeline для обработки всех логов
Конфигурация pipeline для импорта:
{
"quota": {
"limitTrafficPerMin": 10000000
},
"name": "self-logs-pipe",
"input": {
"typeName": "standard-http-api",
"config": "{}"
},
"processors": [
{
"typeName": "http-jackson-converter",
"config": "{\"required\": false, \"headersToEnrich\": []}",
"order": 1
},
{
"typeName": "pipeline-data-enrichment-processor",
"config": "{}",
"order": 2
},
{
"typeName": "json-flattener-processor",
"config": "{\"flattenMode\": \"KEEP_ARRAYS\", \"standardFlatteningForFieldsWithDots\": false}",
"order": 3
}
],
"outputs": [
{
"typeName": "kafka-output",
"config": "{\"acks\": -1, \"topic\": \"LOGS_TOPIC_NAME\", \"clientId\": \"cid-3\", \"lingerMs\": 0, \"batchSize\": 16384, \"maxBlockMs\": 60000, \"keySerializer\": \"org.apache.kafka.common.serialization.StringSerializer\", \"sslClientAuth\": false, \"requestTimeout\": 30000, \"deliveryTimeout\": 120000, \"valueSerializer\": \"org.springframework.kafka.support.serializer.JsonSerializer\", \"bootstrapServers\": \"KAFKA_ADDRESS_AND_PORT\", \"securityProtocol\": \"SSL\", \"idempotenceEnabled\": true, \"sslEnabledProtocols\": \"TLSv1.2\", \"maxInFlightRequestsPerConnection\": 5, \"sslEndpointIdentificationAlgorithm\": \"https\"}"
}
]
}
, где LOGS_TOPIC_NAME - это имя топика Apache Kafka для записи логов (подробнее о создании топика в Руководстве оператора, инструкция поставляется в рамках компонента Abyss (LGDB) в составе продукта Platform V Monitor), KAFKA_ADDRESS_AND_PORT - список bootstrap серверов Apache Kafka Abyss (можно запросить у администратора PVM).
Pipeline для сбора системных логов активных проверок
Системные логи активных проверок записываются в отдельный файл и служат для контроля успешности проверок и времени их работы со стороны администратора PVM. Доставка таких логов выполняется с помощью pipeline, описанного ниже.
Конфигурация pipeline для импорта:
{
"quota": {
"limitTrafficPerMin": 10000000
},
"name": "self-active-check-system-pipe",
"input": {
"typeName": "standard-http-api",
"config": "{}"
},
"processors": [
{
"typeName": "http-jackson-converter",
"config": "{\"required\": false, \"headersToEnrich\": []}",
"order": 1
},
{
"typeName": "pipeline-data-enrichment-processor",
"config": "{}",
"order": 2
}
],
"outputs": [
{
"typeName": "kafka-output",
"config": "{\"acks\": -1, \"topic\": \"ACTIVE_CHECK_LOGS_TOPIC_NAME\", \"clientId\": \"cid-4\", \"lingerMs\": 0, \"batchSize\": 16384, \"maxBlockMs\": 60000, \"keySerializer\": \"org.apache.kafka.common.serialization.StringSerializer\", \"sslClientAuth\": false, \"requestTimeout\": 30000, \"deliveryTimeout\": 120000, \"valueSerializer\": \"org.springframework.kafka.support.serializer.JsonSerializer\", \"bootstrapServers\": \"KAFKA_ADDRESS_AND_PORT\", \"securityProtocol\": \"SSL\", \"idempotenceEnabled\": true, \"sslEnabledProtocols\": \"TLSv1.2\", \"maxInFlightRequestsPerConnection\": 5, \"sslEndpointIdentificationAlgorithm\": \"https\"}"
}
]
}
, где ACTIVE_CHECK_LOGS_TOPIC_NAME - это имя топика Apache Kafka для записи системных логов активных проверок (подробнее о создании топика в Руководстве оператора, инструкция поставляется в рамках компонента Abyss (LGDB) в составе продукта Platform V Monitor), KAFKA_ADDRESS_AND_PORT - список bootstrap серверов Apache Kafka Abyss (можно запросить у администратора PVM).