Руководство по установке#
В руководстве приведены инструкции по установке компонента Federation Mesh (FSSM) продукта Platform V Synapse Service Mesh (SSM).
Термины и определения#
Термин/аббревиатура |
Определение |
|---|---|
FSSM |
Программный компонент Federation Mesh (код FSSM) из состава программного продукта Platform V Synapse Service Mesh (код SSM) |
Платформа |
Платформа оркестрации приложений со средствами автоматизации и управления на основе политик, например, Kubernetes |
Istio SE |
Настраиваемая сервисная сетка с открытым исходным кодом, служащая для взаимодействия, мониторинга и обеспечения безопасности контейнеров в кластере Kubernetes |
Служебные конфигурации |
Конфигурации (CRD), которые реализуются автоматически в «Namespace», где фактически расположен компонент FederationDiscovery в формате «.yaml» посредством «Kube API server» |
Пользовательские конфигурации |
Конфигурации (CRD), которые реализуются в «Namespace» командами в формате «.yaml» (Подробное описание приведено в документации «Руководство прикладного разработчика»). |
Контрольная панель |
Проект, в котором запущены управляющие приложения Synapse Service Mesh (компонент POLM) |
FQDN федерации |
Виртуальный адрес сервиса поставщика (FQDN), обеспечивает гарантированную адресацию сервиса в рамках федерации; при этом от сервиса поставщика требуется предварительная обязательная регистрация посредством пользовательской конфигурации «kind: ServiceExport», а также реализованную пользовательскую конфигурацию «kind: ServiceImport» сервисом потребителем |
Сервисный прокси / SVPX / istio-proxy |
Компонент Сервисный прокси продукта «Platform V Synapse Service Mesh» |
Федеративная маршрутизация |
Реализованный интеграционный маршрут в рамках реализации пользовательских конфигураций |
Граничный прокси / IGEG / ingressgateway / egressgateway |
Компонент Граничный прокси продукта «Platform V Synapse Service Mesh» |
mTLS |
Mutual TLS, протокол взаимной TLS-аутентификации |
Pod |
Набор контейнеров внутри узла кластера Kubernetes |
Deployment / «kind: Deployment» |
Набор инструкций для запуска приложения в Kubernetes |
Шлюз / «kind: VirtualService» / «kind: ServiceEntry» / «kind: DestinationRule» / «kind: EnvoyFilter» |
Конфигурации, которые реализуют маршрутизацию в рамках платформы. За обработку которых отвечает компонент SSM |
One-Time Password (OTP) / OTT |
Компонент «Platform V One-Time-Token» |
«fluent-bit» |
Компонент «Platform V Monitor» (LOGA) |
SMDL |
Компонент «Synapse ServiceMesh SMDL» |
Системные требования#
Для установки требуется соблюдение следующих условий:
Развернут и настроен кластер «Kubernetes» версии 1.19 или выше (либо «RedHat Openshift» версии 4.2 и выше) в соответствии с требованиями, предъявляемыми к Платформе.
В кластере создан проект («Namespace»), в котором установлена контрольная панель (POLM).
В проекте создана учетная запись с правами на загрузку артефактов.
В проекте имеются свободные ресурсы по «limits» и «requests» не менее, чем зарезервировано в конфигурационных артефактах.
В проект добавлен секрет для загрузки Docker-образов из целевого Docker-репозитория.
В кластере реализован компонент «fluent-bit» для передачи логов.
Подключен и настроен компонент SMDL.
В кластере реализован компонент SecMan (система управления секретами, либо Hashicorp Vault).
При использовании PostgreSQL, сервер должен быть установлен.
В кластере создан проект («Namespace»), где будет реализован программный компонент Federation Mesh (код FSSM) из состава программного продукта Platform V Synapse Service Mesh (код SSM), также необходимо будет подключить указанный проект к контрольной панели (SSM).
В рамках реализованного проекта созданы необходимые роли («kind:Role»/«kind: ClusterRole») и привязки к ролям («kind: RoleBinding»/«kind: ClusterRoleBinding») в рамках ролевой модели компонента FSSM.
В рамках реализованного проекта создан «label» (используемый для работы компонента FederationController).
В рамках кластера реализована конфигурация «kind: MutatingWebhookConfiguration».
В рамках кластера реализованы необходимые ресурсы «kind: CustomResourceDefinitions».
Для установки через консоль на рабочем месте должен быть установлен клиент Kubectl (CLI — command-line interface).
Системное программное обеспечение#
Ниже представлены категории системного программного обеспечения (далее — ПО), которые обязательны или не обязательны для установки, настройки, контроля и функционирования компонента. В каждой категории перечислены все поддерживаемые продукты/компоненты. Клиенту необходимо выбрать один из вариантов в каждой категории, исходя из условий использования конечной ИС.
Обязательность установки (да/нет) |
Наименование ПО |
Описание |
|---|---|---|
Да |
Alt Linux SP8 10 или |
Операционная система |
Да |
Docker CE 19.03.14 |
Средство контейнеризации |
Да |
Platform V DropApp (K8S) 1.3 и выше (K8S Core (K8SC)) или |
Среда контейнеризации |
Да |
OpenJDK 17 или |
Java-машина |
Да |
Nexus-Public 3.42.0 или |
Сервис централизованного хранения репозиториев артефактов (хранилище артефактов) |
Да |
GitLab Community Edition 15.7 и выше или |
Сервис централизованного хранения репозиториев исходного кода |
Нет |
Istio 1.6 и выше или |
Сервис интеграции и оркестрации микросервисов в облаке |
Нет |
HashiCorp Vault 1.10 и выше |
Система хранения и распространения secrets |
Нет |
Prometheus 2.37 и выше, Grafana 9.0 и выше или |
Система мониторинга |
Нет |
Platform V Backend (#BD) 4.3 (One-Time Password (OTP) / OTT (OTTS)) |
Сервис для аутентификации и авторизации межсервисных взаимодействий |
Нет |
Helm 3.8 и выше |
Менеджер пакетов |
Нет |
kubectl CLI 1.20.5 и выше |
Интерфейс командной строки для взаимодействия с кластером |
Нет |
PostgreSQL 11, 12, 13 или |
Система управления базами данных (СУБД) |
Примечание:
*
Да — ПО, необходимое для функционирования сервиса, без установки которого не гарантирована работоспособность.
Нет — ПО, необязательное для функционирования сервиса, установка которого не влияет на работоспособность основных функций.
** Минимальная версии программного обеспечения, на которой гарантируется работоспособность. Использование версий выше заявленной возможно до потери обратной совместимости.
Компонент POLM сконфигурирован со следующими параметрами:
...
defaultConfig:
proxyMetadata:
ISTIO_META_DNS_CAPTURE: 'true'
ISTIO_META_DNS_AUTO_ALLOCATE: 'true'
...
Аппаратные требования#
Для установки компонента требуется следующая конфигурация аппаратного обеспечения:
Название модуля |
ПО среды функционирования |
Количество |
Список контейнеров |
CPU Request |
CPU Limit |
Memory Request |
Memory Limit |
Горизонтальное масштабирование |
|---|---|---|---|---|---|---|---|---|
Приложение FederationDiscovery |
Kubernetes/Platform V DropApp (опционально OpenShift NS) |
1 pod |
federation-discovery |
600 |
1000 |
1000 |
2000 |
Нет |
istio-proxy |
100 |
200 |
200 |
300 |
Нет |
|||
Приложение FederationController |
Kubernetes/Platform V DropApp (опционально OpenShift NS) |
1 pod |
federation-controller |
600 |
1000 |
1000 |
2000 |
Нет |
istio-proxy |
100 |
200 |
200 |
300 |
Нет |
Компонент FSSM не поддерживает горизонтальную масштабируемость.
Состав дистрибутива#
В рамках компонента FSSM предоставляется 3 архива:
fssm-bin
Элемент дистрибутива |
Описание |
|---|---|
./package/bh/discovery |
Operator по работе с служебными конфигурациями |
./package/bh/controller |
Operator по работе с пользовательскими конфигурациями |
fssm-cfg
Элемент дистрибутива |
Описание |
|---|---|
./package/conf/helm/application/* |
Базовые конфигурации по установке компонента FSSM |
fssm-dbinit
Элемент дистрибутива |
Описание |
|---|---|
./package/conf/scripts/* |
Скрипт запуска Liquibase по организации БД Pangolin |
./package/db/* |
Архив с Liquibase скриптами по организации БД Pangolin |
Подготовка окружения#
Перед началом установки компонентов необходимо выбрать архитектуру взаимодействия компонента FSSM.

Схема. Рекомендованная cхема развертывания взаимодействия с PostgreSQL. Данная схема является концептуальной для визуализации установки

Схема. Схема развертывания взаимодействия без PostgreSQL. Данная схема является концептуальной для визуализации установки
Более подробно можете ознакомиться в разделе «Концептуальная модель предметной области».
1. Создать директорию установки#
FederationDiscovery
Пререквизиты:
Базовый образ для сборки docker image загружен в docker registry
Для сборки образа необходимо использовать инструмент автоматической сборки образа, компонента SMDL, «ClientUnpacker» (более подробно о настройке и запуске можно ознакомиться в документации компонента «SMDL», «Руководство оператора»), результатом исполнения будет собранный образ приложений:
Перед запуском job «ClientUnpacker», компонента SMDL (более подробно о настройке и запуске можно ознакомиться в документации компонента «SMDL», «Руководство оператора»), необходимо корректно сконфигурировать «JSON» файл «teamProducts.json» для компонента FSSM (указанный файл формируется при установке SMDL, полный путь к файлу
«devopslibconfigs/resources/custom/ru.sbrf.devops.additionalFiles/teamProducts.json»), пример секции:
...
{
"name": "Federation Mesh",
"code": "FSSM",
"user": "${ФИО сотрудника, ответственного за сборку}:${email сотрудника, ответственного за сборку}",
"parts": [
{
"docker": [
{
"baseImageLink": "${базовый образ для сборки приложения}", # пример "*/openjdk-17"
"version": "${версия компонента FSSM_discovery}",
"deploymentUnit": "fssm_discovery" # идентификатор компонента FSSM discovery
}
],
"imageLinkMapping": [
{
"regex": "(?<=(\\{\\{|\\$\\{)\\s?\\.Values\\.registry\\s?(\\}){1,2})/(\\{\\{|\\$\\{)\\s?\\.Values\\.registry_path\\s?(\\}){1,2}/fssm_discovery@sha256:(?<hash>\\w+)" # регулярное выражение для поиска в конфигурациях развертывания места с указанием image компонента
}
]
},
{
"docker": [
{
"baseImageLink": "${базовый образ для сборки приложения}", # пример "*/openjdk-17"
"version": "${версия компонента FSSM_cotroller}",
"deploymentUnit": "fssm_controller" # идентификатор компонента FSSM discovery
}
],
"imageLinkMapping": [
{
"regex": "(?<=(\\{\\{|\\$\\{)\\s?\\.Values\\.registry\\s?(\\}){1,2})/(\\{\\{|\\$\\{)\\s?\\.Values\\.registry_path\\s?(\\}){1,2}/fssm_controller@sha256:(?<hash>\\w+)" # регулярное выражение для поиска в конфигурациях развертывания места с указанием image компонента
}
]
},
{
"artifactId": "fssm-cfg",
"imageLinkMapping": [
{
"string": "/{{ .Values.registry_path_loga }}/fluent-bit@sha256:36f68f5fa6e21cc699ab336159ba3417523c6ee6e61b79d5bd6f8f5b797d1a0c",
"replace": "${ссылка на образ fluent-bit}" # необходимо указать полный путь к image компонента fluent-bit (версии 1.8.8 или 1.9 и выше)
},
{
"string": "/{{ .Values.registry_path_igegose }}/proxyv2@sha256:36f68f5fa6e21cc699ab336159ba3417523c6ee6e61b79d5bd6f8f5b797d1a0c",
"replace": "${ссылка на образ IGEG 1.2.2}" # необходимо указать полный путь к image IGEG (1.2.2), который поддерживает работоспособность с Istio версии 1.6.14
},
{
"string": "/{{ .Values.registry_path_igegse }}/proxyv2@sha256:36f68f5fa6e21cc699ab336159ba3417523c6ee6e61b79d5bd6f8f5b797d1a0c",
"replace": "${ссылка на образ IGEG 1.20}" # необходимо указать полный путь к image IGEG (1.20) который поддерживает работоспособность с Istio версии 1.20.*
},
{
"string": "/{{ .Values.registry_path_otts }}/ott-sidecar@sha256:36f68f5fa6e21cc699ab336159ba3417523c6ee6e61b79d5bd6f8f5b797d1a0c",
"replace": "${ссылка на образ ОТТ}" # необходимо указать полный путь к image ОТТ (4.2.15)
},
{
"string": "/{{ .Values.registry_path_igegse117 }}/proxyv2@sha256:36f68f5fa6e21cc699ab336159ba3417523c6ee6e61b79d5bd6f8f5b797d1a0c",
"replace": "${ссылка на образ IGEG 1.17}" # необходимо указать полный путь к image IGEG (1.17) который поддерживает работоспособность с Istio версии 1.17.*
},
{
"string": "/{{ .Values.registry_path_igegse119 }}/proxyv2@sha256:36f68f5fa6e21cc699ab336159ba3417523c6ee6e61b79d5bd6f8f5b797d1a0c",
"replace": "${ссылка на образ IGEG 1.19}" # необходимо указать полный путь к image IGEG (1.19) который поддерживает работоспособность с Istio версии 1.19.*
},
{
"string": "{{ .Values.registry }}", # при необходимости использовать .Values.global.registry
"replace": "{{ $registry }}"
}
]
}
],
"to": {
"ci": "90000017"
}
},
...
Запустить инструмент автоматической сборки продукта SSM, компонента SMDL, «ClientUnpacker» (более подробно о настройке и запуске можно ознакомиться в документации компонента «SMDL», «Руководство оператора»), результатом исполнения будут собранные для установки приложения артефакты (на email сотрудника, кто запустил job, придет таблица со ссылками на артефакты).
Провести проверку корректной подстановки образов по шаблону, указанному в пункте 1 данного алгоритма. В таблице, которая пришла после запуска job «ClientUnpacker», необходимо загрузить артефакты, относящиеся к компоненту FSSM (позиция «product FSSM_controller*» и «product FSSM_discovery*», ссылка на дистрибутив располагается в секции «distribUrl»).
### компонент FederationController
### путь к конфигурационному файлу «/package/conf/helm/application/fssm-discovery/templates/deployment-controller.yaml»
### провести поиск по ключу «image»
...
containers:
- name: federation-controller
image: '{{ $registry }}/*/fssm/fssm_controller@sha256:hash' # пример корректной подстановки образа для компонента fssm_controller
...
- name: fluent-bit
image: */fluent-bit@sha256:hash # пример корректной подстановки образа для компонента fluent-bit
...
### компонент FederationDiscovery
### путь к конфигурационному файлу «/package/conf/helm/application/fssm-discovery/templates/deployments-discovery.yaml»
### провести поиск по ключу «image»
...
containers:
- name: federation-discovery
image: '{{ $registry }}/*/fssm/fssm_discovery@sha256:hash' # пример корректной подстановки образа для компонента fssm_discovery
...
- name: fluent-bit
image: */fluent-bit@sha256:hash # пример корректной подстановки образа для компонента fluent-bit
...
{{- if eq .Values.useControl "ose" }}
image: */igeg/proxyv2:istio-release-1.6.14-se-release-1.2.2 # пример корректной подстановки образа для компонента IGEG
{{ end }}
{{- if eq .Values.useControl "ose-se" }}
image: */igeg/proxyv2:istio-release-1.20.2-se-release-1.20.2 # пример корректной подстановки образа для компонента IGEG
{{ end }}
...
envFrom:
- configMapRef:
name: ott-settings
image: */ott:v4.2.15 # пример корректной подстановки образа для компонента OTT
...
При ручной установке компонента FSSM необходимо сохранить переменную в Терминале.
Сохранить образы приложений в переменную, необходимо выполнить в CLI команду:
IMAGE_FEDERATION_DISCOVERY=$image_discovery # переменная формируется из таблицы в рамках результата работы ClientUnpacker
IMAGE_FEDERATION_CONTROLLER=$image_controller # переменная формируется из таблицы в рамках результата работы ClientUnpacker
Указанное действие необходимо для успешной установки компонента (при ручной установке).
В рамках конфигурационных файлов предусмотрена опция организации автоматизации по стендозависимым параметрам в рамках директории «conf.config.parameters», при наличии автоматизированных инструментов.
federation-discovery.all.conf
# пример параметра
federation-discovery.k8s.deployment.sidecar.istio.inject=true
federation-discovery.istio.all.conf
# пример параметра
federation-controller.k8s.deployment.sidecar.istio.inject=true
2. Подключиться к проекту#
Через CLI Kubectl
Шаг |
Действия |
Описание |
|---|---|---|
Выполнить вход в Kubernetes |
Загрузить «kubeConfig» от вашего «ServiceAccount». Завести переменную |
– |
Перейти в нужный namespace |
Ввести команду: |
– |
3. Установить необходимый перечень ресурсов#
Перед началом установки нужно убедиться, что:
для учетной записи, с которой будет производиться установка модуля, реализованы права администратора кластера
реализованы образы приложения компонента FSSM (Docker)
В рамках предоставляемого дистрибутива реализованы все необходимые ресурсы для успешного функционирования компонента FSSM.
Перечень ресурсов:
Ресурсы в рамках ролевой модели («kind: Role»/«kind: ClusterRole»/«kind: RoleBinding»/«kind: ClusterRoleBinding»).
Ресурсы в рамках используемых конфигураций («kind: CustomResourceDefinitions»).
Ресурс для реализации запроса вебхука в рамках мутирования пользовательских конфигураций («kind: MutatingWebhookConfiguration»).
Перечень секретов (federation-secret (cert.key — в него поместить ключ, cert.crt — в него поместить сертификат, ca.crt — в него поместить сертификаты «ca») / tengri (tengri.key — закрытый ключ, tengri.pem — сертификат, tengri_ca.cer — сертификаты «ca») / «ott-passwords» и «ott-synapse-federation» / «postgre-secret» - post-ca.crt, post-crt.crt, post-key.key (опционально для синхронизации с PostgreSQL) и database_secret_login и database_secret_password с логином и паролем для работы с БД (опционально при использовании PostgreSQL - database_secret_login и database_secret_password), где указывается «username: » и «password: » (в формате base64).
Настройка базы данных#
Ручная настройка базы данных#
Если в рамках установки выбран сервер PostgreSQL для организации синхронизации приложений FSSM, то необходимо подготовить все необходимые ресурсы
Подключитесь к используемой БД под учетной записью администратора.
Далее реализуйте все необходимые шаги по подготовке БД:
Создайте отдельную БД для компонента FSSM.
create database ${имя database}
Пример
create database fssm_dataset
Создайте технического пользователя, под которым будет работать компонент FSSM.
create user ${имя пользователя} with encrypted password ${пароль технического пользователя};
Пример
create user fssm_federation with encrypted password 'jjjsdgrrFFFF121fdagmm43444322rggg==';
Указанные параметры необходимо будет реализовать в секретах «database_secret_login» и «database_secret_password» в формате base64.
ВАЖНО! Перед тем, как идти дальше, необходимо подключиться к созданной базе данных.
Пример подключения
psql "host=${host PostgreSQL} dbname=${имя database}" -U ${пользователь администратора} -W
Создайте выделенную схему.
create schema ${имя схемы}
Пример
create schema fssm_federation;
Предоставьте схему в рамках выделенной БД.
grant connect on database ${имя database} to ${имя пользователя};
Пример
grant connect on database fssm_dataset to fssm_federation;
Предоставьте доступ в рамках созданной схемы.
grant all on schema ${имя схемы} to ${имя пользователя};
grant usage on schema ${имя схемы} to ${имя пользователя};
Пример
grant all on schema fssm_federation to fssm_federation;
grant usage on schema fssm_federation to fssm_federation;
Создайте табличное пространство.
create tablespace fssm_ts_data owner fssm_federation location '${полный адрес на папку в рамках сервера PostgreSQL для храниня}';
Пример
create tablespace fssm_ts_data owner ${имя схемы} location '/pgdata/fssm_federation/fssm_ts_data';
Создайте таблицы.
create table ${имя схемы}.endpoints_slice
(
id bigserial
constraint endpoints_slice_pk
primary key,
key varchar(100),
value json
);
create unique index endpoints_slice_key_uindex
on ${имя схемы}.endpoints_slice (key);
create table ${имя схемы}.discovery_federation_member_list
(
id bigserial
constraint discovery_federation_member_list_pk
primary key,
key varchar(100),
value json
);
create unique index discovery_federation_member_list_key_uindex
on ${имя схемы}.discovery_federation_member_list (key);
create table ${имя схемы}.controllers
(
id bigserial
constraint controllers_pk
primary key,
key varchar(100),
value json
);
create unique index controllers_key_uindex
on ${имя схемы}.controllers (key);
create table ${имя схемы}.discovery_service_import
(
id bigserial
constraint discovery_service_import_pk
primary key,
key varchar(100),
value json
);
create unique index discovery_service_import_key_uindex
on ${имя схемы}.discovery_service_import (key);
create table ${имя схемы}.discovery_service_export
(
id bigserial
constraint discovery_service_export_pk
primary key,
key varchar(100),
value json
);
create unique index discovery_service_export_key_uindex
on ${имя схемы}.discovery_service_export (key);
create table ${имя схемы}.traffic_policy
(
id bigserial
constraint traffic_policy_pk
primary key,
key varchar(100),
value json
);
create unique index traffic_policy_key_uindex
on ${имя схемы}.traffic_policy (key);
Предоставьте права технической учетной записи на таблицы.
grant select, update, insert, delete on ${имя схемы}.controllers TO ${имя пользователя};
grant select, update, insert, delete on ${имя схемы}.discovery_federation_member_list TO ${имя пользователя};
grant select, update, insert, delete on ${имя схемы}.endpoints_slice TO ${имя пользователя};
grant select, update, insert, delete on ${имя схемы}.discovery_service_import TO ${имя пользователя};
grant select, update, insert, delete on ${имя схемы}.discovery_service_export TO ${имя пользователя};
grant select, update, insert, delete on ${имя схемы}.traffic_policy TO ${имя пользователя};
grant usage, select on all sequences in schema ${имя схемы} to ${имя пользователя};
Также необходимо реализовать пользователя с правами только на чтение таблиц (select) и предоставить указанные права администраторам FSSM.
Автоматическая настройка базы данных#
Если в рамках установки выбран сервер PostgreSQL для организации синхронизации приложений FSSM, то необходимо подготовить все необходимые ресурсы.
С инструкцией по использовании job SMDL можно ознакомиться в документации компонента SMDL «Руководство оператора», раздел «pipelines_SynapseDBInstaller».
Первым шагом необходимо подготовить данные для подключения к серверу Pangolin/PostgreSQL.
Пример заполненных параметров для запуска Liquibase скриптов по пути «synapse-config-dev-gen/db/fssm-dbinit/»:
public.conf
DB_TYPE='postgresql'
SERVER='pangolin.server.ru' # адрес сервера
PORT='6544' # порт сервера
ADMIN_DB='fssm_dataset' # порт сервера
ADMIN_URL=jdbc:${DB_TYPE}://${SERVER}:${PORT}/${ADMIN_DB}
ITERATION_NUMBER='1' # количество итераций, при указании > 1 будет создано несколько схем с таблицами для FSSM, которым будет присвоен порядковый номер, например указана схема «NEW_SCHEMA=fssm_federation» (указанный параметр указывается в другом файле, который описан ниже), то результатом исполнения будет создание нескольких схем «fssm_federation_1», «fssm_federation_2» и тд
Далее необходимо реализовать чувствительные данные, которые будут переданы в рамках авторизации на сервер Pangolin/PostgreSQL по реализации схем и технического пользователя для FSSM
Пример данных:
ADMIN_SCHEMA=ext # root схема
ADMIN_USER=admin # логин администратора
ADMIN_PASS=admin # пароль администратора
NEW_SCHEMA=fssm_federation # наименование схемы которая будет создана при указании ITERATION_NUMBER='1' (если будет >1 итерации, то смотрите описание к указанному параметру выше)
NEW_USER=${NEW_SCHEMA} # имя пользователя, который будет создан, задается автоматически по наименованию схемы
NEW_PASS=changeme # пароль технической учетной записи для приложения discovery FSSM
После подготовки параметров необходимо провести процедуру шифрования данных.
Все приватные параметры должны лежать в файле, который начинается с символа «_». Файлы с приватными параметрами должны быть зашифрованы с помощью утилиты ansible-vault.
Пример - «ansible-vault encrypt ${filePath} —vault-password-file=${passwordFilePath}», либо воспользоваться инструментами DevOps, которые позволяют реализовать шифрование чувствительных данных.
Ожидаемый результат: _private.conf
$ANSIBLE_VAULT;1.1;AES256
# зашифрованный блок
После подготовки данных для подключения необходимо запустить job SMDL «pipelines_SynapseDBInstaller».
Пример заполнения параметров по FSSM, в рамках запуска SMDL:
nexusLink - ссылка на артефакт FSSM dbinit, который располагается в рамках nexsus;
liquibaseGitUrlSources - ссылка на репозиторий с параметрами для запуска Liquibase скриптов;
liquibaseGitBranchSources - ветка репозитория;
liquibaseConfigurationDir - необходимо указать значение «db»;
mainScriptName - необходимо указать значение «main.sh».
Рекомендуется после завершения итерации по созданию БД удалить используемый агент Jenkins, так как проводилась работа с чувствительной информацией.
Конфигурации кластера#
Через CLI Kubectl
Шаг |
Действия |
Описание |
|---|---|---|
Добавить необходимый перечень ресурсов |
В консоли выполнить команды, которые описаны в данном разделе ниже |
– |
Перед запуском заполните параметры (в терминале), где будет реализован компонент FSSM, следующей командой:
FEDERATION_NAMESPACE=<имя namespace>
IMAGE_PULL_SECRETS=<имя секрета для скачивания образа>
«kind: ServiceAccount»
Выполнить команду (в терминале):
kubectl apply -n $FEDERATION_NAMESPACE -f - <<EOF
kind: ServiceAccount
apiVersion: v1
metadata:
name: synapse-federation-controller
namespace: $FEDERATION_NAMESPACE
imagePullSecrets:
- name: $IMAGE_PULL_SECRETS
---
kind: ServiceAccount
apiVersion: v1
metadata:
name: synapse-federation-discovery
namespace: $FEDERATION_NAMESPACE
imagePullSecrets:
- name: $IMAGE_PULL_SECRETS
Ожидаемый результат:
serviceaccount/synapse-federation-controller created
serviceaccount/synapse-federation-discovery created
«kind: Role»/«kind: ClusterRole»
Выполнить команду (в терминале):
kubectl apply -n $FEDERATION_NAMESPACE -f - <<EOF
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: synapse-federation-controller-crb
rules:
- verbs:
- get
- list
- create
- update
- patch
- watch
- delete
apiGroups:
- networking.synapse.sber
resources:
- serviceexports/status
- serviceimports/status
- servicetrafficpolicies/status
- federationmemberlists/status
- federationmembers/status
- verbs:
- get
- list
- watch
apiGroups:
- ''
resources:
- services
- namespaces
- verbs:
- get
- watch
- list
apiGroups:
- networking.synapse.sber
resources:
- serviceexports
- serviceimports
- servicetrafficpolicies
- federationmemberlists
- federationmembers
- verbs:
- get
- list
apiGroups:
- rbac.authorization.k8s.io
resources:
- roles
- rolebindings
- clusterroles
- clusterrolebindings
- verbs:
- get
- list
- watch
apiGroups:
- project.openshift.io
resources:
- projects
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: synapse-federation-controller
rules:
- verbs:
- get
- update
- create
- delete
- list
apiGroups:
- networking.istio.io
resources:
- virtualservices
- serviceentries
- gateways
- destinationrules
- envoyfilters
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: synapse-federation-dns-manager
namespace: $FEDERATION_NAMESPACE
rules:
- verbs:
- get
- list
- create
- update
- patch
- watch
- delete
apiGroups:
- federation.synapse.sber
resources:
- hostentriesslice
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: synapse-federation-leases
namespace: $FEDERATION_NAMESPACE
rules:
- verbs:
- get
- list
- watch
- create
- update
- patch
- delete
apiGroups:
- coordination.k8s.io
resources:
- leases
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: synapse-federation-discovery
namespace: $FEDERATION_NAMESPACE
rules:
- verbs:
- get
- list
- create
- update
- patch
- watch
- delete
apiGroups:
- federation.synapse.sber
resources:
- endpointsslice
- discoveryserviceimports
- discoveryserviceexports
- controllers
- trafficpolicies
- discoveryfederationmemberlists
- trafficpolicies/status
EOF
Ожидаемый результат:
clusterrole.rbac.authorization.k8s.io/synapse-federation-controller-crb created
clusterrole.rbac.authorization.k8s.io/synapse-federation-controller created
role.rbac.authorization.k8s.io/synapse-federation-dns-manager created
role.rbac.authorization.k8s.io/synapse-federation-leases created
role.rbac.authorization.k8s.io/synapse-federation-discovery created
«kind: RoleBinding»/«kind: ClusterRoleBinding»
Выполнить команду (в терминале):
kubectl apply -n $FEDERATION_NAMESPACE -f - <<EOF
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: synapse-federation-controller-crb
subjects:
- kind: ServiceAccount
name: synapse-federation-controller
namespace: $FEDERATION_NAMESPACE
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: synapse-federation-controller-crb
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: synapse-federation-discovery-rb
namespace: $FEDERATION_NAMESPACE
subjects:
- kind: ServiceAccount
name: synapse-federation-discovery
namespace: $FEDERATION_NAMESPACE
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: synapse-federation-discovery
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: synapse-federation-controller-leases-rb
namespace: $FEDERATION_NAMESPACE
subjects:
- kind: ServiceAccount
name: synapse-federation-controller
namespace: $FEDERATION_NAMESPACE
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: synapse-federation-leases
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: synapse-federation-discovery-leases-rb
namespace: $FEDERATION_NAMESPACE
subjects:
- kind: ServiceAccount
name: synapse-federation-discovery
namespace: $FEDERATION_NAMESPACE
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: synapse-federation-leases
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: synapse-federation-controller-rb
namespace: $FEDERATION_NAMESPACE
subjects:
- kind: ServiceAccount
name: synapse-federation-controller
namespace: $FEDERATION_NAMESPACE
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: synapse-federation-controller
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: synapse-federation-controller-manager-rb
namespace: $FEDERATION_NAMESPACE
subjects:
- kind: ServiceAccount
name: synapse-federation-controller
namespace: $FEDERATION_NAMESPACE
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: synapse-federation-dns-manager
EOF
Ожидаемый результат:
clusterrolebinding.rbac.authorization.k8s.io/synapse-federation-controller-crb created
rolebinding.rbac.authorization.k8s.io/synapse-federation-discovery-rb created
rolebinding.rbac.authorization.k8s.io/synapse-federation-controller-rb created
rolebinding.rbac.authorization.k8s.io/synapse-federation-controller-leases-rb created
rolebinding.rbac.authorization.k8s.io/synapse-federation-discovery-leases-rb created
rolebinding.rbac.authorization.k8s.io/synapse-federation-controller-crb created
Через CLI Kubectl
Шаг |
Действия |
Описание |
|---|---|---|
Добавить необходимый перечень ресурсов |
В консоли выполнить команды, которые описаны в данном разделе ниже |
– |
CustomResourcesDefinitions
Конфигурации присутствуют в рамках дистрибутива с конфигурациями развертывания (fssm-cfg - ./package/conf/helm/application/amain/templates/crd.yaml).
Конфигурации в рамках вебхук
mutating.yaml validation.yaml
Перед выполнением команды необходимо реализовать сертификат для взаимодействия.
Сертификат в дистрибутиве для реализации вебхука не содержится и его необходимо выпустить самостоятельно. См. раздел «Управление ключами и сертификатами».
Команда:
CA_BUNDLE=<информация по «CA» сертификату>
Пример CA_BUNDLE:
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS*******
Если используется платформа Openshift, то параметр «CA_BUNDLE» заполнять не требуется, достаточно только наличия аннотации «service.beta.openshift.io/inject-cabundle».
Пример конфигурации при реализации IGEG в рамках namespace, где установлен компонента FSSM.
kubectl apply -n $FEDERATION_NAMESPACE -f - <<EOF
kind: MutatingWebhookConfiguration
apiVersion: admissionregistration.k8s.io/v1
metadata:
annotations:
service.beta.openshift.io/inject-cabundle: 'true' # при использовании Openshift
cert-manager.io/inject-ca-from: $FEDERATION_NAMESPACE/validationwebhook-federation-cert # gри использовании «cert-manager» в кластере kubernetes
name: synapse-federation-mutating-webhook
labels:
app: synapse-federation-mutating-webhook
kind: mutator
webhooks:
- name: webhook.federation.synapse.sber
sideEffects: None
clientConfig:
service:
namespace: $FEDERATION_NAMESPACE
name: ingressgateway-$FEDERATION_NAMESPACE
path: /api/webhook
port: 10445
caBundle: $CA_BUNDLE # пример «LS0tLS1CRUdJTiBDRVJ*»
reinvocationPolicy: Never
rules:
- operations:
- CREATE
- UPDATE
apiGroups:
- networking.synapse.sber
apiVersions:
- '*'
resources:
- serviceexports
- serviceimports
- servicetrafficpolicies
scope: '*'
matchPolicy: Equivalent
namespaceSelector: {}
admissionReviewVersions:
- v1
- v1alpha1
failurePolicy: Fail
objectSelector: {}
timeoutSeconds: 10
---
kind: ValidatingWebhookConfiguration
apiVersion: admissionregistration.k8s.io/v1
metadata:
name: synapse-federation-validation-webhook
annotations:
service.beta.openshift.io/inject-cabundle: 'true' # при использовании Openshift
cert-manager.io/inject-ca-from: $FEDERATION_NAMESPACE/validationwebhook-federation-cert # gри использовании «cert-manager» в кластере kubernetes
webhooks:
- name: federation.synapse.validation.sber
sideEffects: None
clientConfig:
service:
namespace: $FEDERATION_NAMESPACE
name: ingressgateway-$FEDERATION_NAMESPACE
path: /api/ingress-gw-validation
port: 10445
caBundle: $CA_BUNDLE # пример «LS0tLS1CRUdJTiBDRVJ*»
rules:
- operations:
- CREATE
- UPDATE
apiGroups:
- networking.istio.io
apiVersions:
- '*'
resources:
- gateways
scope: Namespaced
matchPolicy: Exact
namespaceSelector:
matchExpressions:
- key: $FEDERATION_NAMESPACE-federation
operator: In
values:
- 'true'
admissionReviewVersions:
- v1alpha1
- v1
failurePolicy: Ignore
objectSelector: {}
timeoutSeconds: 30
EOF
Пример реализации конфигурации при использовании «cert-manager» в кластере Kubernetes
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: validationwebhook-federation-cert
namespace: $FEDERATION_NAMESPACE
spec:
commonName: ingressgateway-$FEDERATION_NAMESPACE.$FEDERATION_NAMESPACE.svc
dnsNames:
- ingressgateway-$FEDERATION_NAMESPACE
- ingressgateway-$FEDERATION_NAMESPACE.svc
- ingressgateway-$FEDERATION_NAMESPACE.$FEDERATION_NAMESPACE.svc
duration: 43800h
issuerRef:
kind: ClusterIssuer
name: kubernetes-selfsigning-issuer
renewBefore: 4380h
secretName: ingressgateway-webhook
Установка#
В случае использования режима с использованием СУБД, необходимо выполнить установку базы данных согласно документации используемой СУБД.
В случае реализации сбора метрик посредством Prometheus, необходимо ознакомиться с документом «Руководство по системному администрированию», раздел «События мониторинга».
Предусловие#
Использование сертификатов с использованием «vault»#
Использование KV (key value) хранилища для сертификатов
Обращаем внимание, что используется «version: 1», в рамках создания хранилища секретов (kv).
Необходимо предварительно реализовать ряд работ по настройке интеграционных взаимодействий vault/LOGA/OTT:
Реализовать хранилище секретов (vault), где предварительно создать сертификаты и ключи (в рамках хранилища ключи и сертификаты должны быть в формате base64):
federation-secret — необходимо реализовать приватный ключ, сертификат и цепочку сертификатов (cert.key/cert.crt/ca.crt);
ott-secrets-pem - необходимо реализовать сертификаты и ключ для успешного взаимодействия ОТТ (ott-ec.crt.pem/ott-service.crt.pem/ott-synapse-federation.crt.pem/ott-synapse-federation.key.pem) с алиас «OTT_CLIENT_CERT_ALIAS: synapse-federation», про правила формирования необходимо уточнить в документации компонента ОТТ;
database_secret_login - необходимо указать логин пользователя для работы с БД PostgreSQL (в base64), опционально;
database_secret_password - необходимо указать пароль пользователя для работы с БД PostgreSQL (в base64), опционально;
postgre-secret - необходимо реализовать сертификаты и ключ для успешного взаимодействия с БД PostgreSQL (post-ca.crt/post-crt.crt/post-key.key), опционально;
webhook - необходимо реализовать сертификат и ключ для успешного взаимодействия по admission request от Kube API server (tls.crt/tls.key), опционально;
Зарегистрировать компонент в рамках серверов ОТТ, с наименованием «OTT_MODULE_ID: synapse-federation».
Использование PKI engine хранилища для сертификатов
При использовании функции PKI engine приложения vault, необходимо реализовать хранилище указанного формата, более подробно можно ознакомиться на сайте vault.
ВАЖНО! При реализации директории, в рамках которой будет организовано хранилище PKI engine, необходимо придерживаться следующего пути /, где:
- значение аннотации vault в рамках приложения «vault.hashicorp.com/namespace»;
- путь к каталогу где будет реализован PKI engine, также необходимо указывать метод запроса, например «issue» и наименование роли в рамках которой будет реализован сертификат;
Пример итогового пути к PKI engine будет выглядеть следующим образом - «DEV/PKI/issue/role».
Реализация в рамках конфигурационных файлов, на примере генерации сертификата для Kafka:
{{`{{- with secret`}} "{{ .Values.vault.secmanNamespace }}/{{ .Values.vault.pki_engine.egress.kafka.pki_path }}" "common_name={{ .Values.vault.pki_engine.egress.kafka.common_name }}" {{`-}} {{ .Data.certificate }} {{- end }}`}}
При выпуске сертификатов идет обращение в рамках «.Data» PKI engine:
к корневому сертификату - параметризуется в рамках стендозависимых параметров vault.pki_engine.(egress/ingress).*.data.ca.name;
к клиентскому, либо серверному сертификату - ;
к приватному ключу - .
Использование указанной функции производится при установке приложения и активации стендозависимых параметров:
vault:
pki_engine:
enabled: 'false' # флаг, указывающий на использование PKI engine в рамках хранения сертификатов (общий, при указании 'false' все сертификаты будут использоваться из KV version 1)
ingress: # группа сертификатов использующиеся для входящего трафика
federation: # группа параметров для сертификата по интеграции приложений FSSM
pki_enabled: 'false' # локальный флаг использования PKI engine
pki_path: PKI/issue/pki # частичный пусть к PKI engine путь формируется по структуре ({{ .Values.vault.secmanNamespace }}/{{ .Values.vault.pki_engine.ingress.federation.pki_path }}), также необходимо указывать метод запроса, например «issue» и наименование роли в рамках которой будет реализован сертификат
common_name: federation.host # параметр в рамках указывающий «common_name» выпускаемого сертификата
data: # группа параметров для возможности изменения параметров по корневому сертификату
ca:
name: ca_chain # имя корневого сертификата в рамках PKI engine, пример реализации по умолчанию «{{ .Data.ca_chain }}»
range: 'false' # флаг использования «range» для реализации цепочки сертификатов ({{ range $k, $v := .Data.ca_chain }} {{- $v }} {{- end -}})
bootstrap: # группа параметров для сертификата приложений FSSM (при использовании режима bootstrap и реализация отдельных сертификатов для этого)
pki_enabled: 'false'
pki_path: PKI/issue/pki
common_name: bootstrap.host
data:
ca:
name: ca_chain
range: 'false'
webhook: # группа параметров для сертификата по webhook взаимодействию (при использовании сертификатов из vault, также при выпуске такого рода сертификата необходимо убедиться, что caBundle секция, в рамках webhook configuration доверяют друг другу)
pki_enabled: 'false'
pki_path: PKI/issue/pki
common_name: webhook.host # при выпуске сертификата необходимо придерживаться логике формирования «common_name» - $имя сервиса.$имя проекта.svc
egress: # группа сертификатов использующиеся для исходящего трафика
federation: # группа параметров для сертификата по интеграции приложений FSSM
pki_enabled: 'false'
pki_path: PKI/issue/pki
common_name: federation.host
data:
ca:
name: ca_chain
range: 'false'
bootstrap: # группа параметров для сертификата приложений FSSM (при использовании режима bootstrap и реализация отдельных сертификатов для этого)
pki_enabled: 'false'
pki_path: PKI/issue/pki
common_name: bootstrap.host
data:
ca:
name: ca_chain
range: 'false'
kafka: # группа параметров для сертификата по интеграции с Kafka (при использовании агента сбора логов)
pki_enabled: 'false'
pki_path: PKI/issue/pki
common_name: kafka.host
data:
ca:
name: ca_chain
range: 'false'
postgres: # группа параметров для сертификата по интеграции с Postgres (при использовании Postgres для синхронизации федераций)
pki_enabled: 'false'
pki_path: PKI/issue/pki
common_name: postgres.host
data:
ca:
name: ca_chain
range: 'false'
Автоматическая установка сервиса#
Если выбран вариант автоматической установки, то необходимо убедиться, что выполнены шаги разделов:
«1. Создать директорию установки»;
«3. Установить необходимый перечень ресурсов».
В рамках артефакта по установке предоставляется 2 чарта:
amain - в рамках чарта устанавливаются CRD которые необходимы для работы компонента;
fssm-discovery - чарт для установки компонента FSSM.
Заполнить стендозависимые параметры для установки компонента FSSM, пример: FederationDiscovery
### Необходимо реализовать файл values.yaml
### Расположение файла в рамках git ветки job «SynapseInstaller» (более подробно о настройке и запуске можно ознакомиться в документации компонента «SMDL», «Руководство оператора»)
### Для установки CRD компонента FSSM - synapse-config-dev-gen/${имя проекта для установки}/package/conf/helm/fssm-main/values.yaml
### Для компонента FSSM - synapse-config-dev-gen/${имя проекта для установки}/package/conf/helm/fssm/values.yaml
Более подробно описано в рамках указанного документа, раздел «Стендозависимые параметры».
Запустить job компонента SMDL, «SynapseInstaller» (более подробно о настройке и запуске можно ознакомиться в документации компонента «SMDL», «Руководство оператора»).
В рамках запуска job «SynapseInstaller» необходимо выбрать опцию установки «needInstallSelectedCharts».
Ручная установка сервиса#
Перед началом установки убедитесь, что выполнена подготовка окружения и в рамках персонального компьютера установлен Helm версии не ниже 3.0.
Алгоритм действий при ручной установке сервиса:
Загрузить артефакт компонента FSSM с конфигурациями для установки (fssm-cfg-*) в рамках дистрибутива SSM.
При необходимости провести корректировку конфигураций, располагаемых в каталоге «./package/conf/helm/application/fssm-discovery/templates/*» (например провести подстановку image приложений FederationDiscovery и FederationController).
Перейти в рамках терминала в каталог «./package/conf/helm/application».
Провести авторизацию через терминал в кластер, где планируется установка компонента FSSM (пример для Openshift «oc login –token=$ТОКЕН –server=$АДРЕС_КЛАСТЕРА»).
Пройти в namespace, где планируется установка компонента FSSM (пример для Openshift «oc project synapse-federation»).
Провести заполнение файла «./package/conf/helm/application/fssm-discovery/values.yaml» (описание параметров указана в указанном документе, раздел «Стендозависимые параметры»).
Провести установку компонента FSSM - «helm install fssm –values fssm-discovery/values.yaml»; При необходимости удалить компонент FSSM - «helm delete fssm».
При возникновении ошибок/проблем при установке рекомендуем ознакомиться с документацией на компонент Граничный прокси (IGEG) продукта «Platform V Synapse Service Mesh» (SSM) в документе «Руководство по установке», раздел «Часто встречающиеся проблемы и пути их устранения» и документации инструмента «helm».
Если используется платформа Openshift, то необходимо организовать доступ в рамках «namespace», реализовав следующую конфигурацию:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-from-default-namespaces
spec:
podSelector: {}
ingress:
- from:
- namespaceSelector:
matchLabels:
name: default
policyTypes:
- Ingress
Описание параметров «kind: ConfigMap» federation-controller-params (в рамках выбранной архитектуры взаимодействия):
discovery.bootstrap.url — взаимодействие организовано посредством граничного прокси, в указанном параметре указать URL сервиса «пример: egressgateway-discovery.$PROJECT_NAME.svc.cluster.local».
discovery.bootstrap.port — порт, по которому будет проходить взаимодействие (если взаимодействие идет через граничный прокси, то необходимо указать «6443»).
global.federation.domain — указание, какой будет использоваться домен в рамках построения федеративной маршрутизации (по умолчанию стоит «clusterset.local»).
global.federation.label — метка (label) на пользовательском «Namespace», в рамках которого компонент FederationController будет обрабатывать пользовательские конфигурации.
global.controller.egress.tls.cipherSuitesArray — список групп шифров, которые будет использованы при внутреннем взаимодействии (в рамках namespace).
global.controller.egress.tls.minVersion - минимальная версия TLS при внутреннем взаимодействии (в рамках namespace).
global.controller.ingress.tls.cipherSuitesArray - список групп шифров, который будет использован при внешнем взаимодействии (вне рамок namespace).
global.controller.ingress.tls.minVersion — минимальная версия TLS при внешнем взаимодействии (вне рамок namespace).
global.controller.leader-election.name — диапазон синхронизации компонента FederationController с FederationDiscovery.
global.controller.leader-election.lease-duration — диапазон, в рамках которого при неактивности «лидера» подов будет выбран другой «лидер».
global.controller.leader-election.namespace — имя «Namespace», в котором будет реализована конфигурация, хранящая в себе информацию по текущему «лидеру» Pod.
global.controller.egress.envoyFilter.workloadSelector.label.name - ключ по умолчанию, в рамках которого будут применяться конфигурации при реализации «kind: ServiceImport» (PodSelector).
global.controller.egress.envoyFilter.workloadSelector.label.value — значение по умолчанию, в рамках которого будут применяться конфигурации, при реализации «kind: ServiceImport»(PodSelector).
global.controller.egress.headLessValidationEnable - boolean значение (true/false), включение функциональности по валидации пользовательского сервиса. Более подробно можно ознакомиться в документе «Руководство прикладного разработчика», раздел «Валидация пользовательского «kind: Service».
controller.egress.destination-rule.workload-selector.enabled - boolean значение (true/false), реализует секцию workloadSelector при организации федеративного трафика в рамках конфигурации «kind: DestinationRule».
discovery.federation.egress.destination-rule.ca-certificate - путь к сертификату (ca) egressgateway проекта, где установлен FSSM, при использовании федеративного трафика в проекте.
discovery.federation.egress.destination-rule.private-key - путь к приватному ключу (key) egressgateway проекта где установлен FSSM, при использовании федеративного трафика в проекте.
discovery.federation.egress.destination-rule.client-certificate - путь к сертификату (клиентскому) egressgateway проекта, где установлен FSSM, при использовании федеративного трафика в проекте.
global.controller.leader-election.ping-rate - периодичность синхронизации приложения FederationController с приложением FederationDiscovery (указывается в миллисекундах).
controller.egress.service-protocol-validation.enabled - режим по проверке используемых протоколов взаимодействия. Например, сервер поставщик зарегистрировал свой сервис под портом GRPC, и при попытке реализовать «kind: ServiceImport» с HTTP протоколом будет ошибка (в ошибке будет условие перейти на GRPC, так как сервер сказал именно такой протокол в рамках «kind: ServiceExport»).
project-registration.crd.enabled - активация возможности реализовать регистрацию пользовательских namespace по «kind: FederationMemberList».
project-registration.federation-member.enabled - предоставление возможности пользователям самостоятельно регистрировать свой namespace посредством «kind: FederationMember».
При установке компонента FederationController необходимо указать его месторасположение (регион/кластер, либо любую свою топологию регион/зона), в рамках заданной топологии будут помечаться все зарегистрированные сервисы в федерации (в дальнейшем можно будет распределять трафик по весам, как раз в рамках выбранной топологии).

Схема. Монтирование параметров посредством «kind: ConfigMap» компонента FederationController
Параметры «kind: ConfigMap» federation-controller-params (в рамках разметки топологии):
global.cluster.id— уникальный идентификатор кластера, в котором будет расположен контроллер (у каждого компонента FederationController), интегрированный с FederationDiscovery, должен быть уникальный идентификатор, чтобы точно идентифицировать компонент.global.cluster.region— регион расположения компонента FederationController, у всех найденных экземпляров зарегистрированных сервисов в федерации («kind: ServiceExport») будет присвоена топология, в данном случае регион (чтобы в дальнейшем можно было идентифицировать топологию и применять правила маршрутизации).global.cluster.name— наименование кластера/группы кластеров, которому/-ым будет присвоена указанная топология (зона), у всех найденных экземпляров зарегистрированных сервисов в федерации («kind: ServiceExport») будет присвоена топология, в данном случае зоны (чтобы в дальнейшем можно было идентифицировать топологию и применять правила маршрутизации).global.cluster.routeHostName— конкретизация домена в рамках кластера, например, компонент FederationController публикуется в кластере, в котором все созданные конфигурации «Шлюз» создаются в рамках домена кластера (пример — apps.santa.ru), интеграция в кластер будет строиться на основе этого домена.

Схема. Топология кластера
Параметр $USER_NAMESPACE компонент FederationController получает автоматически, это местоположение реализованной пользовательской конфигурации «kind: ServiceExport», по которой будет зарегистрирован пользовательский сервис «kind: Service».
Тем самым получаем логическую топологию в рамках месторасположения кластеров.
Ограничение
Если в рамках установки не был реализован компонент IGEG (раздел данной документации «Установка шлюзов ingressgateway/egressgateway»), то необходимо изменить конфигурацию «kind: MutatingWebhookConfiguration» и «kind: ValidatingWebhookConfiguration»:
kind: MutatingWebhookConfiguration
apiVersion: admissionregistration.k8s.io/v1
metadata:
name: synapse-federation-mutating-webhook
...
clientConfig:
service:
namespace: ${NAMESPACE}
name: ${NAME_SERVICE}
path: /mutate
port: ${PORT_SERVICE}
...
Где указать путь к сервису, который сможет расшифровать исходный трафик от «KubeAPI server» и перенаправить его по host «federation-controller.$FEDERATION_NAMESPACE.svc:8443».
Стендозависимые параметры#
Чарт amain Чарт fssm-discovery
values.yaml (чарта amain (fssm-main))
release_version: "1.7.0" # указать версию релиза
config_version: "1.7.0" # указать версию конфигурации
component_type: service
crd:
install: "false" # установка CRD (kind: CustomResourceDefinitions)
useCRDProxy: "false" # установка CRD (kind: CustomResourceDefinitions) посредством компонента CRDproxy (уникальное решение одного из клиента)
values.yaml (чарта fssm-discovery (fssm))
release_version: "1.10.0" # указать версию релиза
config_version: "1.10.0" # указать версию конфигурации
component_type: service
#global:
# registry: moi.space # registry в рамках которого реализован образ приложений
# clusterName: moi.cluster # опциональный параметр для конкретизации клаcтера
#registry: # при использовании указанного параметра, используется если не произведена автоматическая сборка и не произведена замена на .Values.global.registry
#registry_path_igegose: # при использовании выделенного path для istio 1.6
#registry_path_igegse117: # при использовании выделенного path для istio 1.17
#registry_path_igegse119: # при использовании выделенного path для istio 1.19
#registry_path_igegse: # при использовании выделенного path для istio 1.20 установить несколько федераций, важно учитывать изменение
#registry_path_loga: # при использовании выделенного path для fluent-bit
#registry_path_otts: # при использовании выделенного path для OTT
registry_path: /dev # Docker path где расположен образы FSSM
indexFederation: '' # уникальный идентификатор установки FSSM, указывается при необходимости установить несколько федераций, важно учитывать изменение адреса ({{ if not (eq .Values.indexFederation "") }}{{ .Values.indexFederation }}-{{ end }}grpc-federation-discovery.{{ if .Values.global.clusterName }}{{ .Values.global.clusterName }}{{ else }}{{ .Values.cluster }}{{ end }}), также используется для унификации конфигураций ролевой модели и webhooks (указание параметра необходимо без специальных символов)
cluster: apps.stands.solution.sbt # наименование кластера, формата «apps.stands-vdc01.solution.sbt»
region: 'moscow' # наименование региона, где производится установка компонента
useControl: ose # используемая версия Istio, при использовании версии 1.6 необходимо указать значение «ose», при использовании контрольной панели POLM реализовать значение «ose-se» и при использовании POLM в рамках Kubernetes необходимо указать значение «k8s»
serviceIstiod: istiod-basic # наименование сервиса контрольной панели, компонента «istiod»
istioControlPlane: sbt-controlplane # наименование namespace контрольной панели, к которой подключен namespace компонента FSSM
discoveryCluster: apps.stands.solution.sbt # наименование кластера, где установлен лидер FederationDiscovery (описание про лидера реализовано в документе «Детальная архитектура» в разделе «Диаграммы развертывания»)
discovery_external_port: 443 # внешний порт по которому идет обращение к discovery (подставляется в ServiceEntry)
#discovery_external_ip: *.*.*.* # внешний IP-адрес discovery, указывается опционально, при указании параметра «discovery_resolution: STATIC»
discovery_resolution: DNS # resolution адреса discovery (подставляется в ServiceEntry)
discovery_persistent_type: kubeapi # указание места хранения федеративной маршрутизации (kubeapi - внутри кластера, Postgresql - использование postgreSQL)
discoveryLeaderInNamespace: 'true' # при установке компонента FederationController в рамках namespace лидера компонента FederationDiscovery необходимо указать значение «'true'», если лидер FederationDiscovery располагается в другом кластере необходимо указать значение «'false'»
kubeAPIIP: '*.*.*.*' # IP-адрес сервиса KubeAPI (kubernetes.default.svc.cluster.local)
kubePort: 443 # Port сервиса KubeAPI (kubernetes.default.svc.cluster.local), параметр указывается при установке в Kubernetes кластер (useControl: k8s)
kubeAPIRefreshTokenPeriod: 30000 # период проверки токена при обращении в KubeAPI, указывается в миллисекундах (активный при выставлении параметра «projectedKubeAPI: 'true'»)
kubeAPIResolution: DNS # resolution в рамках реализации конфигурации «kind: ServiceEntry» по host Kube API server
kubeEgressRouting: TLS # реализация конфигураций Istio (TLS перехват трафика в рамках tls, TCP перехват трафика по tcp, DISABLE инициация по HTTP протоколу и реализация сертификата на egress)
projectedKubeAPI: 'false' # признак монтирования токена для работы с KubeAPI, если стоит значение false, то токен будет примонтирован автоматически, если true то токен будет примонтирован в рамках Deployment
seccompProfile: 'false' # флаг установки параметра seccompProfile в секции securityContext у «kind: Deployment» (указанный параметр поддерживается в Kubernetes версии 1.25+)
generate_ephemeral_storage: 'true' # флаг установки ephemeral-storage в рамках контейнеров, конкретизация ресурсов указывается для каждого контейнера отдельно, при установке флага как «false» монтирование ephemeral-storage производиться не будет
affinity: 'true' # флаг установки podAntiAffinity с конкретизацией метки (label) при установке на Node
poddistruptionbudget: 'true' # флаг установки конфигурации «kind: PodDistruptionBudget»
enabledPriorityClassName: 'true' # флаг установки параметра PriorityClassName в рамках «kind: Deployment»
priorityClassName: system-cluster-critical # значение параметра PriorityClassName в рамках «kind: Deployment»
validating_protocol_sex: "false" # режим валидации протоколов при регистрации «kind: ServiceExport» и проверки в корректной интеграции «kind: ServiceImport» (например сервер опубликовал GRPC порт, а потребитель пытается настроить HTTP интеграцию - в данном случае FSSM выдаст ошибку и опишет ошибку в рамках конфигурации)
affinityMatchKey: beta.kubernetes.io/arch # реализация affinityMatchKey в рамках IGEG
affinityMatchValues: # реализация affinityMatchValues в рамках IGEG
- amd64
- ppc64le
- s390x
ottUserConfig: ose # версия контрольной панели для реализации конфигурации «kind: EnvoyFilter» для реализации в рамках пользовательских интеграций. ose реализация конфигурации в рамках версии API envoy v2, k8s реализация конфигурации в рамках версии API envoy v3
workloadSelectorDRS_Federation: 'true' # добавление в федеративные конфигурации DestinationRule секции workloadSelector на egressgateway
ottInstall: 'true' # необходимость установки ОТТ в рамках проекта FSSM
add_kind_sidecar_cp: 'true' # включение в рамках «kind: sidecar» проект контрольной панели
webhooks:
install: "true" # флаг установки конфигураций «MutatingWebhookConfiguration» и «ValidatingWebhookConfiguration» из дистрибутива
namespaceSelectorMutation: "true" # реализация namespaceSelector в рамках конфигурации по мутации ({{ Имя проекта федерации }}-federation)
useCertManager: "true" # публикация конфигурации «kind: Certificate»
nginx:
backendProtocol: HTTPS # значение аннотации в рамках «kind: Route» - nginx.ingress.kubernetes.io/backend-protocol
installRoleModel: "true" # флаг установки ролевой модели из дистрибутива (без реализации RoleBinding в рамках пользовательских namespace)
roleBindings:
install: "false" # реализация RoleBinding
useCustom:
install: "false" # уникальные конфигурации одного из клиента, по организации ролевой модели
# synapse_federation_controller_crb: # данные для роли synapse_federation_controller_crb
# version:
# roleUID:
# hash:
# synapse_federation_discovery: # данные для роли synapse_federation_discovery
# version:
# roleUID:
# hash:
# synapse_federation_leases: # данные для роли synapse_federation_leases
# version:
# roleUID:
# hash:
# synapse_federation_discovery_leases: # данные для роли synapse_federation_discovery_leases
# version:
# roleUID:
# hash:
# synapse_federation_controller: # данные для роли synapse_federation_controller
# version:
# roleUID:
# hash:
add_serviceaccount: 'false' # флаг установки «kind: ServiceAccount»
image_pull_secret: pull # наименование imagePullSecrets для успешного обращения в docker registry
peer_authentication:
install: 'true' # флаг установки конфигурации «kind: PeerAuthentication»
mtls_mode: STRICT # указание используемого мода
bootstrap:
mode: 'false' # флаг использования федеративного трафика для приложения FederationController (добавляется в федерацию сервис FederationDiscovery), поддерживает работоспособность при использовании PostgreSQL для синхронизации
use_default_address: 'true' # использование адреса «{{ if not (eq .Values.indexFederation "") }}{{ .Values.indexFederation }}-{{ end }}grpc-federation-discovery.{{ if .Values.global.clusterName }}{{ .Values.global.clusterName }}{{ else }}{{ .Values.cluster }}{{ end }}» для федеративной маршрутизации, при значении «false» будет создан дополнительный Ingresses/Route предназначенный для федеративного трафика «grpc-bootstrap-discovery{{ .Values.indexFederation }}.{{ .Values.cluster }}»
ott: 'true' # использование ОТТ при организации федеративного трафика для приложения FederationController
gateway: # опционально, при значении параметра «use_default_address: 'false'» необходимо будет реализовать сертификаты для федеративного адреса «{{ if not (eq .Values.indexFederation "") }}{{ .Values.indexFederation }}-{{ end }}grpc-bootstrap-discovery.{{ if .Values.global.clusterName }}{{ .Values.global.clusterName }}{{ else }}{{ .Values.cluster }}{{ end }}» на ingressgateway конфигурация «kind: Gateway»
caCertificates:
path: /etc/service/federation-secret
name: ca.crt
privateKey:
path: /etc/service/federation-secret
name: cert.key
serverCertificate:
path: /etc/service/federation-secret
name: cert.crt
destinationRule: # опционально, при значении параметра «use_default_address: 'false'» необходимо будет реализовать сертификаты для федеративного адреса «{{ if not (eq .Values.indexFederation "") }}{{ .Values.indexFederation }}-{{ end }}grpc-bootstrap-discovery.{{ if .Values.global.clusterName }}{{ .Values.global.clusterName }}{{ else }}{{ .Values.cluster }}{{ end }}» на egressgateway конфигурация «kind: DestinationRule»
caCertificates:
path: /etc/service/federation-secret
name: ca.crt
privateKey:
path: /etc/service/federation-secret
name: cert.key
clientCertificate:
path: /etc/service/federation-secret
name: cert.crt
traffic_policy: # настройки default-traffic-policy.yml, указаны значения по умолчанию
loadBalancer:
localityType: SYNAPSE
localityLbSetting:
enabled: true
simple: ROUND_ROBIN
outlierDetection:
baseEjectionTime: 1m
consecutive5xxErrors: 4
interval: 1m
maxEjectionPercent: 100
retryPolicy:
attempts: 3
retryOn: 5xx
retryRemoteLocalities: true
connectionPool:
tcp:
connectTimeout: 1s
crd:
install_only_crd: "false" # произвести установку CRD без приложений FSSM
registration_federation_member_list: # настройка функционала по регистрации пользовательских namespace посредством CRD
use: "false" # активировать регистрацию посредством «kind: FederationMemberList»
federation_id: # уникальный идентификатор федерации, выбирается пользователем
close_federation: "false" # разрешить регистрацию в федерацию только администратору, через конфигурацию «kind: FederationMemberList», если значение «false», то будет разрешена регистрация посредством «kind: FederationMember»
use_default_label_selector: "true" # использовать значение labelSelector по логике прошлых версий - {{ .Values.namespace }}-federation: true (поддержка обратной совместимости)
add_namespaces: # добавление списка namespace в федерацию
- namespace: user-1
exclude_namespaces: # реализовать список исключения из федерации при установке namespace
- namespace: user-3
use_custom_label_selector: # реализация собственного labelSelector, при необходимости (при использовании необходимо выставить флаг use_default_label_selector: "false")
matchExpressions:
- key: synapse-federation
operator: In
values:
- true
#tenants_federation: # блок для создания последующих тенантов, в рамках регистрации пользовательских namespace
# - federation_id: # уникальный идентификатор федерации, выбирается пользователем
# use_default_label_selector: "false" # использовать значение labelSelector по логике прошлых версий - {{ .Values.namespace }}-federation: true (поддержка обратной совместимости)
# add_namespaces: # добавление списка namespace в федерацию
# - namespace: user-1
# - namespace: user-2
# exclude_namespaces: # реализовать список исключения из федерации при установке namespace
# - namespace: user-3
# - namespace: user-4
# use_custom_label_selector: # реализация собственного labelSelector при необходимости (при использовании необходимо выставить флаг use_default_label_selector: "false")
# matchExpressions:
# - key: synapse-federation
# operator: In
# values:
# - true
sync:
enabled: 'true' # включение синхронизации данных в KubeAPI server при работе с PostgreSQL server, позволяет организовать копии федеративных конфигураций в рамках кластеров, для возможности производить плавный переход на работу с KubeAPI server
syncKubeAPIPeriod: '10000' # период синхронизации федеративных данных в KubeAPI server
updatesPeriod: '3000' # период синхронизации федеративных данных в PostgreSQL server для анализа добавления/изменения/удаления федеративных сервисов
retryDelay: '5000' # периодичность опроса логина и пароля в рамках подключения к Pangolin (discovery)
retryAttempts: '5' # количество повторных попыток опроса логина и пароля в рамках подключения к Pangolin (discovery)
workerControllerCount:
ingress: '2' # количество потоков при обработке «kind: ServiceExport», чем больше потоков, тем быстрее происходит обработка, но используется больше ресурсов в рамках работы
egress: '2' # количество потоков при обработке «kind: ServiceImport», чем больше потоков, тем быстрее происходит обработка, но используется больше ресурсов в рамках работы
trafficPolicy: '2' # количество потоков при обработке «kind: ServiceTrafficPolicy», чем больше потоков, тем быстрее происходит обработка, но используется больше ресурсов в рамках работы
postgre_connect_parameters: stringtype=unspecified&prepareThreshold=0 # параметры подключения к postgreSQL
postgre_address: vm-psql-dev:5432 # адрес postgreSQL server (пример vm-syndicute-psql.sy.dev:5432)
postgre_schema: fssm_federation # имя схемы
postgre_database: fssm_data # имя базы данных
postgre_egress_protocol: TCP # используемый протокол в рамках namesapce FSSM, конфигурации «kind: Gateway» на egressgateway
postgresql:
- datasource_url: vm-psql-dev # хост сервера postgre
name: master # наименование (для идентификации сервера, может принимать любое значение)
server_ip: '*.*.*.*' # IP–адрес postgreSQL server
localPort: 7443 # уникальный неиспользуемый порт для корректной маршрутизации внутри namespace
port: 5432 # порт postgreSQL server
resolution: DNS
igeg:
version: # флаг устанавливается только в том случае, если версия Istio 1.6/1.17/1.19 и выше (пример заполнения '1.17')
istio:
ingress:
dsr:
spec:
trafficPolicy:
outlierDetection:
baseEjectionTime: 1m # значение параметра baseEjectionTime в рамках «kind: DestinationRule» при синхронизации данных
consecutive5xxErrors: 10 # значение параметра consecutive5xxErrors в рамках «kind: DestinationRule» при синхронизации данных
interval: 1m # значение параметра interval в рамках «kind: DestinationRule» при синхронизации данных
maxEjectionPercent: 20 # значение параметра maxEjectionPercent в рамках «kind: DestinationRule» при синхронизации данных
discovery:
replicas: 1 # количество Pod у компонента FederationDiscovery
livenessProbe: # параметры livenessProbe контейнера FederationDiscovery
failureThreshold: 30
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
readinessProbe: # параметры readinessProbe контейнера FederationDiscovery
failureThreshold: 30
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
strategy_type: RollingUpdate # strategy type в рамках «kind: Deployment» контейнера FederationDiscovery (поддержка Recreate и RollingUpdate)
strategy:
rollingParams:
maxSurge: 100% # установка параметра maxSurge в рамках «kind: Deployment»
maxUnavailable: 25% # установка параметра maxUnavailable в рамках «kind: Deployment»
podDisruptionBudget:
apiVersion: policy/v1 # apiVersion конфигурации podDisruptionBudget для приложения FederationDiscovery
spec:
minAvailable: 1 # значение параметра minAvailable конфигурации podDisruptionBudget для приложения FederationDiscovery
resources: # ресурсы приложения FederationDiscovery
limits:
cpu: 1
ephemeral_storage: 500Mi
memory: 1000Mi
requests:
cpu: 1
ephemeral_storage: 500Mi
memory: 1000Mi
svpx: # ресурсы приложения SVPX (сервисный прокси)
resources:
limits:
cpu: 100m
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
fluent:
kafkaBrokersList: kafka-tdev.sion:9093 # список брокеров Kafka
kafkaTopic: fssm # топик Kafka
capabilities: "false" # флаг установки securityContext/capabilities/drop/ALL приложению fluent-bit
resources: # ресурсы приложения fluent-bit
limits:
cpu: 100m
ephemeral_storage: 500Mi
memory: 200Mi
requests:
cpu: 100m
ephemeral_storage: 500Mi
memory: 200Mi
leases_type_on: 'false' # параметр включающий использование leases (Api Group: coordination.k8s.io), ВНИМАНИЕ! при значении true необходимо развернуть ролевую модель использования leases (get, list, watch, create, update, patch, delete)
controller:
replicas: 1 # количество Pod у компонента FederationController
discovery_host_alias: 'false' # добавление host alias в рамках FederationController для организации федеративного трафика
configurationHashCodeEnable: 'false' # включение режима подсчет контрольных сумм, в рамках которых после обработки федеративных конфигураций будет вестись подсчет, позволяет снизить нагрузку при рестарте FederationController
livenessProbe: # параметры livenessProbe контейнера FederationController
failureThreshold: 30
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
readinessProbe: # параметры livenessProbe контейнера FederationController
failureThreshold: 30
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
strategy_type: RollingUpdate # strategy type в рамках «kind: Deployment» контейнера FederationController (поддержка Recreate и RollingUpdate)
strategy:
rollingParams:
maxSurge: 100% # установка параметра maxSurge в рамках «kind: Deployment»
maxUnavailable: 25% # установка параметра maxUnavailable в рамках «kind: Deployment»
headLessValidationEnable: "true" # включение(true)/выключение(false) функциональности по валидации headless сервиса, более подробно можно ознакомиться в документе Руководство прикладного разработчика, раздел «Валидация пользовательского «kind: Service»
podDisruptionBudget:
apiVersion: policy/v1 # apiVersion конфигурации podDisruptionBudget для приложения FederationController
spec:
minAvailable: 1 # значение параметра minAvailable конфигурации podDisruptionBudget для приложения FederationController
rate_limiter_config: # ограничение запросов в рамках работы с Kube API server
service: # ограничение запросов в рамках работы с Kube API server по конфигурациям «kind: Service»
enabled: 'false' # активация ограничения
capacity: 400 #
duration: 60
tokensGeneratedInPeriod: 500
service_export: # ограничение запросов в рамках работы с Kube API server по конфигурациям «kind: ServiceExport»
enabled: 'false' # активация ограничения
capacity: 400 # максимальное количество запросов, более подробно можно ознакомиться в документации по механики работы Rate Limited
duration: 60 # длительность периода (секунды)
tokensGeneratedInPeriod: 500 # количество запросов (ограничивающих) которое пополняется за период (duration)
service_import: # ограничение запросов в рамках работы с Kube API server по конфигурациям «kind: ServiceImport»
enabled: 'false' # активация ограничения
capacity: 400 # максимальное количество запросов, более подробно можно ознакомиться в документации по механики работы Rate Limited
duration: 60 # длительность периода (секунды)
tokensGeneratedInPeriod: 500 # количество запросов (ограничивающих) которое пополняется за период (duration)
traffic_policy: # ограничение запросов в рамках работы с Kube API server по конфигурациям «kind: ServiceTrafficPolicy»
enabled: 'false' # активация ограничения
capacity: 400 # максимальное количество запросов, более подробно можно ознакомиться в документации по механики работы Rate Limited
duration: 60 # длительность периода (секунды)
tokensGeneratedInPeriod: 500 # количество запросов (ограничивающих) которое пополняется за период (duration)
resources: # ресурсы приложения FederationController
limits:
cpu: 1
ephemeral_storage: 500Mi
memory: 1000Mi
requests:
cpu: 1
ephemeral_storage: 500Mi
memory: 1000Mi
svpx: # ресурсы приложения SVPX (сервисный прокси)
resources:
limits:
cpu: 100m
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
fluent:
capabilities: "false" # флаг установки securityContext/capabilities/drop/ALL приложению fluent-bit
resources: # ресурсы приложения fluent-bit
limits:
cpu: 100m
ephemeral_storage: 500Mi
memory: 200Mi
requests:
cpu: 100m
ephemeral_storage: 500Mi
memory: 200Mi
leases_type_on: 'false' # параметр включающий использование leases (Api Group: coordination.k8s.io), ВНИМАНИЕ! при значении true необходимо развернуть ролевую модель использования leases (get, list, watch, create, update, patch, delete)
fluent:
install: 'false' # флаг установки fluent-bit, для сбора логов и передачи их в рамках kafka сервера
add_parser_timestamp: 'true' # добавление в секцию [PARSER] информацию о timestamp
buffer_chunk_size: 400k # конфигурирование fluent-bit, секция [INPUT]
buffer_max_size: 6MB # конфигурирование fluent-bit, секция [INPUT]
mem_buf_limit: 6MB # конфигурирование fluent-bit, секция [INPUT]
vault:
kv: DEV/A/DEV/FSSM/KV # путь к секретам vault во внешнем хранилище
host_vault: secman.solution # host сервера vault
ip_host: '*.*.*.*' # IP-адрес сервера vault
port: 8443 # порт сервера vault
resolution: DNS # resolution в рамках «kind: ServiceEntry» для адреса vault
perms_secret_0400: 'false' # добавление в рамках каждого объекта поставляемого в рамках Vault perms равному 0400 (256)
pre_populate_only: "true" # режим мутации контейнера vault, в рамках IGEG (true - без мутации, false - с мутацией контейнера)
pki_engine:
enabled: 'false' # флаг, указывающий на использование PKI engine в рамках хранения сертификатов (общий, при указании 'false' все сертификаты будут использоваться из KV version 1)
ingress: # группа сертификатов использующиеся для входящего трафика
federation: # группа параметров для сертификата по интеграции приложений FSSM
pki_enabled: 'false' # локальный флаг использования PKI engine
pki_path: PKI/issue/pki # частичный пусть к PKI engine путь формируется по структуре ({{ .Values.vault.secmanNamespace }}/{{ .Values.vault.pki_engine.ingress.federation.pki_path }}), также необходимо указывать метод запроса, например «issue» и наименование роли в рамках которой будет реализован сертификат
common_name: federation.host # параметр в рамках указывающий «common_name» выпускаемого сертификата
data: # группа параметров для возможности изменения параметров по корневому сертификату
ca:
name: ca_chain # имя корневого сертификата в рамках PKI engine, пример реализации по умолчанию «{{ .Data.ca_chain }}»
range: 'false' # флаг использования «range» для реализации цепочки сертификатов ({{ range $k, $v := .Data.ca_chain }} {{- $v }} {{- end -}})
bootstrap: # группа параметров для сертификата приложений FSSM (при использовании режима bootstrap и реализация отдельных сертификатов для этого)
pki_enabled: 'false'
pki_path: PKI/issue/pki
common_name: bootstrap.host
data:
ca:
name: ca_chain
range: 'false'
webhook: # группа параметров для сертификата по webhook взаимодействию (при использовании сертификатов из vault, также при выпуске такого рода сертификата необходимо убедиться, что caBundle секция, в рамках webhook configuration доверяют друг другу)
pki_enabled: 'false'
pki_path: PKI/issue/pki
common_name: webhook.host # при выпуске сертификата необходимо придерживаться логике формирования «common_name» - $имя сервиса.$имя проекта.svc
egress: # группа сертификатов использующиеся для исходящего трафика
federation: # группа параметров для сертификата по интеграции приложений FSSM
pki_enabled: 'false'
pki_path: PKI/issue/pki
common_name: federation.host
data:
ca:
name: ca_chain
range: 'false'
bootstrap: # группа параметров для сертификата приложений FSSM (при использовании режима bootstrap и реализация отдельных сертификатов для этого)
pki_enabled: 'false'
pki_path: PKI/issue/pki
common_name: bootstrap.host
data:
ca:
name: ca_chain
range: 'false'
kafka: # группа параметров для сертификата по интеграции с Kafka (при использовании агента сбора логов)
pki_enabled: 'false'
pki_path: PKI/issue/pki
common_name: kafka.host
data:
ca:
name: ca_chain
range: 'false'
postgres: # группа параметров для сертификата по интеграции с Postgres (при использовании Postgres для синхронизации федераций)
pki_enabled: 'false'
pki_path: PKI/issue/pki
common_name: postgres.host
data:
ca:
name: ca_chain
range: 'false'
resources:
limits:
cpu: 500m # ресурсы limits/cpu приложения vault
memory: 128Mi # ресурсы limits/memory приложения vault
requests:
cpu: 250m # ресурсы requests/cpu приложения vault
memory: 64Mi # ресурсы requests/memory приложения vault
secmanNamespace: DEV # namespace vault во внешнем хранилище
secmanRole: role-ga-secman-fssm # роль vault во внешнем хранилище с доступом на чтение секретов
add_secret_webhook: 'false' # флаг добавления сертификата на admission webhook запрос в vault
add_label_secret_webhook: '' # идентификатор кластера для использования одного хранилища ключей, при подключении к нему нескольких федераций с разных кластеров. ВНИМАНИЕ! Наименование секрета будет изменено на "webhook<значение этого параметра>"
auth_path_enabled: 'false' # флаг использования аннотации «vault.hashicorp.com/auth-path» в рамках доступа к хранилищу vault
auth_path: synapse/path # значение аннотации «vault.hashicorp.com/auth-path» в рамках доступа к хранилищу vault
kafkaPort: 9093 # внешний порт брокера
kafka_add_external_port_vs: 'true' # флаг конкретизации внешнего порта в конфигурации «kind: VirtualService»
kafka_se_install: 'true' # флаг публикации конфигурации «kind: ServiceEntry» на каждый брокер
kafka_resolution: DNS # значение resolution конфигурации «kind: ServiceEntry» на каждый брокер
kafka: # list брокеров, заполняются в зависимости от количества брокеров
- host: broker1.ru # хост брокера №1
name: brk1 # краткое наименование брокера №1
ip: '*.*.*.*' # ip брокера №1
egressPort: 19021 # любой свободный и уникальный порт для брокера №1
- host: broker2.ru # хост брокера №2
name: brk2 # краткое наименование брокера №2
ip: '*.*.*.*' # ip брокера №2
egressPort: 19022 # любой свободный и уникальный порт для брокера №2
ott:
serviceHosts: host1.ru:8080 # адреса серверов ОТТ (параметр configMap OTT - OTT_SERVICE_HOSTS, более подробно описано в документации компонента ОТТ)
readinessProbe: # readinessProbe параметры ОТТ приложения
failureThreshold: 30
initialDelaySeconds: 1
periodSeconds: 2
successThreshold: 1
timeoutSeconds: 1
ottHTTPport: 8080 # порт (параметр configMap OTT - OTT_HTTP_PORT, более подробно описано в документации компонента ОТТ)
ott_client_mmt_action_attrid: ott_action # параметр configMap OTT - OTT_CLIENT_MMT_ACTION_ATTRID, более подробно описано в документации компонента ОТТ
ott_client_mmt_resource_attrid: ott_resources # параметр configMap OTT - OTT_CLIENT_MMT_RESOURCE_ATTRID, более подробно описано в документации компонента ОТТ
ott_application_attribute_id: ott_application # параметр configMap OTT - OTT_APPLICATION_ATTRIBUTE_ID, более подробно описано в документации компонента ОТТ
ott_service_url: https://stub-host:stub-port # параметр configMap OTT - OTT_SERVICE_URL, более подробно описано в документации компонента ОТТ
resources:
limits:
cpu: 300m # ресурсы limits/cpu приложения OTT
ephemeral_storage: 500Mi # ресурсы limits/ephemeral_storage приложения OTT
memory: 500Mi # ресурсы limits/memory приложения OTT
requests:
cpu: 300m # ресурсы requests/cpu приложения OTT
ephemeral_storage: 500Mi # ресурсы requests/ephemeral_storage приложения OTT
memory: 500Mi # ресурсы requests/memory приложения OTT
ingress:
replicas: 1 # количество реплик IGEG (igressgateway)
# ingw_service_name: # наименование сервиса ingressgateway для организации webhook взаимодействия с webhook server (по умолчанию ingressgateway-${имя проекта FSSM})
readinessProbe: # readinessProbe параметры IGEG (igressgateway)
failureThreshold: 30
initialDelaySeconds: 1
periodSeconds: 2
successThreshold: 1
timeoutSeconds: 1
resources:
limits:
cpu: 300m # ресурсы limits/cpu приложения IGEG (igressgateway)
ephemeral_storage: 500Mi # ресурсы limits/ephemeral_storage приложения IGEG (igressgateway)
memory: 500Mi # ресурсы limits/memory приложения IGEG (igressgateway)
requests:
cpu: 300m # ресурсы requests/cpu приложения IGEG (igressgateway)
ephemeral_storage: 500Mi # ресурсы requests/ephemeral_storage приложения IGEG (igressgateway)
memory: 500Mi # ресурсы requests/memory приложения IGEG (igressgateway)
egress:
replicas: 1 # количество реплик IGEG (egressgateway)
readinessProbe: # readinessProbe параметры (egressgateway)
failureThreshold: 30
initialDelaySeconds: 1
periodSeconds: 2
successThreshold: 1
timeoutSeconds: 1
resources:
limits:
cpu: 300m # ресурсы limits/cpu приложения IGEG (egressgateway)
ephemeral_storage: 500Mi # ресурсы limits/ephemeral_storage приложения IGEG (egressgateway)
memory: 500Mi # ресурсы limits/memory приложения IGEG (egressgateway)
requests:
cpu: 300m # ресурсы requests/cpu приложения IGEG (egressgateway)
ephemeral_storage: 500Mi # ресурсы requests/ephemeral_storage приложения IGEG (egressgateway)
memory: 500Mi # ресурсы requests/memory приложения IGEG (egressgateway)
tracing: # настройка передачи трейсов приложения IGEG
custom_tags: '' # обогащение заголовками
zipkin: # адрес сервиса для сбора трейсов
svc: synapse-tracer-svc # имя сервиса для сбора трейсов (в рамках кластера)
port: 8788 # порт сервиса для сбора трейсов (в рамках кластера)
sampling: 100 # процент передаваемых трейсов (0-100)
maxPathTagLength: 256 # ограничение в рамках размера трейса
tlsSettings: # настройки TLS при передаче трейсов
caCertificates: "/var/run/secrets/istio/root-cert.pem"
mode: SIMPLE
Изменения стендозависимых параметров в рамках релиза 5.2.1#
Чарт fssm-discovery.
Удаление параметра:
discovery_sync_kubeapi: 5000 # время синхронизации сведений из postgreSQL в etcd кластера
# указанный параметр задается посредством параметризации секции sync.syncKubeAPIPeriod
Исключены параметры, при установке работы с KubeAPI по хранению сведений о федеративных сервисах (database.secret.username и database.secret.password они используются только при работе с PSQL хранилищем).
Настройка интеграции#
OTT#
Рекомендовано использовать ОТТ в рамках граничных прокси, как установить и настроить указанный компонент, можно ознакомиться в документации компонента «Platform V One-Time-Token». В случае ошибки установки OTT, компонент FSSM будет неработоспособен.
Для корректной и безопасной установки ОТТ к компоненту IGEG необходимо ознакомиться с документацией компонента IGEG, раздел «Авторизация».
Для успешного функционирования ОТТ необходимо реализовать конфигурацию «kind: EnvoyFilter», которая переводит все входящие и исходящие запросы из namespace, через ОТТ.
Конфигурация для egressgateway:
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: sbt-authorization
spec:
configPatches:
- applyTo: HTTP_FILTER
match:
context: GATEWAY
listener:
filterChain:
filter:
name: envoy.http_connection_manager
portNumber: 6443
patch:
operation: INSERT_BEFORE
value:
config:
authorize_only_request: false # Флаг того, что авторизуются как HTTP Request, так и HTTP Response
failure_mode_allow: false # Запрещает трафик при недоступности сервера авторизации
grpc_service:
google_grpc:
stat_prefix: sbt_authz
target_uri: 'unix:/mnt/ott-uds-socket/ott.socket'
timeout: 10s
sidecar_role: EGRESS
name: envoy.sbt_authz
workloadSelector:
labels:
app: ${EGRESS_SELECTOR}
Конфигурация для ingressgateway:
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: sbt-authorization-ingress
spec:
configPatches:
- applyTo: HTTP_FILTER
match:
context: GATEWAY
listener:
filterChain:
filter:
name: envoy.http_connection_manager
portNumber: 5443
patch:
operation: INSERT_BEFORE
value:
config:
authorize_only_request: false # Флаг того, что авторизуются как HTTP Request, так и HTTP Response
failure_mode_allow: false # Запрещает трафик при недоступности сервера авторизации
grpc_service:
google_grpc:
stat_prefix: sbt_authz
target_uri: 'unix:/mnt/ott-uds-socket/ott.socket'
timeout: 10s
sidecar_role: INGRESS
name: envoy.sbt_authz
workloadSelector:
labels:
app: ${INGRESS_SELECTOR}
Аутентификация происходит с использованием ACL, необходимо реализовать доступ только к host компонента FederationDiscovery.
fluent-bit#
Рекомендуется реализовать контейнер «fluent-bit» в рамках Pod, где реализованы элементы компонента FSSM.
В рамках указанного взаимодействия настраивается передача лого в рамках используемой БД.
Пример настройки компонента «fluent-bit»
kind: ConfigMap
apiVersion: v1
metadata:
name: fluent-bit
data:
fluent-bit.conf: |-
[SERVICE]
Flush 1
Daemon Off
Log_Level Debug
Parsers_File /fluent-bit/etc/parsers.conf
[INPUT]
Name tail
Tag file.tail
Path /opt/synapse/logs/*.log
Parser custom
Buffer_Chunk_Size 400k
Buffer_Max_Size 6MB
Mem_Buf_Limit 6MB
[OUTPUT]
Name stdout
[OUTPUT]
Name kafka
Match file.tail
Brokers ${BROKERS}
Topics ${TOPIC}
parsers.conf: |-
[PARSER]
Name custom
Format json
Формат сообщения предоставлен в документе «Руководство по системному администрированию», раздел «Запись логов при добавлении служебных конфигураций» и «Запись логов при добавлении пользовательских конфигураций».
В рамках конфигурации «fluent-bit» также необходимо реализовать механизмы шифрования данных по «mTLS 1.2 и выше» на граничном прокси (egressgateway).
Для взаимной аутентификации и шифрования трафика должны использоваться сертификаты x509.
Также рекомендуем ознакомиться с реализацией сетевых взаимодействий, которые описаны в рамках документа «Руководство безопасности», раздел «Сетевая безопасность».
Подключение пользовательских проектов#
Для подключения пользовательских проектов к компоненту FSSM необходимо реализовать несколько действий:
Реализация метки (label) на пользовательском «Namespace», в рамках установленного параметра компонента FederationController (global.federation.label).
Реализация конфигурации «kind: RoleBinding» для предоставления прав компоненту FederationController реализовывать конфигурации в рамках федеративной маршрутизации.
Пример реализации «kind: RoleBinding»
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: synapse-rb-federation-controller
namespace: ${PROJECT_NAME}
subjects:
- kind: ServiceAccount
name: synapse-federation-controller
namespace: ${PROJECT_FEDERATION}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: synapse-federation-controller
Переменная «$PROJECT_NAME» заполняется в рамках используемого вами наименования namespace/project.
Переменная «$PROJECT_FEDERATION» зависит от «Namespace» где реализован компонент FSSM (по умолчанию наименование проекта «ci01994970-synapse-federation-system»).
Через CLI Kubectl
Шаг |
Действия |
Описание |
|---|---|---|
Реализация метки (label) в пользовательском «Namespace» |
В консоли выполнить команду: |
Переменная $USER_NAMESAPCE — это наименование пользовательского «Namespace». Переменная $FEDERATION_LABEL — это ранее реализованный параметр в компоненте FederationController «global.federation.label») |
Загрузить конфигурацию для предоставления прав («kind: RoleBinding») |
В консоли выполнить команду: |
Переменная $FILE_NAME в рамках реализованной вами конфигурации «kind: RoleBinding» |
Обновление#
Обновление компонента FSSM необходимо производить по стратегии Recreate. Для обновления компонента FSSM необходимо остановить работу приложений (FederationDiscovery, FederationController) и удалить конфигурации старой версии, после выполнить инсталляцию уже новой версии.
В случае использования режима с использованием СУБД, необходимо выполнить обновление версии базы данных согласно документации используемой СУБД, также «kind: CustomResourceDefinitions» которые передаются в рамках дистрибутива.
Рекомендуем организацию бэкапа базы данных при обновлении, в случае использования серверной части PostgreSQL.
При обновлении модуля необходимо выполнить порядок отключения старой версии компонентов:
FederationDiscovery — провести все необходимые шаги, описанные ниже, и подтвердить работоспособность компонента.
FederationController — провести все необходимые шаги, описанные ниже, и подтвердить работоспособность компонента.
Шаг |
Действия |
Описание |
|---|---|---|
Создать директорию для установки |
На компьютере, с которого будет производиться установка, создать папку, например «synapse-federation» |
– |
Разархивировать файлы |
Распаковать в созданную папку архив с конфигурационными артефактами компонента FSSM |
– |
Подключиться к проекту#
Через CLI Kubectl
Шаг |
Действия |
Описание |
|---|---|---|
Выполнить вход в Kubernetes |
Загрузите «kubeConfig» от вашего «ServiceAccount». Заведите переменную |
– |
Перейти в нужный «Namespace» |
Введите команду: |
– |
Остановить компонент#
Через CLI Kubectl
Шаг |
Действия |
Описание |
|---|---|---|
Остановка компонента |
В консоли выполнить команду |
– |
Удалить артефакты действующей версии#
Через CLI Kubectl
Шаг |
Действия |
Описание |
|---|---|---|
Сохранение Deployment |
В консоли выполнить команду: |
– |
Сохранение конфигурации |
В консоли выполнить команду: |
– |
Удаление Deployment |
В консоли выполнить команду: |
– |
Удаление конфигурации |
В консоли выполнить команду: |
При необходимости изменить конфигурацию |
Загрузить новую версию#
Через CLI Kubectl
Шаг |
Действия |
Описание |
|---|---|---|
Загрузка конфигурации |
В консоли выполнить команду: |
С новыми конфигурационными файлами |
Загрузка Deployment |
В консоли выполнить команду: |
С новой версией «kind: Deployment» |
Запустить новую версию компонента#
Через CLI Kubectl
Шаг |
Действия |
Описание |
|---|---|---|
Запустить новую версию компонента |
В консоли выполнить команду |
$N — необходимое количество «kind: Pod», рекомендованное значение — 2 |
Удаление#
Подключиться к проекту#
Через CLI Kubectl
Шаг |
Действия |
Описание |
|---|---|---|
Выполнить вход в Kubernetes |
Загрузите «kubeConfig» от вашего «ServiceAccount». Заведите переменную |
– |
Перейти в нужный «Namespace» |
Введите команду: |
– |
Остановить компонент#
Через CLI Kubectl
Шаг |
Действия |
Описание |
|---|---|---|
Остановка приложения |
В консоли выполните команду |
– |
Удалить артефакты действующей версии#
Через CLI Kubectl
Шаг |
Действия |
Описание |
|---|---|---|
Удалить Deployment |
В консоли выполнить команду: |
– |
Удалить конфигурации |
В консоли выполнить команду: |
– |
Удалить все зависимые ресурсы из раздела «3. Установить необходимый перечень ресурсов» |
В консоли выполнить команду: |
– |
Проверка работоспособности#
FederationDiscovery#
Через CLI Kubectl
Проверка |
Действия |
Результат |
Описание |
|---|---|---|---|
Проверка работоспособности |
В консоли выполнить команду: |
Команда должна вывести строку «ok» Завершите forward(s) портов нажатием Ctrl+C |
$NUMBER_PORT — номер порта указанный в параметре server/port |
Также проверить отсутствие ошибок в рамках логов приложения.
FederationController#
Через CLI Kubectl
Проверка |
Действия |
Результат |
Описание |
|---|---|---|---|
Проверка работоспособности |
В консоли выполнить команду: |
Команда должна вывести строку «HTTP 1.1 200» |
$NUMBER_PORT — номер порта указанный в параметре server/port |
Также проверить отсутствие ошибок в рамках логов приложения.
Интеграционные взаимодействия#
При реализации архитектуры с ОТТ, LOGA и SecMan (Hashicorp Vault), просьба ознакомиться с методами проверки работоспособности в документации указанных компонентов.
Откат#
В случае использования режима с использованием СУБД необходимо выполнить откат установки базы данных согласно документации используемой СУБД.
Рекомендуем организацию бэкапа базы данных при откате в случае использования серверной части PostgreSQL.
Поддерживается откат версии компонента без потери данных до версии FSSM 3.11. Если откат производится на более позднюю версию, необходимо удалить все данные в рамках таблиц и запустить приложения.
Остановить компонент#
Через CLI Kubectl
Шаг |
Действия |
Описание |
|---|---|---|
Остановка приложения |
В консоли выполнить команду |
– |
Удалить артефакты действующей версии#
Через CLI Kubectl
Шаг |
Действия |
Описание |
|---|---|---|
Сохранение Deployment |
В консоли выполнить команду: |
– |
Сохранение конфигурации |
В консоли выполнить команду: |
– |
Удаление Deployment |
В консоли выполнить команду: |
– |
Удаление конфигурации |
В консоли выполнить команду: |
При необходимости изменить конфигурацию |
Загрузить сохраненные артефакты#
Через CLI Kubectl
Шаг |
Действия |
Описание |
|---|---|---|
Загрузить конфигурации в рамках компонента |
В консоли выполнить команду: |
Переменная $FILE_NAME в рамках добавления необходимых конфигураций компонента («kind: Deployment»/«kind: ConfigMap») |
Запустить восстановленную версию компонента#
Через CLI Kubectl
Шаг |
Действия |
Описание |
|---|---|---|
Запустить восстановленную версию компонента |
В консоли выполнить команду |
$N — необходимое количество «kind: Pod», рекомендованное значение 2 |
Часто встречающиеся проблемы и пути их устранения#
Проблема |
Причина |
Решение |
|---|---|---|
Ошибка при подключении к проекту |
Пользователю не предоставлен доступ в проект. |
Запросить доступ к проекту у администратора кластера |
Ошибка при загрузке артефактов |
У пользователя, под которым производится загрузка отсутствуют необходимые права |
Запросить доступ к проекту у администратора кластера |
Ошибка при Pull docker-образа из репозитория |
Отсутствуют права на Pull образа из репозитория. |
Запросить права у администратора registry. |
Ошибка при запросе на федеративный FQDN |
Не реализованы необходимые параметры при установке Istio/POLM («ISTIO_META_DNS_CAPTURE: true» и «ISTIO_META_DNS_AUTO_ALLOCATE: „true“»), либо используется версии с Istio версии «1.12» |
Реализовать версию Istio выше «1.12+» (в указанной версии есть ограничение в рамках использования доменов, которые заканчиваются на «.local»), либо указать при установке FederationController указать другой федеративный домен, устанавливается в «kind: ConfigMap» с именем «federation-controller-params», параметр «global.federation.domain» (пример — «clusterset.global»). Установить рекомендуемые параметры при установке Istio/POLM («ISTIO_META_DNS_CAPTURE: true» и «ISTIO_META_DNS_AUTO_ALLOCATE: „true“») |
Чек-лист валидации установки#
Проверка |
Действия |
Результат |
|---|---|---|
Все артефакты загружены в проект |
По списку артефактов найти их в «namespace Kubernetes» |
– |
Все поды шлюза запущены |
Найти Deployment, перейти на вкладку «Pods», проверить, что статус всех подов — Running |
– |
Отсутствие ошибок в логах контейнеров |
Для каждого Pod проверить на вкладке логов, что в логе контейнеров Pod отсутствуют ошибки |
– |
Успешная обработка пользовательских конфигураций у подключенного проекта в рамках федерации |
Реализовать пользовательские конфигурации «kind: ServiceExport»/«kind: ServiceImport»/«kind: ServiceTrafficPolicy» |
Конфигурации успешно применились, реализованы конфигурации в рамках маршрутизации по федеративному FQDN |
Убедиться, что все сертификаты загружены и компонент работает корректно |
Проверить функциональность компонента |
Компонент работает корректно |
Убедиться, что в случае использования OTT, компонент настроен корректно, при некоректной установке OTT компонент FSSM неработоспособен |
Проверить работоспособность OTT |
Компонент работает корректно |
Убедиться, что в случае использования Hashicorp Vault, компонент настроен корректно, при некоректной установке Hashicorp Vault компонент KBLT неработоспособен |
Проверить работоспособность Hashicorp Vault |
Компонент работает корректно |
Убедиться, что в случае использования LOGA, компонент настроен корректно (убедиться, что логи успешно сохраняются в хранилище) |
Проверить работоспособность LOGA |
Компонент работает корректно |
Убедиться, что в случае использования Prometheus, компонент настроен корректно (убедиться, что метрики успешно собираются в хранилище) |
Проверить работоспособность Prometheus |
Компонент работает корректно |