# Архитектура решения

![kuber-schema](img/Global-k8s.png)

**gs-ctk** разворачивается в отдельном пространстве имен Kubernetes при помощи Helm-чарта и вспомогательной утилиты **nscli** c **jump-хоста** и состоит из пяти компонентов:

1. Контроллера пространства имен **nsctl**
2. Подов с серверами приложений: эксклюзивного (**global-server-excl**) для задач обслуживания, и реплицируемых (**global-server-share**) для масштабирования и отказоустойчивости
3. Балансировщика нагрузки **HAProxy**
4. Стек мониторинга с доступом через систему визуализации данных **Grafana**
5. Вспомогательных опциональных служб, таких как [**RabbitMQ**](./550_rabbitmq.md) и [**JGroups GossipRouter**](./560_jgroups.md)

Данные хранятся в [базе данных](#база-данных) и на [файловом хранилище](#хранение-файлов). Конфигурация gs-ctk хранится в виде ресурсов Kubernetes.

## Дистрибутив

Дистрибутив *gs-ctk* представляет собой:

- набор образов контейнеров:
  - контроллер пространства имен *gs/nsctl*
  - контейнер-болванка со средой для сервера приложений, планировщика задач и GossipRouter *gs/globalserver*
  - вспомогательный (sidecar) контейнер для сбора телеметрии с сервера приложений *gs/systemagent*
  - балансировщик нагрузки *gs/haproxy*
  - вспомогательный (sidecar) контейнер для сбора телеметрии с балансировщика нагрузки *gs/haproxyagent*
  - стек внутреннего мониторинга *gs/grafana*
  - встроенный брокер сообщений *gs/rabbitmq*
- консольную утилиту для работы с кластером с jump-хоста - *nscli*

Контейнеры и утилиту можно скачать с наших репозиториев, однако доступ к ним ограничен. Узнавайте подробнее у контактного лица.

## Режим ссылок на образы (Helm)

При установке Helm-чарта способ формирования ссылок на образы задается в `values.yaml` параметром `imageMode`:

- `tag` - совместимый режим, образа указываются по тегу (`:<tag>`).
- `digestAuto` - digest рабочих образов берутся из lock-файла, встроенного в образ `nsctl` при release-сборке.
- `digestManual` - digest указываются вручную через `imageDigests`.

Параметр `imageDigests` задается списком, например:

```yaml
imageMode: digestManual  # варианты: tag | digestAuto | digestManual
imageDigests:
  - image: nsctl
    digest: sha256:...
  - image: globalserver
    digest: sha256:...
```

В режиме `digestAuto` значение для `image=nsctl` можно задать в `imageDigests` опционально.

Для подготовки такого релиза используется отдельная команда:

```bash
DEBIAN_MIRROR=https://mirror.example/debian \
DEBIAN_SECURITY_MIRROR=https://mirror.example/debian-security \
./builder/image.sh release --push_to <registry>
```

Она собирает рабочие образы, публикует их, сохраняет digest в lock-файл и только после этого собирает `nsctl` со встроенным списком digest.

## База данных

gs-ctk не разворачивает систему управления баз данных. Вам необходимо самостоятельно развернуть СУБД PostgreSQL с соответствующими требованиями к отказоусточивости. Если вы ищете инструмент автоматического развертывания, посмотрите [Patroni](https://patroni.readthedocs.io/en/latest/).

Рекомендуется использовать систему синхронного или асинхронного реплицирования с автоматическим переключением главной ноды.

```{note}
Синхронная репликация требуется в случае необходимости гарантировать отсутствие потерь выполненных транзакций при сбоях
```

## Хранение файлов

gs-ctk требует для своей работы несколько файловых хранилищ:

- *системное*, для хранения комплектов приложений и комплектов групп. Указывается для всего gs-ctk при установке.
- *прикладное*, для хранения прикрепленных файлов. Указывается [для группы ресурсов](./040_resgroups.md#конфигурационные-значения-values-группы-ресурсов).

```{note}
Помимо указанных томов, можно примонтировать и другие (пока только NFS). Команды для управления точками монтирования смотрите в справке по [nsctl/resgroup](appendix/nsctl/resgroup.md).
```

*На данный момент поддерживаются только NFS-хранилища.*

## Алгоритм развертывания

```{tip}
Подробнее о развертывании читайте в [Руководстве системного администратора](https://help.globalerp.ru/books/G3SysAdminDoc/SNAPSHOT/html/040_global-k8s/020_install.html).
```
