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

В руководстве приведены инструкции по установке компонента 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: 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 или
Red Hat Enterprise Linux 8 или
Platform V SberLinux OS Server (SLO) 8.7 (Операционная система (INST))

Операционная система

Да

Docker CE 19.03.14

Средство контейнеризации

Да

Platform V DropApp (K8S) 1.3 и выше (K8S Core (K8SC)) или
Kubernetes 1.19, 1.25, 1.26 или
Red Hat OpenShift 4.6 и выше

Среда контейнеризации

Да

OpenJDK 17 или
openjdk-17.0.8 1.0-8

Java-машина

Да

Nexus-Public 3.42.0 или
Nexus Repository Manager PRO 3.43.0 или
Nexus Repository Manager OSS 3.43.0

Сервис централизованного хранения репозиториев артефактов (хранилище артефактов)

Да

GitLab Community Edition 15.7 и выше или
Bitbucket 7.6.7

Сервис централизованного хранения репозиториев исходного кода

Нет

Istio 1.6 и выше или
Platform V Synapse Service Mesh (SSM) 4.7 и выше (Управление политиками (POLM), Сервисный прокси (SVPX), Граничный прокси (IGEG), Service Mesh DevOps Lib (SMDL))

Сервис интеграции и оркестрации микросервисов в облаке

Нет

HashiCorp Vault 1.10 и выше

Система хранения и распространения secrets

Нет

Prometheus 2.37 и выше, Grafana 9.0 и выше или
Platform V Monitor (OPM) 5.1.1 (Журналирование (LOGA))

Система мониторинга

Нет

Platform V Backend (#BD) 4.3 (One-Time Password (OTP) / OTT (OTTS))

Сервис для аутентификации и авторизации межсервисных взаимодействий

Нет

Helm 3.8 и выше

Менеджер пакетов

Нет

kubectl CLI 1.20.5 и выше

Интерфейс командной строки для взаимодействия с кластером

Нет

PostgreSQL 11, 12, 13 или
Platform V Pangolin SE (PSQ) 5.5.3 (Pangolin (PSQL))

Система управления базами данных (СУБД)

Примечание:

*

  • Да — ПО, необходимое для функционирования сервиса, без установки которого не гарантирована работоспособность.

  • Нет — ПО, необязательное для функционирования сервиса, установка которого не влияет на работоспособность основных функций.

** Минимальная версии программного обеспечения, на которой гарантируется работоспособность. Использование версий выше заявленной возможно до потери обратной совместимости.

Компонент POLM сконфигурирован со следующими параметрами:

...                                                             
    defaultConfig:                                              
      proxyMetadata:                                            
        ISTIO_META_DNS_CAPTURE: 'true'                          
        ISTIO_META_DNS_AUTO_ALLOCATE: 'true'                    
...                                                             

Аппаратные требования#

Для установки компонента требуется следующая конфигурация аппаратного обеспечения:

Название модуля

ПО среды функционирования

Количество

Список контейнеров

CPU Request

CPU Limit

Memory Request

Memory Limit

Горизонтальное масштабирование

Приложение FederationDiscovery

Kubernetes/Platform V DropApp (опционально OpenShift NS)

1 pod

federation-discovery

600

1000

1000

2000

Нет

istio-proxy

100

200

200

300

Нет

Приложение FederationController

Kubernetes/Platform V DropApp (опционально OpenShift NS)

1 pod

federation-controller

600

1000

1000

2000

Нет

istio-proxy

100

200

200

300

Нет

Компонент FSSM не поддерживает горизонтальную масштабируемость.

Состав дистрибутива#

В рамках компонента FSSM предоставляется 3 архива:

  • fssm-bin

Элемент дистрибутива

Описание

./package/bh/discovery

Operator по работе с служебными конфигурациями

./package/bh/controller

Operator по работе с пользовательскими конфигурациями

  • fssm-cfg

Элемент дистрибутива

Описание

./package/conf/helm/application/*

Базовые конфигурации по установке компонента FSSM

  • fssm-dbinit

Элемент дистрибутива

Описание

./package/conf/scripts/*

Скрипт запуска Liquibase по организации БД Pangolin

./package/db/*

Архив с Liquibase скриптами по организации БД Pangolin

Подготовка окружения#

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

Screenshot

Схема. Рекомендованная cхема развертывания взаимодействия с 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?\\.Values\\.registry\\s?(\\}){1,2})/(\\{\\{|\\$\\{)\\s?\\.Values\\.registry_path\\s?(\\}){1,2}/fssm_discovery@sha256:(?<hash>\\w+)"   # регулярное выражение для поиска в конфигурациях развертывания места с указанием image компонента
                }
              ]
            },
            {
              "docker": [
                {
                  "baseImageLink": "${базовый образ для сборки приложения}",  # пример "*/openjdk-17"
                  "version": "${версия компонента FSSM_cotroller}",
                  "deploymentUnit": "fssm_controller"                         # идентификатор компонента FSSM discovery
                }
              ],
              "imageLinkMapping": [
                {
                  "regex": "(?<=(\\{\\{|\\$\\{)\\s?\\.Values\\.registry\\s?(\\}){1,2})/(\\{\\{|\\$\\{)\\s?\\.Values\\.registry_path\\s?(\\}){1,2}/fssm_controller@sha256:(?<hash>\\w+)"    # регулярное выражение для поиска в конфигурациях развертывания места с указанием image компонента
                }
              ]
            },
            {
              "artifactId": "fssm-cfg",
              "imageLinkMapping": [
                {
                  "string": "/{{ .Values.registry_path_loga }}/fluent-bit@sha256:36f68f5fa6e21cc699ab336159ba3417523c6ee6e61b79d5bd6f8f5b797d1a0c",
                  "replace": "${ссылка на образ fluent-bit}"                  # необходимо указать полный путь к image компонента fluent-bit (версии 1.8.8 или 1.9 и выше)
                },
                {
                  "string": "/{{ .Values.registry_path_igegose }}/proxyv2@sha256:36f68f5fa6e21cc699ab336159ba3417523c6ee6e61b79d5bd6f8f5b797d1a0c",
                  "replace": "${ссылка на образ IGEG 1.2.2}"                  # необходимо указать полный путь к image IGEG (1.2.2), который поддерживает работоспособность с Istio версии 1.6.14
                },
                {
                  "string": "/{{ .Values.registry_path_igegse }}/proxyv2@sha256:36f68f5fa6e21cc699ab336159ba3417523c6ee6e61b79d5bd6f8f5b797d1a0c",
                  "replace": "${ссылка на образ IGEG 1.20}"                 # необходимо указать полный путь к image IGEG (1.20) который поддерживает работоспособность с Istio версии 1.20.*
                },
                {
                  "string": "/{{ .Values.registry_path_otts }}/ott-sidecar@sha256:36f68f5fa6e21cc699ab336159ba3417523c6ee6e61b79d5bd6f8f5b797d1a0c",
                  "replace": "${ссылка на образ ОТТ}"                         # необходимо указать полный путь к image ОТТ (4.2.15)
                },
                {
                  "string": "/{{ .Values.registry_path_igegse117 }}/proxyv2@sha256:36f68f5fa6e21cc699ab336159ba3417523c6ee6e61b79d5bd6f8f5b797d1a0c",
                  "replace": "${ссылка на образ IGEG 1.17}"                 # необходимо указать полный путь к image IGEG (1.17) который поддерживает работоспособность с Istio версии 1.17.*
                },
                {
                  "string": "/{{ .Values.registry_path_igegse119 }}/proxyv2@sha256:36f68f5fa6e21cc699ab336159ba3417523c6ee6e61b79d5bd6f8f5b797d1a0c",
                  "replace": "${ссылка на образ IGEG 1.19}"                 # необходимо указать полный путь к image IGEG (1.19) который поддерживает работоспособность с Istio версии 1.19.*
                },
                {
                  "string": "{{ .Values.registry }}",         # при необходимости использовать .Values.global.registry
                  "replace": "{{ $registry }}"
                }
              ]
            }
          ],
          "to": {
            "ci":  "90000017"
          }
        },
...
  1. Запустить инструмент автоматической сборки продукта SSM, компонента SMDL, «ClientUnpacker» (более подробно о настройке и запуске можно ознакомиться в документации компонента «SMDL», «Руководство оператора»), результатом исполнения будут собранные для установки приложения артефакты (на email сотрудника, кто запустил job, придет таблица со ссылками на артефакты).

  2. Провести проверку корректной подстановки образов по шаблону, указанному в пункте 1 данного алгоритма. В таблице, которая пришла после запуска job «ClientUnpacker», необходимо загрузить артефакты, относящиеся к компоненту FSSM (позиция «product FSSM_controller*» и «product FSSM_discovery*», ссылка на дистрибутив располагается в секции «distribUrl»).

### компонент FederationController
### путь к конфигурационному файлу «/package/conf/helm/application/fssm-discovery/templates/deployment-controller.yaml» 
### провести поиск по ключу «image» 
...
      containers:
        - name: federation-controller
          image: '{{ $registry }}/*/fssm/fssm_controller@sha256:hash' # пример корректной подстановки образа для компонента fssm_controller
...
        - name: fluent-bit
          image: */fluent-bit@sha256:hash                             # пример корректной подстановки образа для компонента fluent-bit
...
### компонент FederationDiscovery
### путь к конфигурационному файлу «/package/conf/helm/application/fssm-discovery/templates/deployments-discovery.yaml» 
### провести поиск по ключу «image» 
...
      containers:
        - name: federation-discovery
          image: '{{ $registry }}/*/fssm/fssm_discovery@sha256:hash' # пример корректной подстановки образа для компонента fssm_discovery
...
        - name: fluent-bit
          image: */fluent-bit@sha256:hash                                # пример корректной подстановки образа для компонента fluent-bit
...
          {{- if eq .Values.useControl "ose" }}
          image: */igeg/proxyv2:istio-release-1.6.14-se-release-1.2.2    # пример корректной подстановки образа для компонента IGEG
          {{ end }}
          {{- if eq .Values.useControl "ose-se" }}
          image: */igeg/proxyv2:istio-release-1.20.2-se-release-1.20.2   # пример корректной подстановки образа для компонента IGEG
          {{ end }}
...
          envFrom:
            - configMapRef:
                name: ott-settings
          image: */ott:v4.2.15                                                                                  # пример корректной подстановки образа для компонента OTT
...

При ручной установке компонента FSSM необходимо сохранить переменную в Терминале.

Сохранить образы приложений в переменную, необходимо выполнить в CLI команду:

IMAGE_FEDERATION_DISCOVERY=$image_discovery     # переменная формируется из таблицы в рамках результата работы ClientUnpacker
IMAGE_FEDERATION_CONTROLLER=$image_controller   # переменная формируется из таблицы в рамках результата работы ClientUnpacker

Указанное действие необходимо для успешной установки компонента (при ручной установке).

В рамках конфигурационных файлов предусмотрена опция организации автоматизации по стендозависимым параметрам в рамках директории «conf.config.parameters», при наличии автоматизированных инструментов.

federation-discovery.all.conf

# пример параметра 
federation-discovery.k8s.deployment.sidecar.istio.inject=true

federation-discovery.istio.all.conf

# пример параметра 
federation-controller.k8s.deployment.sidecar.istio.inject=true

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

  • Через CLI Kubectl

Шаг

Действия

Описание

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

Загрузить «kubeConfig» от вашего «ServiceAccount». Завести переменную 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. Ресурс для реализации запроса вебхука в рамках мутирования пользовательских конфигураций («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) и database_secret_login и database_secret_password с логином и паролем для работы с БД (опционально при использовании PostgreSQL - database_secret_login и database_secret_password), где указывается «username: » и «password: » (в формате base64).

Настройка базы данных#

Ручная настройка базы данных#

Если в рамках установки выбран сервер 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==';

Указанные параметры необходимо будет реализовать в секретах «database_secret_login» и «database_secret_password» в формате base64.

ВАЖНО! Перед тем, как идти дальше, необходимо подключиться к созданной базе данных.

Пример подключения

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 - ./package/conf/helm/application/amain/templates/crd.yaml).

Конфигурации в рамках вебхук

mutating.yaml validation.yaml

Перед выполнением команды необходимо реализовать сертификат для взаимодействия.

Сертификат в дистрибутиве для реализации вебхука не содержится и его необходимо выпустить самостоятельно. См. раздел «Управление ключами и сертификатами».

Команда:

CA_BUNDLE=<информация по «CA» сертификату>

Пример CA_BUNDLE:

LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS*******

Если используется платформа Openshift, то параметр «CA_BUNDLE» заполнять не требуется, достаточно только наличия аннотации «service.beta.openshift.io/inject-cabundle».

Пример конфигурации при реализации IGEG в рамках namespace, где установлен компонента FSSM.

kubectl apply -n $FEDERATION_NAMESPACE -f - <<EOF
kind: MutatingWebhookConfiguration
apiVersion: admissionregistration.k8s.io/v1
metadata:
  annotations:
    service.beta.openshift.io/inject-cabundle: 'true'                                                  # при использовании Openshift
    cert-manager.io/inject-ca-from: $FEDERATION_NAMESPACE/validationwebhook-federation-cert  # gри использовании «cert-manager» в кластере kubernetes
  name: synapse-federation-mutating-webhook
  labels:
    app: synapse-federation-mutating-webhook
    kind: mutator
webhooks:
  - name: webhook.federation.synapse.sber
    sideEffects: None
    clientConfig:
      service:
        namespace: $FEDERATION_NAMESPACE
        name: ingressgateway-$FEDERATION_NAMESPACE
        path: /api/webhook
        port: 10445
      caBundle: $CA_BUNDLE    # пример «LS0tLS1CRUdJTiBDRVJ*»
    reinvocationPolicy: Never
    rules:
      - operations:
          - CREATE
          - UPDATE
        apiGroups:
          - networking.synapse.sber
        apiVersions:
          - '*'
        resources:
          - serviceexports
          - serviceimports
          - servicetrafficpolicies
        scope: '*'
    matchPolicy: Equivalent
    namespaceSelector: {}
    admissionReviewVersions:
      - v1
      - v1alpha1
    failurePolicy: Fail
    objectSelector: {}
    timeoutSeconds: 10
---
kind: ValidatingWebhookConfiguration
apiVersion: admissionregistration.k8s.io/v1
metadata:
  name: synapse-federation-validation-webhook
  annotations:
    service.beta.openshift.io/inject-cabundle: 'true'                                                  # при использовании Openshift
    cert-manager.io/inject-ca-from: $FEDERATION_NAMESPACE/validationwebhook-federation-cert  # gри использовании «cert-manager» в кластере kubernetes
webhooks:
  - name: federation.synapse.validation.sber
    sideEffects: None
    clientConfig:
      service:
        namespace: $FEDERATION_NAMESPACE
        name: ingressgateway-$FEDERATION_NAMESPACE
        path: /api/ingress-gw-validation
        port: 10445
      caBundle: $CA_BUNDLE    # пример «LS0tLS1CRUdJTiBDRVJ*»
    rules:
      - operations:
          - CREATE
          - UPDATE
        apiGroups:
          - networking.istio.io
        apiVersions:
          - '*'
        resources:
          - gateways
        scope: Namespaced
    matchPolicy: Exact
    namespaceSelector:
      matchExpressions:
        - key: $FEDERATION_NAMESPACE-federation
          operator: In
          values:
            - 'true'
    admissionReviewVersions:
      - v1alpha1
      - v1
    failurePolicy: Ignore
    objectSelector: {}
    timeoutSeconds: 30
EOF

Пример реализации конфигурации при использовании «cert-manager» в кластере Kubernetes

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: validationwebhook-federation-cert
  namespace: $FEDERATION_NAMESPACE
spec:
  commonName: ingressgateway-$FEDERATION_NAMESPACE.$FEDERATION_NAMESPACE.svc
  dnsNames:
  - ingressgateway-$FEDERATION_NAMESPACE
  - ingressgateway-$FEDERATION_NAMESPACE.svc
  - ingressgateway-$FEDERATION_NAMESPACE.$FEDERATION_NAMESPACE.svc
  duration: 43800h
  issuerRef:
    kind: ClusterIssuer
    name: kubernetes-selfsigning-issuer
  renewBefore: 4380h
  secretName: ingressgateway-webhook

Установка#

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

В случае реализации сбора метрик посредством Prometheus, необходимо ознакомиться с документом «Руководство по системному администрированию», раздел «События мониторинга».

Предусловие#

Использование сертификатов с использованием «vault»#

Использование KV (key value) хранилища для сертификатов

Обращаем внимание, что используется «version: 1», в рамках создания хранилища секретов (kv).

Необходимо предварительно реализовать ряд работ по настройке интеграционных взаимодействий vault/LOGA/OTT:

  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) с алиас «OTT_CLIENT_CERT_ALIAS: synapse-federation», про правила формирования необходимо уточнить в документации компонента ОТТ;

    3. database_secret_login - необходимо указать логин пользователя для работы с БД PostgreSQL (в base64), опционально;

    4. database_secret_password - необходимо указать пароль пользователя для работы с БД PostgreSQL (в base64), опционально;

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

Использование PKI engine хранилища для сертификатов

При использовании функции PKI engine приложения vault, необходимо реализовать хранилище указанного формата, более подробно можно ознакомиться на сайте vault.

ВАЖНО! При реализации директории, в рамках которой будет организовано хранилище PKI engine, необходимо придерживаться следующего пути /, где:

  • - значение аннотации vault в рамках приложения «vault.hashicorp.com/namespace»;

  • - путь к каталогу где будет реализован PKI engine, также необходимо указывать метод запроса, например «issue» и наименование роли в рамках которой будет реализован сертификат;

  • Пример итогового пути к PKI engine будет выглядеть следующим образом - «DEV/PKI/issue/role».

Реализация в рамках конфигурационных файлов, на примере генерации сертификата для Kafka:

{{`{{- with secret`}} "{{ .Values.vault.secmanNamespace }}/{{ .Values.vault.pki_engine.egress.kafka.pki_path }}" "common_name={{ .Values.vault.pki_engine.egress.kafka.common_name }}" {{`-}} {{ .Data.certificate }} {{- end }}`}}

При выпуске сертификатов идет обращение в рамках «.Data» PKI engine:

  • к корневому сертификату - параметризуется в рамках стендозависимых параметров vault.pki_engine.(egress/ingress).*.data.ca.name;

  • к клиентскому, либо серверному сертификату - ;

  • к приватному ключу - .

Использование указанной функции производится при установке приложения и активации стендозависимых параметров:

vault:
  pki_engine:
    enabled: 'false'                       # флаг, указывающий на использование PKI engine в рамках хранения сертификатов (общий, при указании 'false' все сертификаты будут использоваться из KV version 1)
    ingress:                               # группа сертификатов использующиеся для входящего трафика
      federation:                          # группа параметров для сертификата по интеграции приложений FSSM
        pki_enabled: 'false'               # локальный флаг использования PKI engine
        pki_path: PKI/issue/pki            # частичный пусть к PKI engine путь формируется по структуре ({{ .Values.vault.secmanNamespace }}/{{ .Values.vault.pki_engine.ingress.federation.pki_path }}), также необходимо указывать метод запроса, например «issue» и наименование роли в рамках которой будет реализован сертификат
        common_name: federation.host       # параметр в рамках указывающий «common_name» выпускаемого сертификата
        data:                              # группа параметров для возможности изменения параметров по корневому сертификату
          ca:                            
            name: ca_chain                 # имя корневого сертификата в рамках PKI engine, пример реализации по умолчанию «{{ .Data.ca_chain }}»
            range: 'false'                 # флаг использования «range» для реализации цепочки сертификатов ({{ range $k, $v := .Data.ca_chain }} {{- $v }} {{- end -}})
      bootstrap:                           # группа параметров для сертификата приложений FSSM (при использовании режима bootstrap и реализация отдельных сертификатов для этого)
        pki_enabled: 'false'
        pki_path: PKI/issue/pki
        common_name: bootstrap.host
        data:
          ca:
            name: ca_chain
            range: 'false'
      webhook:                             # группа параметров для сертификата по webhook взаимодействию (при использовании сертификатов из vault, также при выпуске такого рода сертификата необходимо убедиться, что caBundle секция, в рамках webhook configuration доверяют друг другу)
        pki_enabled: 'false'
        pki_path: PKI/issue/pki
        common_name: webhook.host          # при выпуске сертификата необходимо придерживаться логике формирования «common_name» - $имя сервиса.$имя проекта.svc
    egress:                                # группа сертификатов использующиеся для исходящего трафика
      federation:                          # группа параметров для сертификата по интеграции приложений FSSM
        pki_enabled: 'false'
        pki_path: PKI/issue/pki
        common_name: federation.host
        data:
          ca:
            name: ca_chain
            range: 'false'
      bootstrap:                           # группа параметров для сертификата приложений FSSM (при использовании режима bootstrap и реализация отдельных сертификатов для этого)
        pki_enabled: 'false'
        pki_path: PKI/issue/pki
        common_name: bootstrap.host
        data:
          ca:
            name: ca_chain
            range: 'false'
      kafka:                               # группа параметров для сертификата по интеграции с Kafka (при использовании агента сбора логов)
        pki_enabled: 'false'
        pki_path: PKI/issue/pki
        common_name: kafka.host
        data:
          ca:
            name: ca_chain
            range: 'false'
      postgres:                            # группа параметров для сертификата по интеграции с Postgres (при использовании Postgres для синхронизации федераций)
        pki_enabled: 'false'
        pki_path: PKI/issue/pki
        common_name: postgres.host
        data:
          ca:
            name: ca_chain
            range: 'false'

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

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

  • «1. Создать директорию установки»;

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

В рамках артефакта по установке предоставляется 2 чарта:

  • amain - в рамках чарта устанавливаются CRD которые необходимы для работы компонента;

  • fssm-discovery - чарт для установки компонента FSSM.

  1. Заполнить стендозависимые параметры для установки компонента FSSM, пример: FederationDiscovery

### Необходимо реализовать файл values.yaml
### Расположение файла в рамках git ветки job «SynapseInstaller» (более подробно о настройке и запуске можно ознакомиться в документации компонента «SMDL», «Руководство оператора»)
### Для установки CRD компонента FSSM - synapse-config-dev-gen/${имя проекта для установки}/package/conf/helm/fssm-main/values.yaml
### Для компонента FSSM - synapse-config-dev-gen/${имя проекта для установки}/package/conf/helm/fssm/values.yaml

Более подробно описано в рамках указанного документа, раздел «Стендозависимые параметры».

  1. Запустить job компонента SMDL, «SynapseInstaller» (более подробно о настройке и запуске можно ознакомиться в документации компонента «SMDL», «Руководство оператора»).

В рамках запуска job «SynapseInstaller» необходимо выбрать опцию установки «needInstallSelectedCharts».

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

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

Алгоритм действий при ручной установке сервиса:

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

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

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

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

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

  6. Провести заполнение файла «./package/conf/helm/application/fssm-discovery/values.yaml» (описание параметров указана в указанном документе, раздел «Стендозависимые параметры»).

  7. Провести установку компонента FSSM - «helm install fssm –values fssm-discovery/values.yaml»; При необходимости удалить компонент FSSM - «helm delete fssm».

При возникновении ошибок/проблем при установке рекомендуем ознакомиться с документацией на компонент Граничный прокси (IGEG) продукта «Platform V Synapse Service Mesh» (SSM) в документе «Руководство по установке», раздел «Часто встречающиеся проблемы и пути их устранения» и документации инструмента «helm».

Если используется платформа Openshift, то необходимо организовать доступ в рамках «namespace», реализовав следующую конфигурацию:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-from-default-namespaces
spec:
  podSelector: {}
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              name: default
  policyTypes:
    - Ingress

Описание параметров «kind: ConfigMap» federation-controller-params (в рамках выбранной архитектуры взаимодействия):

  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 — диапазон, в рамках которого при неактивности «лидера» подов будет выбран другой «лидер».

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

Стендозависимые параметры#

Чарт amain Чарт fssm-discovery

values.yaml (чарта amain (fssm-main))

release_version: "1.7.0" # указать версию релиза
config_version: "1.7.0"  # указать версию конфигурации
component_type: service

crd:                   
  install: "false"                                   # установка CRD (kind: CustomResourceDefinitions)
  useCRDProxy: "false"                               # установка CRD (kind: CustomResourceDefinitions) посредством компонента CRDproxy (уникальное решение одного из клиента)

values.yaml (чарта fssm-discovery (fssm))

release_version: "1.10.0" # указать версию релиза
config_version: "1.10.0"  # указать версию конфигурации
component_type: service

#global:
#  registry: moi.space                         # registry в рамках которого реализован образ приложений
#  clusterName: moi.cluster                    # опциональный параметр для конкретизации клаcтера

#registry:                                         # при использовании указанного параметра, используется если не произведена автоматическая сборка и не произведена замена на .Values.global.registry
#registry_path_igegose:                            # при использовании выделенного path для istio 1.6
#registry_path_igegse117:                          # при использовании выделенного path для istio 1.17
#registry_path_igegse119:                          # при использовании выделенного path для istio 1.19
#registry_path_igegse:                             # при использовании выделенного path для istio 1.20 установить несколько федераций, важно учитывать изменение 
#registry_path_loga:                               # при использовании выделенного path для fluent-bit
#registry_path_otts:                               # при использовании выделенного path для OTT
registry_path: /dev                                # Docker path где расположен образы FSSM
indexFederation: ''                                # уникальный идентификатор установки FSSM, указывается при необходимости установить несколько федераций, важно учитывать изменение адреса ({{ if not (eq .Values.indexFederation "") }}{{ .Values.indexFederation }}-{{ end }}grpc-federation-discovery.{{ if .Values.global.clusterName }}{{ .Values.global.clusterName }}{{ else }}{{ .Values.cluster }}{{ end }}), также используется для унификации конфигураций ролевой модели и webhooks (указание параметра необходимо без специальных символов)
cluster: apps.stands.solution.sbt                  # наименование кластера, формата «apps.stands-vdc01.solution.sbt»
region: 'moscow'                                   # наименование региона, где производится установка компонента
useControl: ose                                    # используемая версия Istio, при использовании версии 1.6 необходимо указать значение «ose», при использовании контрольной панели POLM реализовать значение «ose-se» и при использовании POLM в рамках Kubernetes необходимо указать значение «k8s»
serviceIstiod: istiod-basic                        # наименование сервиса контрольной панели, компонента «istiod»
istioControlPlane: sbt-controlplane                # наименование namespace контрольной панели, к которой подключен namespace компонента FSSM
discoveryCluster: apps.stands.solution.sbt         # наименование кластера, где установлен лидер FederationDiscovery (описание про лидера реализовано в документе «Детальная архитектура» в разделе «Диаграммы развертывания»)
discovery_external_port: 443                       # внешний порт по которому идет обращение к discovery (подставляется в ServiceEntry)
#discovery_external_ip: *.*.*.*                    # внешний IP-адрес discovery, указывается опционально, при указании параметра «discovery_resolution: STATIC» 
discovery_resolution: DNS                          # resolution адреса discovery (подставляется в ServiceEntry)
discovery_persistent_type: kubeapi                 # указание места хранения федеративной маршрутизации (kubeapi - внутри кластера, Postgresql - использование postgreSQL)  
discoveryLeaderInNamespace: 'true'                 # при установке компонента FederationController в рамках namespace лидера компонента FederationDiscovery необходимо указать значение «'true'», если лидер FederationDiscovery располагается в другом кластере необходимо указать значение «'false'»
kubeAPIIP: '*.*.*.*'                               # IP-адрес сервиса KubeAPI (kubernetes.default.svc.cluster.local)
kubePort: 443                                      # Port сервиса KubeAPI (kubernetes.default.svc.cluster.local), параметр указывается при установке в Kubernetes кластер (useControl: k8s)
kubeAPIRefreshTokenPeriod: 30000                   # период проверки токена при обращении в KubeAPI, указывается в миллисекундах (активный при выставлении параметра «projectedKubeAPI: 'true'»)
kubeAPIResolution: DNS                             # resolution в рамках реализации конфигурации «kind: ServiceEntry» по host Kube API server
kubeEgressRouting: TLS                             # реализация конфигураций Istio (TLS перехват трафика в рамках tls, TCP перехват трафика по tcp, DISABLE инициация по HTTP протоколу и реализация сертификата на egress)
projectedKubeAPI: 'false'                          # признак монтирования токена для работы с KubeAPI, если стоит значение false, то токен будет примонтирован автоматически, если true то токен будет примонтирован в рамках Deployment
seccompProfile: 'false'                            # флаг установки параметра seccompProfile в секции securityContext у «kind: Deployment» (указанный параметр поддерживается в Kubernetes версии 1.25+)
generate_ephemeral_storage: 'true'                 # флаг установки ephemeral-storage в рамках контейнеров, конкретизация ресурсов указывается для каждого контейнера отдельно, при установке флага как «false» монтирование ephemeral-storage производиться не будет
affinity: 'true'                                   # флаг установки podAntiAffinity с конкретизацией метки (label) при установке на Node
poddistruptionbudget: 'true'                       # флаг установки конфигурации «kind: PodDistruptionBudget»
enabledPriorityClassName: 'true'                   # флаг установки параметра PriorityClassName в рамках «kind: Deployment»
priorityClassName: system-cluster-critical         # значение параметра PriorityClassName в рамках «kind: Deployment»
validating_protocol_sex: "false"                   # режим валидации протоколов при регистрации «kind: ServiceExport» и проверки в корректной интеграции «kind: ServiceImport» (например сервер опубликовал GRPC порт, а потребитель пытается настроить HTTP интеграцию - в данном случае FSSM выдаст ошибку и опишет ошибку в рамках конфигурации)
affinityMatchKey: beta.kubernetes.io/arch          # реализация affinityMatchKey в рамках IGEG
affinityMatchValues:                               # реализация affinityMatchValues в рамках IGEG
   - amd64
   - ppc64le
   - s390x
ottUserConfig: ose                                 # версия контрольной панели для реализации конфигурации «kind: EnvoyFilter» для реализации в рамках пользовательских интеграций. ose реализация конфигурации в рамках версии API envoy v2, k8s реализация конфигурации в рамках версии API envoy v3
workloadSelectorDRS_Federation: 'true'             # добавление в федеративные конфигурации DestinationRule секции workloadSelector на egressgateway
ottInstall: 'true'                                 # необходимость установки ОТТ в рамках проекта FSSM
add_kind_sidecar_cp: 'true'                        # включение в рамках «kind: sidecar» проект контрольной панели

webhooks:    
  install: "true"                                  # флаг установки конфигураций «MutatingWebhookConfiguration» и «ValidatingWebhookConfiguration» из дистрибутива
  namespaceSelectorMutation: "true"                # реализация namespaceSelector в рамках конфигурации по мутации ({{ Имя проекта федерации }}-federation)
  useCertManager: "true"                           # публикация конфигурации «kind: Certificate»

nginx:
  backendProtocol: HTTPS                           # значение аннотации в рамках «kind: Route» - nginx.ingress.kubernetes.io/backend-protocol

installRoleModel: "true"                           # флаг установки ролевой модели из дистрибутива (без реализации RoleBinding в рамках пользовательских namespace)
roleBindings:
  install: "false"                                 # реализация RoleBinding              
  useCustom:
    install: "false"                           # уникальные конфигурации одного из клиента, по организации ролевой модели
#    synapse_federation_controller_crb:        # данные для роли synapse_federation_controller_crb
#      version:
#      roleUID:
#      hash:
#    synapse_federation_discovery:             # данные для роли synapse_federation_discovery
#      version:
#      roleUID:
#      hash:
#    synapse_federation_leases:                # данные для роли synapse_federation_leases
#      version:
#      roleUID:
#      hash:
#    synapse_federation_discovery_leases:      # данные для роли synapse_federation_discovery_leases
#      version:
#      roleUID:
#      hash:
#    synapse_federation_controller:            # данные для роли synapse_federation_controller
#      version:
#      roleUID:
#      hash:

add_serviceaccount: 'false'                        # флаг установки «kind: ServiceAccount»
image_pull_secret: pull                            # наименование imagePullSecrets для успешного обращения в docker registry

peer_authentication: 
  install: 'true'                                  # флаг установки конфигурации «kind: PeerAuthentication»
  mtls_mode: STRICT                                # указание используемого мода

bootstrap:
  mode: 'false'                                    # флаг использования федеративного трафика для приложения FederationController (добавляется в федерацию сервис FederationDiscovery), поддерживает работоспособность при использовании PostgreSQL для синхронизации
  use_default_address: 'true'                      # использование адреса «{{ if not (eq .Values.indexFederation "") }}{{ .Values.indexFederation }}-{{ end }}grpc-federation-discovery.{{ if .Values.global.clusterName }}{{ .Values.global.clusterName }}{{ else }}{{ .Values.cluster }}{{ end }}» для федеративной маршрутизации, при значении «false» будет создан дополнительный Ingresses/Route предназначенный для федеративного трафика «grpc-bootstrap-discovery{{ .Values.indexFederation }}.{{ .Values.cluster }}»
  ott: 'true'                                      # использование ОТТ при организации федеративного трафика для приложения FederationController
  gateway:                                         # опционально, при значении параметра «use_default_address: 'false'» необходимо будет реализовать сертификаты для федеративного адреса «{{ if not (eq .Values.indexFederation "") }}{{ .Values.indexFederation }}-{{ end }}grpc-bootstrap-discovery.{{ if .Values.global.clusterName }}{{ .Values.global.clusterName }}{{ else }}{{ .Values.cluster }}{{ end }}» на ingressgateway конфигурация «kind: Gateway»
    caCertificates:
      path: /etc/service/federation-secret
      name: ca.crt
    privateKey:
      path: /etc/service/federation-secret
      name: cert.key
    serverCertificate:
      path: /etc/service/federation-secret
      name: cert.crt
  destinationRule:                                 # опционально, при значении параметра «use_default_address: 'false'» необходимо будет реализовать сертификаты для федеративного адреса «{{ if not (eq .Values.indexFederation "") }}{{ .Values.indexFederation }}-{{ end }}grpc-bootstrap-discovery.{{ if .Values.global.clusterName }}{{ .Values.global.clusterName }}{{ else }}{{ .Values.cluster }}{{ end }}» на egressgateway конфигурация «kind: DestinationRule»
    caCertificates:
      path: /etc/service/federation-secret
      name: ca.crt
    privateKey:
      path: /etc/service/federation-secret
      name: cert.key
    clientCertificate:
      path: /etc/service/federation-secret
      name: cert.crt

traffic_policy:                                    # настройки default-traffic-policy.yml, указаны значения по умолчанию
  loadBalancer:
    localityType: SYNAPSE
    localityLbSetting:
      enabled: true
    simple: ROUND_ROBIN
  outlierDetection:
    baseEjectionTime: 1m
    consecutive5xxErrors: 4
    interval: 1m
    maxEjectionPercent: 100
  retryPolicy:
    attempts: 3
    retryOn: 5xx
    retryRemoteLocalities: true
  connectionPool:
    tcp:
      connectTimeout: 1s

crd:                   
  install_only_crd: "false"                        # произвести установку CRD без приложений FSSM

registration_federation_member_list:               # настройка функционала по регистрации пользовательских namespace посредством CRD
   use: "false"                                    # активировать регистрацию посредством «kind: FederationMemberList»
   federation_id:                                  # уникальный идентификатор федерации, выбирается пользователем  
   close_federation: "false"                       # разрешить регистрацию в федерацию только администратору, через конфигурацию «kind: FederationMemberList», если значение «false», то будет разрешена регистрация посредством «kind: FederationMember» 
   use_default_label_selector: "true"              # использовать значение labelSelector по логике прошлых версий - {{ .Values.namespace }}-federation: true (поддержка обратной совместимости)
  add_namespaces:                                  # добавление списка namespace в федерацию 
    - namespace: user-1
  exclude_namespaces:                              # реализовать список исключения из федерации при установке namespace
    - namespace: user-3
  use_custom_label_selector:                       # реализация собственного labelSelector, при необходимости (при использовании необходимо выставить флаг use_default_label_selector: "false")
    matchExpressions:
      - key: synapse-federation
        operator: In
        values:
          - true

#tenants_federation:                               # блок для создания последующих тенантов, в рамках регистрации пользовательских namespace
#  - federation_id:                                # уникальный идентификатор федерации, выбирается пользователем
#    use_default_label_selector: "false"           # использовать значение labelSelector по логике прошлых версий - {{ .Values.namespace }}-federation: true (поддержка обратной совместимости)
#  add_namespaces:                                 # добавление списка namespace в федерацию
#    - namespace: user-1
#    - namespace: user-2
#  exclude_namespaces:                             # реализовать список исключения из федерации при установке namespace
#    - namespace: user-3
#    - namespace: user-4
#  use_custom_label_selector:                      # реализация собственного labelSelector при необходимости (при использовании необходимо выставить флаг use_default_label_selector: "false")
#    matchExpressions:
#      - key: synapse-federation
#        operator: In
#        values:
#          - true

sync:                                               
  enabled: 'true'                                  # включение синхронизации данных в KubeAPI server при работе с PostgreSQL server, позволяет организовать копии федеративных конфигураций в рамках кластеров, для возможности производить плавный переход на работу с KubeAPI server              
  syncKubeAPIPeriod: '10000'                       # период синхронизации федеративных данных в KubeAPI server
  updatesPeriod: '3000'                            # период синхронизации федеративных данных в PostgreSQL server для анализа добавления/изменения/удаления федеративных сервисов
  retryDelay: '5000'                               # периодичность опроса логина и пароля в рамках подключения к Pangolin (discovery)
  retryAttempts: '5'                               # количество повторных попыток опроса логина и пароля в рамках подключения к Pangolin (discovery)

workerControllerCount:
  ingress: '2'                                     # количество потоков при обработке «kind: ServiceExport», чем больше потоков, тем быстрее происходит обработка, но используется больше ресурсов в рамках работы
  egress: '2'                                      # количество потоков при обработке «kind: ServiceImport», чем больше потоков, тем быстрее происходит обработка, но используется больше ресурсов в рамках работы
  trafficPolicy: '2'                               # количество потоков при обработке «kind: ServiceTrafficPolicy», чем больше потоков, тем быстрее происходит обработка, но используется больше ресурсов в рамках работы

postgre_connect_parameters: stringtype=unspecified&prepareThreshold=0         # параметры подключения к postgreSQL
postgre_address: vm-psql-dev:5432                                             # адрес postgreSQL server (пример vm-syndicute-psql.sy.dev:5432)
postgre_schema: fssm_federation                                               # имя схемы
postgre_database: fssm_data                                                   # имя базы данных
postgre_egress_protocol: TCP                                                  # используемый протокол в рамках namesapce FSSM, конфигурации «kind: Gateway» на egressgateway
postgresql:
  - datasource_url: vm-psql-dev                                               # хост сервера postgre                  
    name: master                                                              # наименование (для идентификации сервера, может принимать любое значение)
    server_ip: '*.*.*.*'                                                        # IP–адрес postgreSQL server
    localPort: 7443                                                           # уникальный неиспользуемый порт для корректной маршрутизации внутри namespace
    port: 5432                                                                # порт postgreSQL server
    resolution: DNS

igeg:
  version:                                      # флаг устанавливается только в том случае, если версия Istio 1.6/1.17/1.19 и выше (пример заполнения '1.17') 

istio:
  ingress:
    dsr:
      spec:
        trafficPolicy:
          outlierDetection:
            baseEjectionTime: 1m                   # значение параметра baseEjectionTime в рамках «kind: DestinationRule» при синхронизации данных
            consecutive5xxErrors: 10               # значение параметра consecutive5xxErrors в рамках «kind: DestinationRule» при синхронизации данных
            interval: 1m                           # значение параметра interval в рамках «kind: DestinationRule» при синхронизации данных
            maxEjectionPercent: 20                 # значение параметра maxEjectionPercent в рамках «kind: DestinationRule» при синхронизации данных

discovery:
  replicas: 1                                      # количество Pod у компонента FederationDiscovery
  livenessProbe:                                # параметры livenessProbe контейнера FederationDiscovery
    failureThreshold: 30
    initialDelaySeconds: 30
    periodSeconds: 10
    successThreshold: 1
    timeoutSeconds: 5
  readinessProbe:                               # параметры readinessProbe контейнера FederationDiscovery
    failureThreshold: 30
    initialDelaySeconds: 30
    periodSeconds: 10
    successThreshold: 1
    timeoutSeconds: 5
  strategy_type: RollingUpdate                     # strategy type в рамках «kind: Deployment» контейнера FederationDiscovery (поддержка Recreate и RollingUpdate)
  strategy:
    rollingParams:
      maxSurge: 100%                               # установка параметра maxSurge в рамках «kind: Deployment»
      maxUnavailable: 25%                          # установка параметра maxUnavailable в рамках «kind: Deployment»
  podDisruptionBudget:
    apiVersion: policy/v1                          # apiVersion конфигурации podDisruptionBudget для приложения FederationDiscovery
    spec:
      minAvailable: 1                              # значение параметра minAvailable конфигурации podDisruptionBudget для приложения FederationDiscovery
  resources:                                    # ресурсы приложения FederationDiscovery
    limits:
      cpu: 1
      ephemeral_storage: 500Mi
      memory: 1000Mi
    requests:
      cpu: 1
      ephemeral_storage: 500Mi
      memory: 1000Mi
  svpx:                                         # ресурсы приложения SVPX (сервисный прокси)
    resources:
      limits:
        cpu: 100m
        memory: 200Mi
      requests:
        cpu: 100m
        memory: 200Mi
  fluent:
    kafkaBrokersList: kafka-tdev.sion:9093         # список брокеров Kafka   
    kafkaTopic: fssm                               # топик Kafka
    capabilities: "false"                          # флаг установки securityContext/capabilities/drop/ALL приложению fluent-bit
    resources:                                  # ресурсы приложения fluent-bit
      limits:
        cpu: 100m
        ephemeral_storage: 500Mi
        memory: 200Mi
      requests:
        cpu: 100m
        ephemeral_storage: 500Mi
        memory: 200Mi
  leases_type_on: 'false'                     # параметр включающий использование leases (Api Group: coordination.k8s.io), ВНИМАНИЕ! при значении true необходимо развернуть ролевую модель использования leases (get, list, watch, create, update, patch, delete)
 
controller:
  replicas: 1                                      # количество Pod у компонента FederationController
  discovery_host_alias: 'false'                    # добавление host alias в рамках FederationController для организации федеративного трафика
  configurationHashCodeEnable: 'false'             # включение режима подсчет контрольных сумм, в рамках которых после обработки федеративных конфигураций будет вестись подсчет, позволяет снизить нагрузку при рестарте FederationController
  livenessProbe:                                   # параметры livenessProbe контейнера FederationController
    failureThreshold: 30
    initialDelaySeconds: 60
    periodSeconds: 10
    successThreshold: 1
    timeoutSeconds: 5
  readinessProbe:                               # параметры livenessProbe контейнера FederationController
    failureThreshold: 30
    initialDelaySeconds: 60
    periodSeconds: 10
    successThreshold: 1
    timeoutSeconds: 5
  strategy_type: RollingUpdate                    # strategy type в рамках «kind: Deployment» контейнера FederationController (поддержка Recreate и RollingUpdate)
  strategy:
    rollingParams:
      maxSurge: 100%                              # установка параметра maxSurge в рамках «kind: Deployment»
      maxUnavailable: 25%                         # установка параметра maxUnavailable в рамках «kind: Deployment»
  headLessValidationEnable: "true"                # включение(true)/выключение(false) функциональности по валидации headless сервиса, более подробно можно ознакомиться в документе Руководство прикладного разработчика, раздел «Валидация пользовательского «kind: Service»
  podDisruptionBudget:
    apiVersion: policy/v1                         # apiVersion конфигурации podDisruptionBudget для приложения FederationController
    spec:
      minAvailable: 1                             # значение параметра minAvailable конфигурации podDisruptionBudget для приложения FederationController
  rate_limiter_config:                            # ограничение запросов в рамках работы с Kube API server
    service:                                      # ограничение запросов в рамках работы с Kube API server по конфигурациям «kind: Service»
      enabled: 'false'                            # активация ограничения
      capacity: 400                               # 
      duration: 60
      tokensGeneratedInPeriod: 500
    service_export:                               # ограничение запросов в рамках работы с Kube API server по конфигурациям «kind: ServiceExport»
      enabled: 'false'                            # активация ограничения
      capacity: 400                               # максимальное количество запросов, более подробно можно ознакомиться в документации по механики работы Rate Limited
      duration: 60                                # длительность периода (секунды)
      tokensGeneratedInPeriod: 500                # количество запросов (ограничивающих) которое пополняется за период (duration)
    service_import:                               # ограничение запросов в рамках работы с Kube API server по конфигурациям «kind: ServiceImport»
      enabled: 'false'                            # активация ограничения
      capacity: 400                               # максимальное количество запросов, более подробно можно ознакомиться в документации по механики работы Rate Limited
      duration: 60                                # длительность периода (секунды)
      tokensGeneratedInPeriod: 500                # количество запросов (ограничивающих) которое пополняется за период (duration)
    traffic_policy:                               # ограничение запросов в рамках работы с Kube API server по конфигурациям «kind: ServiceTrafficPolicy»
      enabled: 'false'                            # активация ограничения 
      capacity: 400                               # максимальное количество запросов, более подробно можно ознакомиться в документации по механики работы Rate Limited
      duration: 60                                # длительность периода (секунды)
      tokensGeneratedInPeriod: 500                # количество запросов (ограничивающих) которое пополняется за период (duration)
  resources:                                  # ресурсы приложения FederationController 
    limits:
      cpu: 1
      ephemeral_storage: 500Mi
      memory: 1000Mi
    requests:
      cpu: 1
      ephemeral_storage: 500Mi
      memory: 1000Mi
  svpx:                                       # ресурсы приложения SVPX (сервисный прокси)
    resources:
      limits:
        cpu: 100m
        memory: 200Mi
      requests:
        cpu: 100m
        memory: 200Mi
  fluent:
    capabilities: "false"                     # флаг установки securityContext/capabilities/drop/ALL приложению fluent-bit
    resources:                                # ресурсы приложения fluent-bit
      limits:
        cpu: 100m
        ephemeral_storage: 500Mi
        memory: 200Mi
      requests:
        cpu: 100m
        ephemeral_storage: 500Mi
        memory: 200Mi
  leases_type_on: 'false'                     # параметр включающий использование leases (Api Group: coordination.k8s.io), ВНИМАНИЕ! при значении true необходимо развернуть ролевую модель использования leases (get, list, watch, create, update, patch, delete)

fluent:
  install: 'false'                                  # флаг установки fluent-bit, для сбора логов и передачи их в рамках kafka сервера
  add_parser_timestamp: 'true'                      # добавление в секцию [PARSER] информацию о timestamp 
  buffer_chunk_size: 400k                           # конфигурирование fluent-bit, секция [INPUT]
  buffer_max_size: 6MB                              # конфигурирование fluent-bit, секция [INPUT]
  mem_buf_limit: 6MB                                # конфигурирование fluent-bit, секция [INPUT]

vault:
  kv: DEV/A/DEV/FSSM/KV                             # путь к секретам vault во внешнем хранилище
  host_vault: secman.solution                       # host сервера vault
  ip_host: '*.*.*.*'                                # IP-адрес сервера vault
  port: 8443                                        # порт сервера vault
  resolution: DNS                                   # resolution в рамках «kind: ServiceEntry» для адреса vault
  perms_secret_0400: 'false'                        # добавление в рамках каждого объекта поставляемого в рамках Vault perms равному 0400 (256)
  pre_populate_only: "true"                         # режим мутации контейнера vault, в рамках IGEG (true - без мутации, false - с мутацией контейнера)
  pki_engine:
    enabled: 'false'                                # флаг, указывающий на использование PKI engine в рамках хранения сертификатов (общий, при указании 'false' все сертификаты будут использоваться из KV version 1)
    ingress:                                        # группа сертификатов использующиеся для входящего трафика
      federation:                                   # группа параметров для сертификата по интеграции приложений FSSM
        pki_enabled: 'false'                        # локальный флаг использования PKI engine
        pki_path: PKI/issue/pki                     # частичный пусть к PKI engine путь формируется по структуре ({{ .Values.vault.secmanNamespace }}/{{ .Values.vault.pki_engine.ingress.federation.pki_path }}), также необходимо указывать метод запроса, например «issue» и наименование роли в рамках которой будет реализован сертификат
        common_name: federation.host                # параметр в рамках указывающий «common_name» выпускаемого сертификата
        data:                                       # группа параметров для возможности изменения параметров по корневому сертификату
          ca:
            name: ca_chain                          # имя корневого сертификата в рамках PKI engine, пример реализации по умолчанию «{{ .Data.ca_chain }}»
            range: 'false'                          # флаг использования «range» для реализации цепочки сертификатов ({{ range $k, $v := .Data.ca_chain }} {{- $v }} {{- end -}})
      bootstrap:                                    # группа параметров для сертификата приложений FSSM (при использовании режима bootstrap и реализация отдельных сертификатов для этого)
        pki_enabled: 'false'
        pki_path: PKI/issue/pki
        common_name: bootstrap.host
        data:
          ca:
            name: ca_chain
            range: 'false'
      webhook:                                      # группа параметров для сертификата по webhook взаимодействию (при использовании сертификатов из vault, также при выпуске такого рода сертификата необходимо убедиться, что caBundle секция, в рамках webhook configuration доверяют друг другу)
        pki_enabled: 'false'
        pki_path: PKI/issue/pki
        common_name: webhook.host                   # при выпуске сертификата необходимо придерживаться логике формирования «common_name» - $имя сервиса.$имя проекта.svc
    egress:                                         # группа сертификатов использующиеся для исходящего трафика
      federation:                                   # группа параметров для сертификата по интеграции приложений FSSM
        pki_enabled: 'false'
        pki_path: PKI/issue/pki
        common_name: federation.host
        data:
          ca:
            name: ca_chain
            range: 'false'
      bootstrap:                                    # группа параметров для сертификата приложений FSSM (при использовании режима bootstrap и реализация отдельных сертификатов для этого)
        pki_enabled: 'false'
        pki_path: PKI/issue/pki
        common_name: bootstrap.host
        data:
          ca:
            name: ca_chain
            range: 'false'
      kafka:                                       # группа параметров для сертификата по интеграции с Kafka (при использовании агента сбора логов)
        pki_enabled: 'false'
        pki_path: PKI/issue/pki
        common_name: kafka.host
        data:
          ca:
            name: ca_chain
            range: 'false'
      postgres:                                    # группа параметров для сертификата по интеграции с Postgres (при использовании Postgres для синхронизации федераций)
        pki_enabled: 'false'
        pki_path: PKI/issue/pki
        common_name: postgres.host
        data:
          ca:
            name: ca_chain
            range: 'false'
  resources:
    limits:
      cpu: 500m                                     # ресурсы limits/cpu приложения vault
      memory: 128Mi                                 # ресурсы limits/memory приложения vault
    requests:
      cpu: 250m                                     # ресурсы requests/cpu приложения vault
      memory: 64Mi                                  # ресурсы requests/memory приложения vault
  secmanNamespace: DEV                              # namespace vault во внешнем хранилище
  secmanRole: role-ga-secman-fssm                   # роль vault во внешнем хранилище с доступом на чтение секретов
  add_secret_webhook: 'false'                       # флаг добавления сертификата на admission webhook запрос в vault
  add_label_secret_webhook: ''                      # идентификатор кластера для использования одного хранилища ключей, при подключении к нему нескольких федераций с разных кластеров. ВНИМАНИЕ! Наименование секрета будет изменено на "webhook<значение этого параметра>" 
  auth_path_enabled: 'false'                        # флаг использования аннотации «vault.hashicorp.com/auth-path» в рамках доступа к хранилищу vault
  auth_path: synapse/path                           # значение аннотации «vault.hashicorp.com/auth-path» в рамках доступа к хранилищу vault 
  
kafkaPort: 9093                                    # внешний порт брокера
kafka_add_external_port_vs: 'true'                 # флаг конкретизации внешнего порта в конфигурации «kind: VirtualService»
kafka_se_install: 'true'                           # флаг публикации конфигурации «kind: ServiceEntry» на каждый брокер
kafka_resolution: DNS                              # значение resolution конфигурации «kind: ServiceEntry» на каждый брокер
kafka:                                             # list брокеров, заполняются в зависимости от количества брокеров
  - host: broker1.ru                               # хост брокера №1
    name: brk1                                     # краткое наименование брокера №1
    ip: '*.*.*.*'                                  # ip брокера №1
    egressPort: 19021                              # любой свободный и уникальный порт для брокера №1
  - host: broker2.ru                               # хост брокера №2
    name: brk2                                     # краткое наименование брокера №2
    ip: '*.*.*.*'                                  # ip брокера №2
    egressPort: 19022                              # любой свободный и уникальный порт для брокера №2

ott:
  serviceHosts: host1.ru:8080                      # адреса серверов ОТТ (параметр configMap OTT - OTT_SERVICE_HOSTS, более подробно описано в документации компонента ОТТ)
  readinessProbe:                                  # readinessProbe параметры ОТТ приложения
    failureThreshold: 30
    initialDelaySeconds: 1
    periodSeconds: 2
    successThreshold: 1
    timeoutSeconds: 1
  ottHTTPport: 8080                                # порт (параметр configMap OTT - OTT_HTTP_PORT, более подробно описано в документации компонента ОТТ)
  ott_client_mmt_action_attrid: ott_action         # параметр configMap OTT - OTT_CLIENT_MMT_ACTION_ATTRID, более подробно описано в документации компонента ОТТ
  ott_client_mmt_resource_attrid: ott_resources    # параметр configMap OTT - OTT_CLIENT_MMT_RESOURCE_ATTRID, более подробно описано в документации компонента ОТТ
  ott_application_attribute_id: ott_application    # параметр configMap OTT - OTT_APPLICATION_ATTRIBUTE_ID, более подробно описано в документации компонента ОТТ
  ott_service_url: https://stub-host:stub-port     # параметр configMap OTT - OTT_SERVICE_URL, более подробно описано в документации компонента ОТТ
  resources:
    limits:
      cpu: 300m                                    # ресурсы limits/cpu приложения OTT
      ephemeral_storage: 500Mi                     # ресурсы limits/ephemeral_storage приложения OTT
      memory: 500Mi                                # ресурсы limits/memory приложения OTT
    requests:
      cpu: 300m                                    # ресурсы requests/cpu приложения OTT
      ephemeral_storage: 500Mi                     # ресурсы requests/ephemeral_storage приложения OTT
      memory: 500Mi                                # ресурсы requests/memory приложения OTT

ingress:
  replicas: 1                                      # количество реплик IGEG (igressgateway)
#  ingw_service_name:                              # наименование сервиса ingressgateway для организации webhook взаимодействия с webhook server (по умолчанию ingressgateway-${имя проекта FSSM})
  readinessProbe:                                  # readinessProbe параметры IGEG (igressgateway)
    failureThreshold: 30
    initialDelaySeconds: 1
    periodSeconds: 2
    successThreshold: 1
    timeoutSeconds: 1
  resources:
    limits:
      cpu: 300m                                    # ресурсы limits/cpu приложения IGEG (igressgateway)
      ephemeral_storage: 500Mi                     # ресурсы limits/ephemeral_storage приложения IGEG (igressgateway)
      memory: 500Mi                                # ресурсы limits/memory приложения IGEG (igressgateway)
    requests:
      cpu: 300m                                    # ресурсы requests/cpu приложения IGEG (igressgateway)
      ephemeral_storage: 500Mi                     # ресурсы requests/ephemeral_storage приложения IGEG (igressgateway)
      memory: 500Mi                                # ресурсы requests/memory приложения IGEG (igressgateway)

egress:
  replicas: 1                                      # количество реплик IGEG (egressgateway)
  readinessProbe:                               # readinessProbe параметры (egressgateway)
    failureThreshold: 30
    initialDelaySeconds: 1
    periodSeconds: 2
    successThreshold: 1
    timeoutSeconds: 1
  resources:
    limits:
      cpu: 300m                                    # ресурсы limits/cpu приложения IGEG (egressgateway)
      ephemeral_storage: 500Mi                     # ресурсы limits/ephemeral_storage приложения IGEG (egressgateway)
      memory: 500Mi                                # ресурсы limits/memory приложения IGEG (egressgateway)
    requests:
      cpu: 300m                                    # ресурсы requests/cpu приложения IGEG (egressgateway)
      ephemeral_storage: 500Mi                     # ресурсы requests/ephemeral_storage приложения IGEG (egressgateway)
      memory: 500Mi                                # ресурсы requests/memory приложения IGEG (egressgateway)

tracing:                                           # настройка передачи трейсов приложения IGEG
   custom_tags: ''                                 # обогащение заголовками
   zipkin:                                         # адрес сервиса для сбора трейсов
      svc: synapse-tracer-svc                      # имя сервиса для сбора трейсов (в рамках кластера)
      port: 8788                                   # порт сервиса для сбора трейсов (в рамках кластера)
   sampling: 100                                   # процент передаваемых трейсов (0-100)
   maxPathTagLength: 256                           # ограничение в рамках размера трейса
   tlsSettings:                                    # настройки TLS при передаче трейсов
      caCertificates: "/var/run/secrets/istio/root-cert.pem"
      mode: SIMPLE

Изменения стендозависимых параметров в рамках релиза 5.2.1#

Чарт fssm-discovery.

Удаление параметра:

discovery_sync_kubeapi: 5000                       # время синхронизации сведений из postgreSQL в etcd кластера

# указанный параметр задается посредством параметризации секции sync.syncKubeAPIPeriod

Исключены параметры, при установке работы с KubeAPI по хранению сведений о федеративных сервисах (database.secret.username и database.secret.password они используются только при работе с PSQL хранилищем).

Настройка интеграции#

OTT#

Рекомендовано использовать ОТТ в рамках граничных прокси, как установить и настроить указанный компонент, можно ознакомиться в документации компонента «Platform V One-Time-Token». В случае ошибки установки OTT, компонент FSSM будет неработоспособен.

Для корректной и безопасной установки ОТТ к компоненту IGEG необходимо ознакомиться с документацией компонента IGEG, раздел «Авторизация».

Для успешного функционирования ОТТ необходимо реализовать конфигурацию «kind: EnvoyFilter», которая переводит все входящие и исходящие запросы из namespace, через ОТТ.

Конфигурация для egressgateway:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: sbt-authorization
spec:
  configPatches:
    - applyTo: HTTP_FILTER
      match:
        context: GATEWAY
        listener:
          filterChain:
            filter:
              name: envoy.http_connection_manager
          portNumber: 6443
      patch:
        operation: INSERT_BEFORE
        value:
          config:
            authorize_only_request: false # Флаг того, что авторизуются как HTTP Request, так и HTTP Response
            failure_mode_allow: false # Запрещает трафик при недоступности сервера авторизации
            grpc_service:
              google_grpc:
                stat_prefix: sbt_authz
                target_uri: 'unix:/mnt/ott-uds-socket/ott.socket'
              timeout: 10s
            sidecar_role: EGRESS
          name: envoy.sbt_authz
  workloadSelector:
    labels:
      app: ${EGRESS_SELECTOR}

Конфигурация для ingressgateway:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: sbt-authorization-ingress
spec:
  configPatches:
    - applyTo: HTTP_FILTER
      match:
        context: GATEWAY
        listener:
          filterChain:
            filter:
              name: envoy.http_connection_manager
          portNumber: 5443
      patch:
        operation: INSERT_BEFORE
        value:
          config:
            authorize_only_request: false # Флаг того, что авторизуются как HTTP Request, так и HTTP Response
            failure_mode_allow: false # Запрещает трафик при недоступности сервера авторизации
            grpc_service:
              google_grpc:
                stat_prefix: sbt_authz
                target_uri: 'unix:/mnt/ott-uds-socket/ott.socket'
              timeout: 10s
            sidecar_role: INGRESS
          name: envoy.sbt_authz
  workloadSelector:
    labels:
      app: ${INGRESS_SELECTOR}

Аутентификация происходит с использованием ACL, необходимо реализовать доступ только к host компонента FederationDiscovery.

fluent-bit#

Рекомендуется реализовать контейнер «fluent-bit» в рамках Pod, где реализованы элементы компонента FSSM.

В рамках указанного взаимодействия настраивается передача лого в рамках используемой БД.

Пример настройки компонента «fluent-bit»

kind: ConfigMap
apiVersion: v1
metadata:
  name: fluent-bit
data:
  fluent-bit.conf: |-
    [SERVICE]
      Flush        1
      Daemon       Off
      Log_Level    Debug
      Parsers_File /fluent-bit/etc/parsers.conf

    [INPUT]
      Name   tail
      Tag file.tail
      Path   /opt/synapse/logs/*.log
      Parser        custom
      Buffer_Chunk_Size 400k
      Buffer_Max_Size 6MB
      Mem_Buf_Limit 6MB

    [OUTPUT]
      Name stdout

    [OUTPUT]
      Name kafka
      Match file.tail
      Brokers ${BROKERS}
      Topics ${TOPIC}
  parsers.conf: |-
    [PARSER]
     Name        custom
     Format      json

Формат сообщения предоставлен в документе «Руководство по системному администрированию», раздел «Запись логов при добавлении служебных конфигураций» и «Запись логов при добавлении пользовательских конфигураций».

В рамках конфигурации «fluent-bit» также необходимо реализовать механизмы шифрования данных по «mTLS 1.2 и выше» на граничном прокси (egressgateway).

Для взаимной аутентификации и шифрования трафика должны использоваться сертификаты x509.

Также рекомендуем ознакомиться с реализацией сетевых взаимодействий, которые описаны в рамках документа «Руководство безопасности», раздел «Сетевая безопасность».

Подключение пользовательских проектов#

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

  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» которые передаются в рамках дистрибутива.

Рекомендуем организацию бэкапа базы данных при обновлении, в случае использования серверной части PostgreSQL.

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

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

Откат#

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

Рекомендуем организацию бэкапа базы данных при откате в случае использования серверной части PostgreSQL.

Поддерживается откат версии компонента без потери данных до версии FSSM 3.11. Если откат производится на более позднюю версию, необходимо удалить все данные в рамках таблиц и запустить приложения.

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

  • Через 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»

Все поды шлюза запущены

Найти Deployment, перейти на вкладку «Pods», проверить, что статус всех подов — Running

Отсутствие ошибок в логах контейнеров

Для каждого Pod проверить на вкладке логов, что в логе контейнеров Pod отсутствуют ошибки

Успешная обработка пользовательских конфигураций у подключенного проекта в рамках федерации

Реализовать пользовательские конфигурации «kind: ServiceExport»/«kind: ServiceImport»/«kind: ServiceTrafficPolicy»

Конфигурации успешно применились, реализованы конфигурации в рамках маршрутизации по федеративному FQDN

Убедиться, что все сертификаты загружены и компонент работает корректно

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

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

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

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

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

Убедиться, что в случае использования Hashicorp Vault, компонент настроен корректно, при некоректной установке Hashicorp Vault компонент KBLT неработоспособен

Проверить работоспособность Hashicorp Vault

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

Убедиться, что в случае использования LOGA, компонент настроен корректно (убедиться, что логи успешно сохраняются в хранилище)

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

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

Убедиться, что в случае использования Prometheus, компонент настроен корректно (убедиться, что метрики успешно собираются в хранилище)

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

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