Руководство по установке#

В руководстве приведены инструкции по установке компонента 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»

Используются для взаимодействия с компонентом «Kube API Server» по актуализации состава федерации (зарегистрированные компоненты federationController, федеративные сервисы, правила маршрутизации и т.п.)

Пользовательские конфигурации

Конфигурации (CRD), которые реализуются в «Namespace» командами в формате «.yaml» (Подробное описание приведено в документации «Руководство прикладного разработчика»).

Предоставляют возможность командам реализовывать следующие функции:

ServiceExport — регистрация сервиса поставщика в федерацию (в нескольких кластерах).
ServiceImport — производить автоматизированную интеграцию с сервисами, которые зарегистрированы в федерации.
ServiceTrafficPolicy — применять правила маршрутизации между зарегистрированными экземплярами сервиса поставщика

Контрольная панель

Проект, в котором запущены управляющие приложения Synapse Service Mesh (компонент POLM)

FQDN федерации

Виртуальный адрес сервиса поставщика (FQDN), обеспечивает гарантированную адресацию сервиса в рамках федерации; при этом от сервиса поставщика требуется предварительная обязательная регистрация посредством пользовательской конфигурации «kind: ServiceExport», а также реализованную пользовательскую конфигурацию «kind: ServiceImport» сервисом потребителем

Правила формирования FQDN федерации — по наименованию пользовательской конфигурации «kind: ServiceImport» («metadata: name: ») формируется виртуальное наименование сервиса поставщика, например, «metadata: name: provider-service», к которому применяется федеративный домен «clusterset.local» (может быть изменен, при условии конфликта доменов)

Для использования FQDN федерации достаточно заменить baseURL на стороне сервиса потребителя на федеративный

Пример вызова метода API: provider-service.clusterset.local/register/inn

Сервисный прокси / 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»

Системные требования#

Для установки требуется соблюдение следующих условий:

  1. Развернут и настроен кластер «Kubernetes» версии 1.19 или выше (либо «RedHat Openshift» версии 4.2 и выше) в соответствии с требованиями, предъявляемыми к Платформе

  2. В кластере создан проект («Namespace»), в котором установлена контрольная панель (POLM)

  3. В проекте создана учетная запись с правами на загрузку артефактов

  4. В проекте имеются свободные ресурсы по «limits» и «requests» не менее, чем зарезервировано в конфигурационных артефактах

  5. В проект добавлен секрет для загрузки Docker-образов из целевого Docker-репозитория

  6. В кластере реализован компонент fluent-bit для передачи логов

  7. Подключен и настроен компонент SMDL

  8. В кластере реализован компонент SecMan (система управления секретами, либо Hashicorp Vault)

  9. При использовании PostgreSQL, сервер должен быть установлен

  10. В кластере создан проект («Namespace»), где будет реализован программный компонент Federation Mesh (код FSSM) из состава программного продукта Platform V Synapse Service Mesh (код SSM), также необходимо будет подключить указанный проект к контрольной панели (SSM)

  11. В рамках реализованного проекта созданы необходимые роли («kind:Role»/«kind: ClusterRole») и привязки к ролям («kind: RoleBinding»/«kind: ClusterRoleBinding») в рамках ролевой модели компонента FSSM

  12. В рамках реализованного проекта создан «label» (используемый для работы компонента FederationController)

  13. В рамках кластера реализована конфигурация «kind: MutatingWebhookConfiguration»

  14. В рамках кластера реализованы необходимые ресурсы «kind: CustomResourceDefinitions»

  15. Для установки через консоль на рабочем месте должен быть установлен клиент 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.

Screenshot

Схема. Рекомендованная архитектура взаимодействия с PostgreSQL

Screenshot

Схема. Рекомендованная архитектура взаимодействия без PostgreSQL

Более подробно можете ознакомиться в разделе «Концептуальная модель предметной области».Более подробно можете ознакомиться в разделе «Концептуальная модель предметной области».

1. Создать директорию установки#

  • FederationDiscovery

Пререквизиты:

  • Базовый образ для сборки docker image загружен в docker registry

Для сборки образа необходимо использовать инструмент автоматической сборки образа, компонента SMDL, «ClientUnpacker» (более подробно о настройке и запуске можно ознакомиться в документации компонента «SMDL», «Руководство оператора»), результатом исполнения будет собранный образ приложений:

  1. Перед запуском 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"
          }
        },
...
  1. Запустить инструмент автоматической сборки продукта SSM, компонента SMDL, «ClientUnpacker» (более подробно о настройке и запуске можно ознакомиться в документации компонента «SMDL», «Руководство оператора»), результатом исполнения будет собранные артефакты для установки приложения (на email сотрудника кто запустил job придет таблица со ссылками на артефакты)

  2. Провести проверку корректной подстановки образов по шаблону указанному в пункте 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». Завести переменную KUBECONFIG=~/.kube/config, в которой располагается выгруженная конфигурация

Перейти в нужный namespace

Ввести команду:
kubectl config set-context --current --namespace=<имя вашего проекта>

3. Установить необходимый перечень ресурсов#

Перед началом установки нужно убедиться, что:

  • для учетной записи, с которой будет производиться установка модуля, реализованы права администратора кластера

  • реализованы образы приложения компонента FSSM (Docker)

В рамках предоставляемого дистрибутива реализованы все необходимые ресурсы для успешного функционирования компонента FSSM.

  1. Ресурсы в рамках ролевой модели («kind: Role»/«kind: ClusterRole»/«kind: RoleBinding»/«kind: ClusterRoleBinding»)

  2. Ресурсы в рамках используемых конфигураций («kind: CustomResourceDefinitions»)

  3. Ресурс для реализации WebHook запроса в рамках мутирования пользовательских конфигураций («kind: MutatingWebhookConfiguration»)

  4. Реализован перечень секретов (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, то необходимо подготовить все необходимые ресурсы

Подключитесь к используемой БД под учетной записью администратора.

Далее реализуйте все необходимые шаги по подготовке БД

  1. Создаем отдельную БД для компонента FSSM

create database ${имя database}

Пример

create database fssm_dataset
  1. Создаем технического пользователя под которым будет работать компонент 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
  1. Создаем выделенную схему

create schema ${имя схемы}

Пример

create schema fssm_federation;
  1. Предоставляем схему в рамках выделенной БД

grant connect on database ${имя database} to ${имя пользователя};

Пример

grant connect on database fssm_dataset to fssm_federation;
  1. Предоставляем доступ в рамках созданной схемы

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;
  1. Создаем табличное пространство

create tablespace fssm_ts_data owner fssm_federation location '${полный адрес на папку в рамках сервера PostgreSQL для храниня}';

Пример

create tablespace fssm_ts_data owner ${имя схемы} location '/pgdata/fssm_federation/fssm_ts_data';
  1. Создаем таблицы

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);
  1. Предоставляем права технической учетной записи на таблицы

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:

  1. Реализовать хранилище секретов (vault), где предварительно создать сертификаты и ключи (в рамках хранилища ключи и сертификаты должны быть в формате base64):

    1. federation-secret — необходимо реализовать приватный ключ, сертификат и цепочку сертификатов (cert.key/cert.crt/ca.crt)

    2. 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», про правила формирования необходимо уточнить в документации компонента ОТТ

    3. tengri - необходимо реализовать сертификаты и ключ для успешного взаимодействия LOGA fluent-bit (tengri_ca.cer/tengri.pem/tengri.key), про правила формирования необходимо уточнить в документации компонента LOGA fluent-bit

    4. fssm-postgres-secret - необходимо указать логин и пароль от пользователя для работы с БД PostgreSQL (в файле «database_secret.yaml» где 2 параметра «username: » и «password: »), опционально

    5. postgre-secret - необходимо реализовать сертификаты и ключ для успешного взаимодействия с БД PostgreSQL (post-ca.crt/post-crt.crt/post-key.key), опционально

    6. webhook - необходимо реализовать сертификат и ключ для успешного взаимодействия по admission request от Kube API server (tls.crt/tls.key), опционально

  2. Зарегистрировать компонент в рамках серверов ОТТ, с наименованием «OTT_MODULE_ID: synapse-federation»

При автоматической установке сервиса, необходимо убедиться, что выполнены шаги раздела «1. Создать директорию установки» и «3. Установить необходимый перечень ресурсов».

  1. Заполнить стендозависимые параметры для установки компонента 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
  1. Запустить job, компонента SMDL, «SynapseInstaller» (более подробно о настройке и запуске можно ознакомиться в документации компонента «SMDL», «Руководство оператора»)

Ручная установка сервиса#

Перед началом установки убедитесь, что выполнена подготовка окружения.

Для ручной установки сервиса выполните следующие действия:

  1. Реализовать хранилище секретов (vault), где предварительно создать сертификаты и ключи (в рамках хранилища ключи и сертификаты должны быть в формате base64):

    1. federation-secret — необходимо реализовать приватный ключ, сертификат и цепочку сертификатов (cert.key/cert.crt/ca.crt)

    2. 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», про правила формирования необходимо уточнить в документации компонента ОТТ

    3. tengri - необходимо реализовать сертификаты и ключ для успешного взаимодействия LOGA fluent-bit (tengri_ca.cer/tengri.pem/tengri.key), про правила формирования необходимо уточнить в документации компонента LOGA fluent-bit

    4. fssm-postgres-secret - необходимо указать логин и пароль от пользователя для работы с БД PostgreSQL (в файле «database_secret.yaml» где 2 параметра «username: » и «password: »), опционально

    5. postgre-secret - необходимо реализовать сертификаты и ключ для успешного взаимодействия с БД PostgreSQL (post-ca.crt/post-crt.crt/post-key.key), опционально

    6. webhook - необходимо реализовать сертификат и ключ для успешного взаимодействия по admission request от Kube API server (tls.crt/tls.key), опционально

  2. Зарегистрировать компонент в рамках серверов ОТТ, с наименованием «OTT_MODULE_ID: synapse-federation»

Убедиться что в рамках персонального компьютера установлен Helm версии не ниже 3.0

  1. Загрузить артефакт компонента FSSM с конфигурациями для установки (fssm-cfg-*) в рамках дистрибутива SSM

  2. При необходимости провести корректировку конфигураций располагаемых в каталоге «./conf/k8s/base/helm/fssm-discovery/templates/*» (например провести подстановку image приложений FederationDiscovery и FederationController)

  3. Перейти в рамках терминала в каталог «./conf/k8s/base/helm/»

  4. Провести авторизацию через терминал в кластер, где планируется установка компонента FSSM (пример для Openshift «oc login --token=$ТОКЕН --server=$АДРЕС_КЛАСТЕРА»)

  5. Пройти в namespace, где планируется установка компонента FSSM (пример для Openshift «oc project synapse-federation»)

  6. Провести заполнение файла «./conf/k8s/base/helm/fssm-discovery/values.yaml» (описание параметров указана в указанном документе, раздел «Автоматическая установка сервиса»)

  7. Провести установку компонента 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 (в рамках выбранной архитектуры взаимодействия):

  1. discovery.bootstrap.url — взаимодействие организовано посредством граничного прокси, в указанном параметре указать URL сервиса «пример: egressgateway-discovery.$PROJECT_NAME.svc.cluster.local»

  2. discovery.bootstrap.port — порт по которому будет проходить взаимодействие (если взаимодействие идет через граничный прокси, то необходимо указать «6443»)

  3. global.federation.domain — указание, какой будет использоваться домен в рамках построения федеративной маршрутизации (по умолчанию стоит «clusterset.local»)

  4. global.federation.label — метка (label) на пользовательском «Namespace», в рамках которого компонент FederationController будет обрабатывать пользовательские конфигурации

  5. global.controller.egress.tls.cipherSuitesArray — список групп шифров, которые будет использованы при внутреннем взаимодействии (в рамках namespace)

  6. global.controller.egress.tls.minVersion - минимальная версия TLS при внутреннем взаимодействии (в рамках namespace)

  7. global.controller.ingress.tls.cipherSuitesArray - список групп шифров который будет использован при внешнем взаимодействии (вне рамок namespace)

  8. global.controller.ingress.tls.minVersion — минимальная версия TLS при внешнем взаимодействии (вне рамок namespace)

  9. global.controller.leader-election.name — диапазон синхронизации компонента FederationController с FederationDiscovery

  10. global.controller.leader-election.lease-duration — диапазон, в рамках которого при неактивности «лидера» Pods будет выбран другой «лидер»

  11. global.controller.leader-election.namespace — имя «Namespace», в котором будет реализована конфигурация, хранящая в себе информацию по текущему «лидеру» Pod

  12. global.controller.egress.envoyFilter.workloadSelector.label.name - ключ по умолчанию, в рамках которого будут применяться конфигурации при реализации «kind: ServiceImport» (PodSelector)

  13. global.controller.egress.envoyFilter.workloadSelector.label.value — значение по умолчанию, в рамках которого будут применяться конфигурации, при реализации «kind: ServiceImport»(PodSelector)

  14. global.controller.egress.headLessValidationEnable - boolean значение (true/false), включение функционала по валидации пользовательского сервиса, более подробно можно ознакомиться в документе «Руководство прикладного разработчика», раздел «Валидация пользовательского «kind: Service»

  15. controller.egress.destination-rule.workload-selector.enabled - boolean значение (true/false), реализует секцию workloadSelector при организации федеративного трафика в рамках конфигурации «kind: DestinationRule»

  16. discovery.federation.egress.destination-rule.ca-certificate - путь к сертификату (ca) egressgateway проекта где установлен FSSM, при использовании федеративного трафика в проекте

  17. discovery.federation.egress.destination-rule.private-key - путь к приватному ключу (key) egressgateway проекта где установлен FSSM, при использовании федеративного трафика в проекте

  18. discovery.federation.egress.destination-rule.client-certificate - путь к сертификату (клиентскому) egressgateway проекта где установлен FSSM, при использовании федеративного трафика в проекте

  19. global.controller.leader-election.ping-rate - периодичность синхронизации приложения FederationController с приложением FederationDiscovery (указывается в миллисекундах)

  20. controller.egress.service-protocol-validation.enabled - режим по проверке используемых протоколов взаимодействия, например сервер поставщик зарегистрировал свой сервис под портом GRPC и при попытке реализовать «kind: ServiceImport» с HTTP протоколом будет ошибка (в ошибке будет условие перейти на GRPC, так как сервер сказал именно такой протокол в рамках «kind: ServiceExport»)

  21. project-registration.crd.enabled - активация возможности реализовать регистрацию пользовательских namespace по «kind: FederationMemberList»

  22. project-registration.federation-member.enabled - предоставление возможности пользователям самостоятельно регистрировать свой namespace посредством «kind: FederationMember»

При установке компонента FederationController необходимо указать его месторасположение (регион/кластер либо любую свою топологию регион/зона), в рамках заданной топологии будут помечаться все зарегистрированные сервисы в федерации (в дальнейшем можно будет распределять трафик по весам, как раз в рамках выбранной топологии).

Screenshot

Схема. Монтирование параметров посредством «kind: ConfigMap» компонента FederationController

Параметры «kind: ConfigMap» federation-controller-params (в рамках разметки топологии):

  1. global.cluster.id — уникальный идентификатор кластера, в котором будет расположен контроллер (у каждого компонента FederationController), интегрированный с FederationDiscovery, должен быть уникальный идентификатор, чтобы точно идентифицировать компонент)

  2. global.cluster.region — регион расположения компонента FederationController, у всех найденных экземпляров зарегистрированных сервисов в федерации («kind: ServiceExport») будет присвоена топология, в данном случае регион (чтобы в дальнейшем можно было идентифицировать топологию и применять правила маршрутизации)

  3. global.cluster.name — наименование кластера либо группы кластеров, которым будет присвоена указанная топология (зона), у всех найденных экземпляров зарегистрированных сервисов в федерации («kind: ServiceExport») будет присвоена топология, в данном случае зоны (чтобы в дальнейшем можно было идентифицировать топологию и применять правила маршрутизации)

  4. global.cluster.routeHostName — конкретизация домена в рамках кластера, например, компонент FederationController публикуется в кластере, в котором все созданные конфигурации «Шлюз» создаются в рамках домена кластера (пример — apps.santa.ru), интеграция в кластер будет строиться на основе этого домена

Screenshot

Схема. Топология кластера

Параметр $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 будет неработоспособен.

Screenshot

Схема. Реализация ОТТ

Для корректной и безопасной установки ОТТ к компоненту 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.

Screenshot

Схема. Реализация 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 необходимо реализовать несколько действий:

  1. Реализация метки (label) на пользовательском «Namespace», в рамках установленного параметра компонента FederationController (global.federation.label)

  2. Реализация конфигурации «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»

В консоли выполнить команду:
kubectl label namespace ${USER_NAMESAPCE} ${FEDERATION_LABEL}=true

Переменная $USER_NAMESAPCE — это наименование пользовательского «Namespace». Переменная $FEDERATION_LABEL — это ранее реализованный параметр в компоненте FederationController «global.federation.label»)

Загрузить конфигурацию для предоставления прав («kind: RoleBinding»)

В консоли выполнить команду:
kubectl apply -f ${FILE_NAME}.yml

Переменная $FILE_NAME в рамках реализованной вами конфигурации «kind: RoleBinding»

Обновление#

Обновление компонента FSSM необходимо производить по стратегии Recreate. Для обновления компонента FSSM необходимо остановить работу приложений (FederationDiscovery, FederationController) и удалить конфигурации старой версии, после выполнить инсталляцию уже новой версии.

В случае использования режима с использованием СУБД, необходимо выполнить обновление версии базы данных согласно документации используемой СУБД, также «kind: CustomResourceDefinitions» которые передаются в рамках дистрибутива.

При обновлении модуля необходимо выполнить порядок отключения старой версии компонентов:

  1. FederationDiscovery — провести все необходимые шаги, описанные ниже, и подтвердить работоспособность компонента

  2. FederationController — провести все необходимые шаги, описанные ниже, и подтвердить работоспособность компонента

Шаг

Действия

Описание

Создать директорию для установки

На компьютере, с которого будет производиться установка, создать папку, например «synapse-federation»

Разархивировать файлы

Распаковать в созданную папку архив с конфигурационными артефактами компонента FSSM

Подключиться к проекту#

  • Через CLI Kubectl

Шаг

Действия

Описание

Выполнить вход в kubernetes

Загрузите «kubeConfig» от вашего «ServiceAccount». Заведите переменную KUBECONFIG=~/.kube/config, где располагается выгруженная конфигурация.

Перейти в нужный «Namespace»

Введите команду:
kubectl config set-context --current --namespace=<имя вашего проекта>

Остановить компонент#

  • Через CLI Kubectl

Шаг

Действия

Описание

Остановка компонента

В консоли выполнить команду
kubectl scale --replicas=0 deployment/<имя Deployment>

Удалить артефакты действующей версии#

  • Через CLI Kubectl

Шаг

Действия

Описание

Сохранение Deployment

В консоли выполнить команду:
kubectl get -o yaml deployment/<имя Deployment> > <путь к файлу>.yaml

Сохранение конфигурации

В консоли выполнить команду:
kubectl get -o yaml configmaps/<имя config map> > <путь к файлу>.yaml

Удаление Deployment

В консоли выполнить команду:
kubectl delete deployment <имя Deployment>

Удаление конфигурации

В консоли выполнить команду:
kubectl delete configmap <имя config map>

При необходимости изменить конфигурацию

Загрузить новую версию#

  • Через CLI Kubectl

Шаг

Действия

Описание

Загрузка конфигурации

В консоли выполнить команду:
kubectl apply -f ${FILE_NAME}.yml

С новыми конфигурационными файлами

Загрузка Deployment

В консоли выполнить команду:
kubectl apply -f ${FILE_NAME}.yml

С новой версией «kind: Deployment»

Запустить новую версию компонента#

  • Через CLI Kubectl

Шаг

Действия

Описание

Запустить новую версию компонента

В консоли выполнить команду
kubectl scale --replicas=${N} deployment/<имя Deployment>

$N — необходимое количество «kind: Pod», рекомендованное значение — 2

Удаление#

Подключиться к проекту#

  • Через CLI Kubectl

Шаг

Действия

Описание

Выполнить вход в kubernetes

Загрузите «kubeConfig» от вашего «ServiceAccount». Заведите переменную KUBECONFIG=~/.kube/config, где располагается выгруженная конфигурация

Перейти в нужный «Namespace»

Введите команду:
kubectl config set-context --current --namespace=<имя вашего проекта>

Остановить компонент#

  • Через CLI Kubectl

Шаг

Действия

Описание

Остановка приложения

В консоли выполните команду
kubectl scale --replicas=0 deployment/<имя Deployment>

Удалить артефакты действующей версии#

  • Через CLI Kubectl

Шаг

Действия

Описание

Удалить Deployment

В консоли выполнить команду:
kubectl delete -o yaml deployment/<имя Deployment> > <путь к файлу>.yaml

Удалить конфигурации

В консоли выполнить команду:
kubectl delete -o yaml configmaps/<имя config map> > <путь к файлу>.yaml

Удалить все зависимые ресурсы из раздела «3. Установить необходимый перечень ресурсов»

В консоли выполнить команду:
kubectl delete -o yaml customresourcedefinitions/<имя custom resource definitions> > <путь к файлу>.yaml

Проверка работоспособности#

FederationDiscovery#

  • Через CLI Kubectl

Проверка

Действия

Результат

Описание

Проверка работоспособности

В консоли выполнить команду:
kubectl port-forward pod/<имя Pod> <portnum>:<portnum>
Запустить еще одно окно консоли, в нем выполнить команду:
curl localhost:${NUMBER_PORT}/api/liveness

Команда должна вывести строку «ok» Завершите forward(s) портов нажатием Ctrl+C

$NUMBER_PORT — номер порта указанный в параметре server/port.

Также проверить отсутствие ошибок в рамках логов приложения.

FederationController#

  • Через CLI Kubectl

Проверка

Действия

Результат

Описание

Проверка работоспособности

В консоли выполнить команду:
kubectl port-forward pod/<имя Pod> <portnum>:<portnum>
Запустить еще одно окно консоли, в нем выполнить команду:
curl -v localhost:${NUMBER_PORT}/health/live

Команда должна вывести строку «HTTP 1.1 200»
Завершить forward(s)/forwarding(s) портов нажатием Ctrl+C

$NUMBER_PORT — номер порта указанный в параметре server/port

Также проверить отсутствие ошибок в рамках логов приложения.

Интеграционные взаимодействия#

При реализации архитектуры с ОТТ, LOGA и SecMan (Hashicorp Vault), просьба ознакомиться с методами проверки работоспособности в документации указанных компонентов.

Откат#

В случае использования режима с использованием СУБД, необходимо выполнить откат установки базы данных согласно документации используемой СУБД.

Остановить компонент#

  • Через CLI Kubectl

Шаг

Действия

Описание

Остановка приложения

В консоли выполнить команду
kubectl scale --replicas=0 deployment/<имя Deployment>

Удалить артефакты действующей версии#

  • Через CLI Kubectl

Шаг

Действия

Описание

Сохранение Deployment

В консоли выполнить команду:
kubectl get -o yaml deployment/<имя Deployment> > <путь к файлу>.yaml

Сохранение конфигурации

В консоли выполнить команду:
kubectl get -o yaml configmaps/<имя config map> > <путь к файлу>.yaml

Удаление Deployment

В консоли выполнить команду:
kubectl delete deployment <имя Deployment>

Удаление конфигурации

В консоли выполнить команду:
kubectl delete configmap <имя config map>

При необходимости изменить конфигурацию

Загрузить сохраненные артефакты#

  • Через CLI Kubectl

Шаг

Действия

Описание

Загрузить конфигурации в рамках компонента

В консоли выполнить команду:
kubectl apply -f ${FILE_NAME}.yml

Переменная $FILE_NAME в рамках добавления необходимых конфигураций компонента («kind: Deployment»/«kind: ConfigMap»)

Запустить восстановленную версию компонента#

  • Через CLI Kubectl

Шаг

Действия

Описание

Запустить восстановленную версию компонента

В консоли выполнить команду
kubectl scale --replicas=${N} deployment/<имя Deployment>

$N — необходимое количество «kind: Pod», рекомендованное значение 2

Часто встречающиеся проблемы и пути их устранения#

Проблема

Причина

Решение

Ошибка при подключении к проекту

Пользователю не предоставлен доступ в проект.
Нет физического доступа к кластеру

Запросить доступ к проекту у администратора кластера

Ошибка при загрузке артефактов

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

Запросить доступ к проекту у администратора кластера

Ошибка при Pull docker-образа из репозитория

Отсутствуют права на Pull образа из репозитория.
Недоступен репозиторий.
Неверная ссылка на image в Deployment

Запросить права у администратора registry.
Проверить ссылку, при необходимости скорректировать Deployment

Ошибка при запросе на федеративный 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

Компонент работает корректно