Перейти к основному содержанию
`Ctrl`+`K`

# Неуправляемый режим

Утилита nscli позволяет развернуть кластер в неуправляемом режиме. Так вместо создания пространства имен и развертывания управляющего пода nsctl, nscli создаст уже готовый пакет, описывающий все группы и книги ресурсов, который затем уже можно развернуть на кластере при помощи kubectl.

Мы рекомендуем пользоваться управляемым режимом, но вам может быть необходимо работать с кластером Kubernetes напрямую с минимальным задействованием утилит Global.

## Сравнение управляемого и неуправляемого режима

Критерий | Управляемый режим | Неуправляемый режим
--- | --- | ---
Степень автоматизации | Все основные задачи, необходимые для развертывания и поддержки Global ERP в кластере, автоматизированны | Автоматизировано лишь создание ресурсов, описывающих контейнеры и конфигурацию решения
Сложность администрирования | Работа с нативными средствами K8s сведена к минимуму, используются удобные обертки | Для использования требуется глубокое понимание K8s.
Обновление | Есть налаженные команды обновления решения и работы с сетевыми хранилищами | Утилита в неуправляемом режиме не обеспечивает доставки комплекта приложений, как и обновления БД
Вероятность ошибок | Средства диагностики и другие предохранители сопровождают пользователю во время пользования утилитой, что уменьшает количество ошибок и упрощает их отладку | Предохранители действуют только во время работы с конфигурационными файлами. Встроенных средств диагностики меньше, чем при управляемом режиме

## Развертывание в неуправляемом режиме

Инструкция дана для:

- рабочего кластера Kubernetes из одной control-plane ноды (10.0.1.1) и трех рабочих нод с 6ГБ ОЗУ и установленным дистрибутивом Debian;

- двух NFS-хранилищ 10.0.2.1 с точками монтирования `/nfs/sys` и `/nfs/app`;

- PostgreSQL-сервера по адресу 10.0.3.1 с подготовленной БД `global`;

- jump-хоста с доступом к Kubernetes.

Совет

Доступ к кластеру для хоста, на котором будут генерироваться ресурсы K8s при помощи nscli, необязателен.

1. Установите утилиту nscli в соответствии с инструкцией.

2. Подготовьте папку с комплектом приложений (appkit). Поместите её на машину с утилитой, например, по пути `~/nscli/workspace/appkit`.

3. Подготовьте ресурсы секретов и роли для мониторинга.

4. Выполните в папке nscli, чтобы получить (изменить) конфигурацию неуправляемого режима:

       ./namespace.sh configure_unmanaged --config workspace/config.yaml

   В ходе настройки укажите названия, характеристики и настройки пространства имен, групп и книг ресурсов.

   Утилита попросит у вас путь к папке с комплектом приложений (appkit), после ввода утилита упакует комплект, пересчитает и поместит в папке его хеш-суммы, после чего сохранит их в конфигурационном файле. Чтобы переупаковать комплект и пересчитать хеш-функции в неинтерактивном режиме используйте команду `./appkit.sh refresh_hash --source`.

   Совет

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

   Пример:

       k8sadmin@k8s-terminal02:~/nscli$ ./namespace.sh configure_unmanaged --config workspace/config.yaml
       Введите имя рабочего пространства:gs-cluster-k8s
       Введите адрес докер регистра:dockerhub.global-system.ru
       Введите пользователя для авторизации докера:userk8s
       Введите пароль для авторизации докера:**********
       Введите пароль для авторизации докера:**********
       Выберите тип репозитория:nfs
       Необходимо задать параметры для Network File System
       Введите имя сервера:10.0.2.1
       Введите путь:/nfs/sys
       Добавить группу gs-cluster-1?[да,нет]:да
       Введите название группы ресурсов 1 (или оставьте пустым, чтобы приступить к настройке групп):gs-cluster-1
       Введите название группы ресурсов 2 (или оставьте пустым, чтобы приступить к настройке групп):
       Инициализация значений для группы ресурсов gs-cluster-1
       Введите timezone подов:Europe/Moscow
       Введите url базы данных:jdbc:postgresql://10.0.3.1:5432/global
       Введите alias базы данных:global
       Введите имя секрета для пользователя БД:db-user-secret
       Введите тип прикладного хранилища:nfs
       Введите адрес сервера(server):10.0.0.2
       Введите путь(path):/nfs/app
       Хотите загрузить метаданные appkit из папки?[да,нет]:да
       Укажите путь к папке с appkit:workspace/appkit
       Метаданные appkit загружены
       Укажите хеш globalserver:9828f2ebb9979e9e9765e8fe7591557bd15d0c3a
       Укажите хеш applib:56451d21e04b84fad0a87a3867d7bdbe91f464f5
       Укажите хеш profile:fb2add3bb36ebd219da754352ccdf0c78143e2fc
       Укажите путь к папке с appkit на системном хранилище (NFS):appkit/v1
       Внимание! В неуправлемом режиме вы обязаны сами поместить appkit на системное хранилище по указанному пути
       Укажите состояние appkit:started
       Введите путь к папке с комплектом группы (groupkit) на системном хранилище (NFS); оставьте пустым, если он не требуется:
       Введите название книги ресурсов 1 в группе gs-cluster-1 (или оставьте пустым, чтобы закончить настройку книг ресурсов):global-scheduler
       Введите класс книги ресурсов global-scheduler в группе gs-cluster-1:global_scheduler
       Добавить книгу ресурсов global-scheduler?[да,нет]:да
       Настройка книги ресурсов global-scheduler...
       Отслеживать метрики:true
       Дополнительно отсылать метрики во внешнюю систему:false
       Введите максимальный размер(java -Xmx) для globalscheduler:800M
       Введите запрос CPU для globalscheduler:1
       Введите запрос MEMORY для globalscheduler:1G
       Введите лимиты CPU для globalscheduler:1
       Введите лимиты MEMORY для globalscheduler:1G
       Введите запрос CPU для systemagent:1
       Введите запрос MEMORY для systemagent:250M
       Введите лимиты CPU для systemagent:1
       Введите лимиты MEMORY для systemagent:500M
       Введите адрес доступа к prometheus:gs-cluster-1-grafana-internal:9090
       Введите адрес доступа к loki:gs-cluster-1-grafana-internal:3100
       Введите адрес доступа к tempo:gs-cluster-1-grafana-internal:3201
       Введите имя секрета с токеном планировщика:scheduler-token-secret
       Введите название книги ресурсов 2 в группе gs-cluster-1 (или оставьте пустым, чтобы закончить настройку книг ресурсов):global-server-excl
       Введите класс книги ресурсов global-server-excl в группе gs-cluster-1:global_server_excl
       Отслеживать метрики:true
       Дополнительно отсылать метрики во внешнюю систему:false
       Введите максимальный размер(java -Xmx) для globalserver:3500M
       Введите запрос CPU для globalserver:2
       Введите запрос MEMORY для globalserver:4G
       Введите лимиты CPU для globalserver:2
       Введите лимиты MEMORY для globalserver:4G
       Введите запрос CPU для systemagent:1
       Введите запрос MEMORY для systemagent:250M
       Введите лимиты CPU для systemagent:1
       Введите лимиты MEMORY для systemagent:500M
       Введите адрес доступа к prometheus:gs-cluster-1-grafana-internal:9090
       Введите адрес доступа к loki:gs-cluster-1-grafana-internal:3100
       Введите адрес доступа к tempo:gs-cluster-1-grafana-internal:3201
       Введите внешний ip(external_ip):
       Введите имя секрета для администратора:gs-admin-auth
       Введите тип секрета для администратора:kubernetes.io/basic-auth
       Введите название книги ресурсов 3 в группе gs-cluster-1 (или оставьте пустым, чтобы закончить настройку книг ресурсов):global-server-share
       Введите класс книги ресурсов global-server-share в группе gs-cluster-1:global_server_share
       Отслеживать метрики:true
       Дополнительно отсылать метрики во внешнюю систему:false
       Введите максимальный размер(java -Xmx) для globalserver:3500M
       Введите запрос CPU для globalserver:2
       Введите запрос MEMORY для globalserver:4G
       Введите лимиты CPU для globalserver:2
       Введите лимиты MEMORY для globalserver:4G
       Введите запрос CPU для systemagent:1
       Введите запрос MEMORY для systemagent:250M
       Введите лимиты CPU для systemagent:1
       Введите лимиты MEMORY для systemagent:500M
       Введите количество экземпляров:2
       Введите адрес доступа к prometheus:gs-cluster-1-grafana-internal:9090
       Введите адрес доступа к loki:gs-cluster-1-grafana-internal:3100
       Введите адрес доступа к tempo:gs-cluster-1-grafana-internal:3201
       Введите имя секрета для администратора:gs-admin-auth
       Введите тип секрета для администратора:kubernetes.io/basic-auth
       Введите название книги ресурсов 4 в группе gs-cluster-1 (или оставьте пустым, чтобы закончить настройку книг ресурсов):grafana
       Введите класс книги ресурсов grafana в группе gs-cluster-1:grafana
       Настройка книги ресурсов grafana...
       Введите запрос CPU для grafana:1
       Введите запрос MEMORY для grafana:500M
       Введите лимиты CPU для grafana:2
       Введите лимиты MEMORY для grafana:1Gi
       Введите внешний ip(external_ip):10.0.1.1
       Введите класс хранилища:local-storage
       Введите размер хранилища:1Gi
       Введите имя системного пользователя с правами на доступ к метрикам cAdvisor:prometheus-cadvisor
       Введите имя секрета с аккаунтом администратора Grafana:grafana-admin
       Введите название книги ресурсов 5 в группе gs-cluster-1 (или оставьте пустым, чтобы закончить настройку книг ресурсов):haproxy
       Введите класс книги ресурсов haproxy в группе gs-cluster-1:haproxy
       Настройка книги ресурсов haproxy...
       Введите запрос CPU для haproxy:1
       Введите запрос MEMORY для haproxy:500M
       Введите лимиты CPU для haproxy:2
       Введите лимиты MEMORY для haproxy:1G
       Введите внешний ip(external_ip):10.0.1.1
       Введите внешний порт(external_port):8081
       Введите имя секрета basic-auth для авторизации статистики:secret-haproxy-auth
       Введите имя tls секрета для доступа по https:
       Добавить книгу ресурсов rabbitmq?[да,нет]:да
       Введите название книги ресурсов 6 в группе gs-cluster-1 (или оставьте пустым, чтобы закончить настройку книг ресурсов):rabbitmq
       Введите класс книги ресурсов rabbitmq в группе gs-cluster-1:rabbitmq
       Настройка книги ресурсов rabbitmq...
       Введите запрос CPU для rabbitmq:1
       Введите запрос MEMORY для rabbitmq:2Gi
       Введите лимиты CPU для rabbitmq:2
       Введите лимиты MEMORY для rabbitmq:4Gi
       Введите название секрета для доступа к RabbitMQ:rabbitmq-global
       Введите название секрета для доступа к консоли RabbitMQ:rabbitmq-admin
       Введите название создаваемого виртуального хоста RabbitMQ:globalrabbitmq
       Введите внешний ip(external_ip):10.0.1.1
       Введите внешний порт:15672
       Введите название книги ресурсов 7 в группе gs-cluster-1 (или оставьте пустым, чтобы закончить настройку книг ресурсов):
       Подключить RabbitMQ?[да,нет]:да
       Введите адрес RabbitMQ:gs-cluster-1-rabbitmq-internal.gs-cluster-k8s.svc.cluster.local
       Введите порт RabbitMQ:5672
       Введите виртуальный хост RabbitMQ:globalrabbitmq
       Введите секрет RabbitMQ:rabbitmq-global

5. Поместите упакованный комплект приложений (находится по тому же пути `~/nscli/workspace/appkit`) на системное (NFS-)хранилище, по указанному на предыдущем этапе пути (в нашем случае `/nfs/sys/appkit/v1/`).

6. Создайте ресурсы с пространством имен, группами и книгами:

       ./namespace.sh create_unmanaged_namespace --config workspace/config.yaml --namespace-deploy workspace/namespace.yaml # пространство имен
       ./namespace.sh create_unmanaged_resources --config workspace/config.yaml --resources workspace/resources.yaml # группы и книги ресурсов

7. Последовательно примените ресурс пространства имен, секреты, роли и, наконец, группы и книги ресусров:

       kubectl apply -f workspace/namespace.yaml
       # kubectl apply -f secrets.yaml
       # kubectl apply -f roles.yaml
       kubectl apply -f workspace/resources.yaml

8. Проверьте, что кластер исправно работает:

   - просмотрите список развернутых подов при помощи `kubectl get -A pods` на наличие созданных ресурсов и проверьте, что они работают;

   - попробуйте подключиться к веб-интерфейсу через браузер по указанному для HAProxy адресу.

   В случае неисправностей проанализируйте логи и метрики при помощи Grafana.

   Совет

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

Внимание

Вы можете делать правки в конфигурации, а затем генерировать и применять новые ресурсы с этими правками. Однако обратите внимание, что в неуправляемом режиме при использовании kubectl удаление уже развернутых ресурсов при помощи yaml-манифеста почти невозможно. Следовательно, такие действия, как выключение Ingress в конфигурации (что требует удаление ресурса типа Ingress в Kubernetes), не будут отображены на кластере при применении новых ресурсов. Поэтому после получения верной конфигурации рекомендуется удалить пространство имен и применить ресурсы снова.

## Шифрование настроек учетной записи от реестра образов Docker

Поскольку реквизиты от реестра образов - это чувствительная информация, она хранится в конфигурации в зашифрованном виде. Следовательно, чтобы работать с ними нужен мастер-ключ, хранящийся по пути `~/.gs-ctk.priv`, и настройки шифрователя по пути `(~/nscli/)workspace/cryptor_state.json`.

Обратите внимание, что мастер-ключ не требуется для работы с группами и книгами ресурсов. Вы можете сказать утилите не расшифровывать реквизиты докер при помощи параметра `--no-cryptor`.

    ./namespace.sh configure_unmanaged  --no-cryptor --config cfg.yaml
    ./namespace.sh create_unmanaged_resources --no-cryptor --config cfg.yaml --resources m.yaml
    ./namespace.sh create_unmanaged_namespace --config cfg.yaml --namespace-deploy ns.yaml # невозможно сформировать пространство имен без правильного мастер-ключа

## Перенос конфигурации

В последних версиях утилитах, экспорт/импорт конфигурации управляемого режима полностью совместим с конфигурацией неуправляемого режима.

Чтобы перенести конфигурацию, выполните:

    ./configmgr.sh export --namespace gs-cluster-1 --file workspace/config.yaml
    # конфигурация gs-cluster-1 сохранена в файл workspace/config.yaml

    ./namespace.sh configure_unmanaged --config workspace/config.yaml
    # укажите настройки реестра образов и внесите другие необходимые изменения, например, поменяйте название пространства имен

Теперь вы можете использовать `(~/nscli/)workspace/config.yaml`, как конфигурацию неуправляемого режима.

## Обновление комплекта приложений

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

1. Поместите новый комплект приложений в папку `(~/nscli/)workspace/appkit`.

2. Переведите комплект приложений в состояние `stopped`. Для этого, измените в конфиге, который вы получили при помощи команды `./namespace.sh configure_unmanaged` (в нашем примере `(~/nscli/)workspace/config.yaml`) значение состояния (`spec.appkit.state`) у необходимой группы ресурсов на указанное.

       config_version: 1
       resgroups:
        - name: gs-cluster-1
          spec:
             appkit:
                path: appkit/v1
                state: stopped
                applib_sha1: 56451d21e04b84fad0a87a3867d7bdbe91f464f5
                ...
             values:
                ...

   Создайте и примените новые ресурсы:

       ./namespace.sh create_unmanaged_resources --config workspace/config.yaml --resources workspace/resources.yaml
       kubectl apply -f workspace/resources.yaml

3. Запустите редактор конфигурации:

       ./namespace.sh configure_unmanaged --config workspace/config.yaml

   Обновите хеши комплекта приложений и установите ему состояние `drained`, когда пользователи не подключается, но сервер приложений работает.

   Совет

   Чтобы утилита сама подсчитала хеши, укажите в поле «Хотите загрузить метаданные appkit из папки?» значение «да», затем укажите папку с новым копмлектом приложений `(~/nscli/)workspace/config.yaml`.

       k8sadmin@k8s-terminal02:~/nscli$ ./namespace.sh configure_unmanaged --config workspace/config.yaml
       ...
       Хотите загрузить метаданные appkit из папки?[да,нет]:да
       Укажите путь к папке с appkit:workspace/appkit
       Метаданные appkit загружены
       Укажите хеш globalserver:de014bfd3604100ea19b4b5a6104e789fe136692
       Укажите хеш applib:ca4118be45efc4509e80f9cb97279399d697ca01
       Укажите хеш profile:18ddc5f7762ae21b3789692f304b4a4e35c8f115
       Укажите путь к папке с appkit на системном хранилище (NFS):appkit/v2
       Внимание! В неуправлемом режиме вы обязаны сами поместить appkit на системное хранилище по указанному пути
       Укажите состояние appkit:drained
       ...

   Совет

   Обратите внимание, что новый appkit хранится по пути `appkit/v2`, а не `appkit/v1`.

4. Скопируйте новый комплект приложений с хешами (`workspace/appkit`) на системное NFS-хранилище по указанному пути (`appkit/v2`).

5. Примените новую конфигурацию.

       ./namespace.sh create_unmanaged_resources --config workspace/config.yaml --resources workspace/resources.yaml
       kubectl apply -f workspace/resources.yaml

6. Обновите базу данных. Для этого подключитесь к поду с эксклюзивным экземпляром сервера приложений (global-server-excl) и выполните на нем команду:

       ./migrator.sh upgrade

   Совет

   Вы также можете воспользоваться командой `./invoke.sh` в составе nscli, если у утилиты есть доступ к кластеру.

          ./invoke.sh --namespace [namespace] --app [resgroup]-[resbook] --cmd './migrator.sh upgrade'

   , где [namespace] - пространство имен, [resgroup] - группа ресурсов, [resbook] - книга ресурсов класса global-server-excl

   Проверьте, что вывод генератора таблиц не сообщает об ошибках.

7. Переведите новый комплект приложений в состояние `started` аналогично шагу 2.

Обновление должно быть завершено, а сервер приложений должен принимать пользователей.

## Обновление на новую версию gs-ctk

Обновление до новой версии gs-ctk не отличается от развертывания в первый раз за тем исключением, что начинается оно с редактирования уже имеющегося у вас конфигурационного файла. Ниже мы рассмотрим самый простой вариант обновлением лишь с использованием nscli и kubectl.

Совет

При необходимости адаптируйте этот вариант обновления согласно вашим требованиям по развертыванию. Читайте подробнее в документации Kubernetes по поводу существующих средств управления ресурсами и обновления контейнеров.

1. Запустите редактор конфигурации и внесите нужные изменения в уже имеющийся конфигурационный файл:

       ./namespace.sh configure_unmanaged workspace/config.yaml

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

2. Удалите пространство имен в Kubernetes:

       kubectl delete namespace gs-cluster-k8s

   Внимание

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

   Совет

   Если вы не можете удалить пространство имен (например, из-за отсутствия прав), но у вас есть yaml-манифест с развернутой версией ресурсов Kubernetes, вы можете использовать команду `kubectl delete -f` для удаления ресурсов. Тогда вам не придется удалять пространство имен, секреты и роли при обновлении.

          kubectl delete -f workspace/resources.yaml

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

3. Сгенерируйте ресурсы заново:

       ./namespace.sh create_unmanaged_namespace --config workspace/config.yaml --namespace-deploy workspace/namespace.yaml
       ./namespace.sh create_unmanaged_resources --config workspace/config.yaml --resources workspace/resources.yaml

   И примените их:

       kubectl apply -f workspace/namespace.yaml
       # kubectl apply -f secrets.yaml
       # kubectl apply -f roles.yaml
       kubectl apply -f workspace/resources.yaml