Руководство по установке#
В руководстве приведены инструкции по установке компонента 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: Gateway» / «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 |
Рекомендовано. Правообладателем АО «СберТех» также рекомендована ОС – Platform V SberLinux OS Core, см. раздел «Платформенные зависимости» |
ОС контейнеров для запуска модулей компонента |
Средство контейнеризации |
Да |
Docker CE |
19.03.14 |
Рекомендовано |
Инструмент для автоматизации работы с контейнерами |
Среда контейнеризации |
Да |
Kubernetes |
1.19 и выше |
Рекомендовано. Правообладателем АО «СберТех» также рекомендована среда контейнеризации – Platform V DropApp, см. раздел «Платформенные зависимости» |
Платформа контейнеризации для запуска компонентов сервиса |
Java-машина |
Да |
OpenJDK |
17 |
Рекомендовано |
Окружение для работы модулей компонента (в рамках базового образа необходимо использовать openjdk 17) |
Репозиторий (хранилище дистрибутива/исходного кода) |
Да |
Nexus-public |
3.42.0 |
Рекомендовано |
|
Сервис централизованного хранения репозиториев исходного код |
Да |
GitLab CE |
15.7 и выше |
Рекомендовано |
|
Операционная система |
Нет |
Red Hat Enterprise Linux |
8 |
Опционально |
|
Java-машина |
Нет |
openjdk-17.0.8 |
1.0-8 |
Опционально |
Окружение для работы модулей компонента (в рамках базового образа необходимо использовать openjdk 17) |
Репозиторий (хранилище дистрибутива/исходного кода) |
Нет |
Nexus Repository Manager PRO Nexus Repository Manager OSS |
3.43.0 |
Опционально |
|
Сервис централизованного хранения репозиториев исходного код |
Нет |
Bitbucket |
7.6.7 |
Опционально |
|
Иное |
Нет |
Istio |
1.6 и выше |
Опционально |
|
Среда контейнеризации |
Нет |
Red Hat OpenShift |
4.6 и выше |
Опционально |
|
Иное |
Нет |
Helm |
3.8 и выше |
Опционально |
|
Иное |
Нет |
Prometheus |
2.37 и выше |
Опционально |
|
Иное |
Нет |
Grafana |
9.0 и выше |
Опционально |
|
Иное |
Нет |
Hashicorp Vault |
1.10.0 и выше |
Опционально |
Внешнее хранилище сертификатов и другой «чувствительной» информации |
Иное |
Нет |
kubectl CLI |
1.20.5 и выше |
Опционально |
Интерфейс командной строки для взаимодействия с кластером |
Примечание:
*
Да — категория ПО обязательна для функционирования сервиса (это означает, что сервис не может выполнять свои основные функции без установки данной категории ПО).
Нет — категория ПО необязательна для функционирования сервиса (это означает, что сервис может выполнять свои основные функции без установки данной категории ПО).
**
Рекомендовано — рекомендованный правообладателем АО «СберТех» продукт.
Опционально — альтернативный по отношению к рекомендованному правообладателем АО «СберТех» продукт.
Платформенные зависимости#
Для настройки, контроля и функционирования компонента реализована интеграция с программными продуктами, правообладателем которых является АО «СберТех»:
Наименование продукта |
Код |
Версия продукта |
Код и наименование компонента |
Обязательность установки (да/нет) |
Описание |
Аналог других производителей |
|---|---|---|---|---|---|---|
Platform V Synapse Service Mesh |
SSM |
4.1 |
POLM Управление политиками |
Нет |
Панель управления с открытым исходным кодом, служащая для взаимодействия, мониторинга и обеспечения безопасности контейнеров в среде контейнеризации Kubernetes |
Istio control plane 1.12 |
Platform V Synapse Service Mesh |
SSM |
4.1 |
IGEG Граничный прокси |
Нет |
Сервис для обеспечения управляемого вызова интеграционных сервисов прикладной части |
Istio proxy 1.12 |
Platform V Synapse Service Mesh |
SSM |
4.1 |
SVPX Сервисный прокси |
Нет |
||
Platform V Synapse Service Mesh |
SSM |
4.1 |
SMDL |
Нет |
||
Platform V Monitor |
OPM |
4.1 |
LOGA Журналирование |
Нет |
Сервис для хранения лог-файлов |
Любой сервис сбора записей о событиях, совместимый с fluent-bit, например: Elasticsearch, InfluxDB |
Platform V Backend |
#BD |
4.3 |
OTTS One-Time Password (OTP) / OTT |
Нет |
Сервис для аутентификации и авторизации межсервисных взаимодействий |
|
Platform V SberLinux OS Server |
SLO |
8.7 |
INST Операционная система |
Нет |
ОС контейнеров для запуска модулей компонента |
ОС Альт 8 СП |
Platform V DropApp |
K8S |
1.1 и выше |
K8SC K8S Core |
Нет |
Дистрибутив Kubernetes со встроенными механизмами мультитенантности и бессерверным исполнением |
Kubernetes, Red Hat OpenShift Container Platform |
Компонент POLM сконфигурирован со следующими параметрами:
...
defaultConfig:
proxyMetadata:
ISTIO_META_DNS_CAPTURE: 'true'
ISTIO_META_DNS_AUTO_ALLOCATE: 'true'
...
Примечание:
***
Да — компонент или продукт необходим для функционирования сервиса (это означает, что сервис не может выполнять свои основные функции без установки данного компонента).
Нет — необязательный для функционирования сервиса компонент или продукт (это означает, что сервис может выполнять свои основные функции без установки данного компонента).
**** Рекомендуется установка программного продукта, правообладателем которого является АО «СберТех», при этом не исключена возможность (допускается правообладателем) использования аналога других производителей. Аналоги, в отношении которых продукт успешно прошел испытания и подтвердил свою работоспособность, указаны в разделе «Системное программное обеспечение».
Аппаратные требования#
Для установки компонента требуется следующая конфигурация аппаратного обеспечения:
Контейнер |
CPU Request |
Memory Request |
CPU Limit |
Memory Limit |
|---|---|---|---|---|
Приложение FederationDiscovery |
600 |
1000 |
1000 |
2000 |
Приложение FederationController |
600 |
1000 |
1000 |
2000 |
Состав дистрибутива#
В рамках компонента FSSM предоставляется 2 архива:
fssm-bin
Элемент дистрибутива |
Описание |
|---|---|
./package/bh/discovery |
Operator по работе с служебными конфигурациями |
./package/bh/controller |
Operator по работе с пользовательскими конфигурациями |
fssm-cfg
Элемент дистрибутива |
Описание |
|---|---|
./package/conf/k8s/base/helm/* |
Базовые конфигурации по установке компонента FSSM |
fssm-dbinit
Элемент дистрибутива |
Описание |
|---|---|
./package/conf/scripts/* |
Скрипт запуска liquibase по организации БД Pangolin |
./package/db/* |
Архив с liquibase скриптами по организации БД Pangolin |
Подготовка окружения#
Перед началом установки компонентов необходимо выбрать архитектуру взаимодействия компонента FSSM.

Схема. Рекомендованная архитектура взаимодействия с 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?\$registry\s?(\}){1,2})(\{\{|\$\{)\s?\$registry_path\s?(\}){1,2}{}/{}@sha256:(?<hash>\w+)" # регулярное выражение для поиска в конфигурациях развертывания места с указанием image компонента
}
]
},
{
"docker": [
{
"baseImageLink": "${базовый образ для сборки приложения}", # пример "*/openjdk-17"
"version": "${версия компонента FSSM_cotroller}",
"deploymentUnit": "fssm_controller" # идентификатор компонента FSSM discovery
}
],
"imageLinkMapping": [
{
"regex": "(?<=(\{\{|\$\{)\s?\$registry\s?(\}){1,2})(\{\{|\$\{)\s?\$registry_path\s?(\}){1,2}{}/{}@sha256:(?<hash>\w+)" # регулярное выражение для поиска в конфигурациях развертывания места с указанием image компонента
}
]
},
{
"artifactId": "fssm-cfg",
"imageLinkMapping": [
{
"regex": "\\{\\{ \\.Values\\.fluent\\.image \\}\\}",
"replace": "${ссылка на образ fluent-bit}" # необходимо указать полный путь к image компонента fluent-bit (версии 1.8.8 или 1.9 и выше)
},
{
"regex": "\\{\\{ \\.Values\\.igeg\\.imageose \\}\\}",
"replace": "${ссылка на образ IGEG 1.2.2}" # необходимо указать полный путь к image IGEG (1.2.2) который поддерживает работоспсобность с Istio версии 1.6.14
},
{
"regex": "\\{\\{ \\.Values\\.igeg\\.imagese \\}\\}",
"replace": "${ссылка на образ IGEG 1.20}" # необходимо указать полный путь к image IGEG (1.20) который поддерживает работоспсобность с Istio версии 1.20.*
},
{
"regex": "\\{\\{ \\.Values\\.ott\\.image \\}\\}",
"replace": "${ссылка на образ ОТТ}" # необходимо указать полный путь к image ОТТ (4.2.15)
},
{
"regex": "\\{\\{ \\.Values\\.igeg\\.imagese117 \\}\\}",
"replace": "${ссылка на образ IGEG 1.17}" # необходимо указать полный путь к image IGEG (1.17) который поддерживает работоспсобность с Istio версии 1.17.*
},
{
"regex": "\\{\\{ \\.Values\\.igeg\\.imagese119 \\}\\}",
"replace": "${ссылка на образ IGEG 1.19}" # необходимо указать полный путь к image IGEG (1.19) который поддерживает работоспсобность с Istio версии 1.19.*
}
]
}
],
"to": {
"ci": "90000017"
}
},
...
Запустить инструмент автоматической сборки продукта SSM, компонента SMDL, «ClientUnpacker» (более подробно о настройке и запуске можно ознакомиться в документации компонента «SMDL», «Руководство оператора»), результатом исполнения будет собранные артефакты для установки приложения (на email сотрудника кто запустил job придет таблица со ссылками на артефакты)
Провести проверку корректной подстановки образов по шаблону указанному в пункте 1 указанного алгоритма, в таблице, которая пришла после запуска job «ClientUnpacker», необходимо загрузить артефакты, которые относятся к компоненту FSSM (позиция «product FSSM_controller*» и «product FSSM_discovery*», ссылка на дистрибутив располагается в секции «distribUrl»)
### компонент FederationController
### путь к конфигурационному файлу «conf/k8s/base/helm/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
### путь к конфигурационному файлу «conf/k8s/base/helm/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
Указанное действие необходимо для успешной установки компонента (при ручной установке).
2. Подключиться к проекту#
Через CLI Kubectl
Шаг |
Действия |
Описание |
|---|---|---|
Выполнить вход в kubernetes |
Загрузить «kubeConfig» от вашего «ServiceAccount». Завести переменную |
– |
Перейти в нужный namespace |
Ввести команду: |
– |
3. Установить необходимый перечень ресурсов#
Перед началом установки нужно убедиться, что:
для учетной записи, с которой будет производиться установка модуля, реализованы права администратора кластера
реализованы образы приложения компонента FSSM (Docker)
В рамках предоставляемого дистрибутива реализованы все необходимые ресурсы для успешного функционирования компонента FSSM.
Ресурсы в рамках ролевой модели («kind: Role»/«kind: ClusterRole»/«kind: RoleBinding»/«kind: ClusterRoleBinding»)
Ресурсы в рамках используемых конфигураций («kind: CustomResourceDefinitions»)
Ресурс для реализации WebHook запроса в рамках мутирования пользовательских конфигураций («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) и «fssm-postgres-secret» с логинов и паролем для работы с БД (опционально при использовании PostgreSQL - database_secret.yaml) где указывается «username: » и «password: »
Настройка базы данных#
Ручная настройка базы данных#
Если в рамках установки выбран сервер PostgreSQL для организации синхронизации приложений FSSM, то необходимо подготовить все необходимые ресурсы
Подключитесь к используемой БД под учетной записью администратора.
Далее реализуйте все необходимые шаги по подготовке БД
Создаем отдельную БД для компонента FSSM
create database ${имя database}
Пример
create database fssm_dataset
Создаем технического пользователя под которым будет работать компонент FSSM
create user ${имя пользователя} with encrypted password ${пароль технического пользователя};
Пример
create user fssm_federation with encrypted password 'jjjsdgrrFFFF121fdagmm43444322rggg==';
Указанные параметры необходимо будет реализовать в секрете «fssm-postgres-secret»
Пример «fssm-postgres-secret» параметр «database_secret.yaml» (в рамках vault необходимо расположить данные в base64)
username: fssm_federation
password: jjjsdgrrFFFF121fdagmm43444322rggg==
ВАЖНО! Перед тем как идти дальше необходимо подключиться к созданной базе данных.
Пример подключения
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 - ./conf/k8s/base/helm/fssm_discovery/templates/crd.yaml).
Конфигурации в рамках webhook
mutating.yaml validation.yaml
Перед выполнением команды необходимо реализовать сертификат для взаимодействия.
Сертификат в дистрибутиве для реализации webhook не содержится и его необходимо выпустить самостоятельно. См. раздел «Управление ключами и сертификатами».
Команда:
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-$FEDERATION_NAMESPACE
Установка#
В случае использования режима с использованием СУБД, необходимо выполнить установку базы данных согласно документации используемой СУБД.
В случае реализации сбора метрик посредством Prometheus, необходимо ознакомиться с документом «Руководство по системному администрированию», раздел «События мониторинга».
Автоматическая установка сервиса#
Если выбран вариант автоматической установки, то необходимо предварительно реализовать ряд работ по настройке интеграционных взаимодействий 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) с alias «OTT_CLIENT_CERT_ALIAS: synapse-federation», про правила формирования необходимо уточнить в документации компонента ОТТ
tengri - необходимо реализовать сертификаты и ключ для успешного взаимодействия LOGA fluent-bit (tengri_ca.cer/tengri.pem/tengri.key), про правила формирования необходимо уточнить в документации компонента LOGA fluent-bit
fssm-postgres-secret - необходимо указать логин и пароль от пользователя для работы с БД PostgreSQL (в файле «database_secret.yaml» где 2 параметра «username: » и «password: »), опционально
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»
При автоматической установке сервиса, необходимо убедиться, что выполнены шаги раздела «1. Создать директорию установки» и «3. Установить необходимый перечень ресурсов».
Заполнить стендозависимые параметры для установки компонента FSSM, пример: FederationDiscovery
### Необходимо реализовать файл values.yaml
### Расположение файла в рамках git ветки job «SynapseInstaller» (более подробно о настройке и запуске можно ознакомиться в документации компонента «SMDL», «Руководство оператора»)
### Для компонента FSSM - synapse-config-dev-gen/${имя проекта для установки}/package/conf/k8s/base/helm/fssm/values.yaml
values.yaml
release_version: "1.6.0" # указать версию релиза
config_version: "1.6.0" # указать версию конфигурации
component_type: service
registryHost: sw.sbc.space # Docker registry где расположен образы FSSM
registry_path: /dev # Docker path где расположен образы FSSM
indexFederation: '' # уникальный идентификатор установки FSSM, указывается принеобходимости установить несколько федераций, важно учитывать измененение адреса (grpc-federation-discovery{{ .Values.indexFederation }}.{{ .Values.discoveryCluster }})
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)
kubeAPIResolution: DNS # resolution в рамках реализации конфигурации «kind: ServiceEntry» по host Kube API server
kubeEgressRouting: TLS # реализация конфигураций Istio (TLS перехват трафика в рамках tls, TCP перехват трафика по tcp)
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» проект контрольной панели
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' # использование адреса «grpc-federation-discovery{{ .Values.indexFederation }}.{{ .Values.cluster }}» для федеративной маршрутизации, при значении «false» будет создан дополнительный Ingresses/Route предназначенный для федеративного трафика «grpc-bootstrap-discovery{{ .Values.indexFederation }}.{{ .Values.cluster }}»
ott: 'true' # использование ОТТ при организации федеративного трафика для приложения FederationController
gateway: # опционально, при значении параметра «use_default_address: 'false'» необходимо будет реализовать сертификаты для федеративного адреса «grpc-bootstrap-discovery{{ .Values.indexFederation }}.{{ .Values.cluster }}» на 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'» необходимо будет реализовать сертификаты для федеративного адреса «grpc-bootstrap-discovery{{ .Values.indexFederation }}.{{ .Values.cluster }}» на 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: false # установка CRD (kind: CustomResourceDefinitions)
useCRDProxy: false # установка CRD (kind: CustomResourceDefinitions) посредством компонента CRDproxy (уникальное решение одного из клиента)
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: # добавление списка namesapce в федерацию
- 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
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:
imageose: # ссылка на образ приложения IGEG (1.2.2) который поддерживает работоспсобность с Istio версии 1.6.14 (указывается если не использовался job «ClientUnpacker», либо не производилась операция replace образа)
imagese: # ссылка на образ приложения IGEG (1.20) который поддерживает работоспсобность с Istio версии 1.20 (указывается если не использовался job «ClientUnpacker», либо не производилась операция replace образа)
imagese117: # ссылка на образ приложения IGEG (1.17) который поддерживает работоспсобность с Istio версии 1.17 (указывается если не использовался job «ClientUnpacker», либо не производилась операция replace образа)
imagese119: # ссылка на образ приложения IGEG (1.19) который поддерживает работоспсобность с Istio версии 1.19 (указывается если не использовался job «ClientUnpacker», либо не производилась операция replace образа)
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:
image: # ссылка на образ приложения fluent-bit (указывается если не использовался job «ClientUnpacker», либо не производилась операция replace образа)
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
pre_populate_only: "true" # режим мутации контейнера vault, в рамках IGEG (true - без мутации, 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:
image: # ссылка на образ приложения OTT (4.2.15) (указывается если не использовался job «ClientUnpacker», либо не производилась операция replace образа)
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
Запустить job, компонента SMDL, «SynapseInstaller» (более подробно о настройке и запуске можно ознакомиться в документации компонента «SMDL», «Руководство оператора»)
Ручная установка сервиса#
Перед началом установки убедитесь, что выполнена подготовка окружения.
Для ручной установки сервиса выполните следующие действия:
Реализовать хранилище секретов (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) с alias «OTT_CLIENT_CERT_ALIAS: synapse-federation», про правила формирования необходимо уточнить в документации компонента ОТТ
tengri - необходимо реализовать сертификаты и ключ для успешного взаимодействия LOGA fluent-bit (tengri_ca.cer/tengri.pem/tengri.key), про правила формирования необходимо уточнить в документации компонента LOGA fluent-bit
fssm-postgres-secret - необходимо указать логин и пароль от пользователя для работы с БД PostgreSQL (в файле «database_secret.yaml» где 2 параметра «username: » и «password: »), опционально
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»
Убедиться что в рамках персонального компьютера установлен Helm версии не ниже 3.0
Загрузить артефакт компонента FSSM с конфигурациями для установки (fssm-cfg-*) в рамках дистрибутива SSM
При необходимости провести корректировку конфигураций располагаемых в каталоге «./conf/k8s/base/helm/fssm-discovery/templates/*» (например провести подстановку image приложений FederationDiscovery и FederationController)
Перейти в рамках терминала в каталог «./conf/k8s/base/helm/»
Провести авторизацию через терминал в кластер, где планируется установка компонента FSSM (пример для Openshift «oc login --token=$ТОКЕН --server=$АДРЕС_КЛАСТЕРА»)
Пройти в namespace, где планируется установка компонента FSSM (пример для Openshift «oc project synapse-federation»)
Провести заполнение файла «./conf/k8s/base/helm/fssm-discovery/values.yaml» (описание параметров указана в указанном документе, раздел «Автоматическая установка сервиса»)
Провести установку компонента FSSM - «helm install fssm fssm-discovery --values operator/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 — диапазон, в рамках которого при неактивности «лидера» Pods будет выбран другой «лидер»
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».
Настройка интеграции#
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
В рамках указанного взаимодействия настраивается передача лого в рамках используемой БД.
Пример настройки компонента 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» которые передаются в рамках дистрибутива.
При обновлении модуля необходимо выполнить порядок отключения старой версии компонентов:
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), просьба ознакомиться с методами проверки работоспособности в документации указанных компонентов.
Откат#
В случае использования режима с использованием СУБД, необходимо выполнить откат установки базы данных согласно документации используемой СУБД.
Остановить компонент#
Через 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» |
– |
Все Pods шлюза запущены |
Найти Deployment, перейти на вкладку Pods, проверить, что статус всех Pods — Running |
– |
Отсутствие ошибок в логах контейнеров |
Для каждого Pod проверить на вкладке Logs, что в логе контейнеров Pod отсутствуют ошибки |
– |
Успешная обработка пользовательских конфигураций у подключенного проекта в рамках федерации |
Реализовать пользовательские конфигурации «kind: ServiceExport»/«kind: ServiceImport»/«kind: ServiceTrafficPolicy» |
Конфигурации успешно применились, реализованы конфигурации в рамках маршрутизации по федеративному FQDN |
Убедиться что все сертификаты загружены и компонент работает корректно |
Проверить функционал компонента |
Компонент работает корректно |
Убедиться что в случае использования OTT, компонент настроен корректно, при некоректной установке OTT компонент FSSM неработоспособен |
Проверить работоспособность OTT |
Компонент работает корректно |
Убедиться что в случае использования Hashicorp Vault, компонент настроен корректно, при некоректной установке Hashicorp Vault компонент KBLT неработоспособен |
Проверить работоспособность Hashicorp Vault |
Компонент работает корректно |
Убедиться что в случае использования LOGA, компонент настроен корректно (убедиться, что логи успешно сохраняются в хранилище) |
Проверить работоспособность LOGA |
Компонент работает корректно |
Убедиться что в случае использования Prometheus, компонент настроен корректно (убедиться, что метрики успешно собираются в хранилище) |
Проверить работоспособность Prometheus |
Компонент работает корректно |