Установка#

Выбор способа установки#

Установка дистрибутива производится с использованием одного из вариантов:

  • Ручная установка без использования скриптов развертывания;

  • Ручная установка с использованием инструмента установки 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-команд должна выполняться команда set role management_app_user

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).

Секреты, пароли, сертификаты#

При установке Единого коллектора доступно выбрать способ хранения секретов, паролей и сертификатов:

  1. Secure Password Manager (далее - Secman);

  2. 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#

  1. Создать PKI в Secman для вашего приложения (если оно еще не существует).

  2. Для выпуска сертификатов можно использовать роль по имени "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 данные (логины, пароли, сертификаты, и т. д.):

  1. Создать в Secman хранилище KV для вашего приложения (если оно еще не существует).

  2. Создать в 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

  1. Добавить в созданный на предыдущем шаге 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 и сертификаты для ОТТ.

  1. Создать в 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}

  1. Добавить сертификаты:

Имя 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).

  1. Выполнить миграцию конфигураций, используя playbook: MIGRATION_FP_CON.

  2. Выполнить конфигурирование параметров и окружения.

  3. Создать системные задачи сбора данных.

  4. Выполнить установку дистрибутива Единого коллектора телеметрии в среде контейнеризации, используя 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, необходимо при создании аналитического индекса выполнить следующие условия:

  1. В разделе "Столбцы" после выполнения "Сгенерировать автоматически" изменить тип столбца value на double;

  2. В разделе "Конфигурация" указать нужный проект, "Имя таблицы" collector_table_name, "Столбец времени" timestamp;

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

Панели мониторинга в компоненте 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).