# Неуправляемый режим Утилита nscli позволяет развернуть кластер в неуправляемом режиме. Так вместо создания пространства имен и развертывания управляющего пода nsctl, nscli создаст уже готовый пакет, описывающий все группы и книги ресурсов, который затем уже можно развернуть на кластере при помощи kubectl. Мы рекомендуем пользоваться [управляемым режимом](./020_install.md), но вам может быть необходимо работать с кластером 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 с [подготовленной](../020_install-postgres/010_install_postgres.md) БД `global`; - jump-хоста с доступом к Kubernetes. ```{tip} Доступ к кластеру для хоста, на котором будут генерироваться ресурсы K8s при помощи nscli, необязателен. ``` 1. Установите утилиту nscli в соответствии с [инструкцией](./020_install.md#установка-утилиты-nscli). 2. Подготовьте папку с [комплектом приложений (appkit)](./020_install.md#подготовка-комплекта-приложений-appkit). Поместите её на машину с утилитой, например, по пути `~/nscli/workspace/appkit`. 3. Подготовьте [ресурсы секретов](./020_install.md#создание-секретов) и [роли для мониторинга](./020_install.md#сервис-аккаунт-для-получения-метрик-cadvisor). 4. Выполните в папке nscli, чтобы получить (изменить) конфигурацию неуправляемого режима: ```bash ./namespace.sh configure_unmanaged --config workspace/config.yaml ``` В ходе настройки укажите названия, характеристики и настройки пространства имен, групп и книг ресурсов. Утилита попросит у вас путь к папке с комплектом приложений (appkit), после ввода утилита упакует комплект, пересчитает и поместит в папке его хеш-суммы, после чего сохранит их в конфигурационном файле. Чтобы переупаковать комплект и пересчитать хеш-функции в неинтерактивном режиме используйте команду `./appkit.sh refresh_hash --source`. ```{tip} В некоторых полях, например, при выборе класса книги ресурсов, можно использовать стрелочки "вверх"-"вниз" для выбора из часто встречаемых вариантов. ``` Пример: ```text 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. Создайте ресурсы с пространством имен, группами и книгами: ```bash ./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. Последовательно примените ресурс пространства имен, секреты, роли и, наконец, группы и книги ресусров: ```bash 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. ```{tip} Поды автоматически перезапускаются при критических ошибках, что мешает диагностике неисправностей. Чтобы остановить перезапуск включите [режим отладки](./030_Debug.md). ``` ```{attention} Вы можете делать правки в конфигурации, а затем генерировать и применять новые ресурсы с этими правками. Однако обратите внимание, что в неуправляемом режиме при использовании kubectl удаление уже развернутых ресурсов при помощи yaml-манифеста почти невозможно. Следовательно, такие действия, как выключение Ingress в конфигурации (что требует удаление ресурса типа Ingress в Kubernetes), не будут отображены на кластере при применении новых ресурсов. Поэтому после получения верной конфигурации рекомендуется удалить пространство имен и применить ресурсы снова. ``` ## Шифрование настроек учетной записи от реестра образов Docker Поскольку реквизиты от реестра образов - это чувствительная информация, она хранится в конфигурации в зашифрованном виде. Следовательно, чтобы работать с ними нужен мастер-ключ, хранящийся по пути `~/.gs-ctk.priv`, и настройки шифрователя по пути `(~/nscli/)workspace/cryptor_state.json`. Обратите внимание, что мастер-ключ не требуется для работы с группами и книгами ресурсов. Вы можете сказать утилите не расшифровывать реквизиты докер при помощи параметра `--no-cryptor`. ```bash ./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 # невозможно сформировать пространство имен без правильного мастер-ключа ``` ## Перенос конфигурации В последних версиях утилитах, [экспорт/импорт конфигурации](./050_restore.md) управляемого режима полностью совместим с конфигурацией неуправляемого режима. Чтобы перенести конфигурацию, выполните: ```bash ./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`) у необходимой группы ресурсов на указанное. ```yaml config_version: 1 resgroups: - name: gs-cluster-1 spec: appkit: path: appkit/v1 state: stopped applib_sha1: 56451d21e04b84fad0a87a3867d7bdbe91f464f5 ... values: ... ``` Создайте и примените новые ресурсы: ```bash ./namespace.sh create_unmanaged_resources --config workspace/config.yaml --resources workspace/resources.yaml kubectl apply -f workspace/resources.yaml ``` 3. Запустите редактор конфигурации: ```bash ./namespace.sh configure_unmanaged --config workspace/config.yaml ``` Обновите хеши комплекта приложений и установите ему состояние `drained`, когда пользователи не подключается, но сервер приложений работает. ```{tip} Чтобы утилита сама подсчитала хеши, укажите в поле "Хотите загрузить метаданные appkit из папки?" значение "да", затем укажите папку с новым копмлектом приложений `(~/nscli/)workspace/config.yaml`. ``` ```text 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 ... ``` ```{tip} Обратите внимание, что новый appkit хранится по пути `appkit/v2`, а не `appkit/v1`. ``` 4. Скопируйте новый комплект приложений с хешами (`workspace/appkit`) на системное NFS-хранилище по указанному пути (`appkit/v2`). 5. Примените новую конфигурацию. ```bash ./namespace.sh create_unmanaged_resources --config workspace/config.yaml --resources workspace/resources.yaml kubectl apply -f workspace/resources.yaml ``` 6. Обновите базу данных. Для этого [подключитесь к поду](./020_install.md#настройка-параметров-кластера) с эксклюзивным экземпляром сервера приложений (global-server-excl) и выполните на нем команду: ```bash ./migrator.sh upgrade ``` ```{tip} Вы также можете воспользоваться командой `./invoke.sh` в составе nscli, если у утилиты есть доступ к кластеру. ~~~bash ./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. ```{tip} При необходимости адаптируйте этот вариант обновления согласно вашим требованиям по развертыванию. Читайте подробнее в документации Kubernetes по поводу существующих средств [управления ресурсами](https://kubernetes.io/docs/tasks/manage-kubernetes-objects/) и [обновления контейнеров](https://kubernetes.io/docs/tutorials/kubernetes-basics/update/). ``` 1. Запустите редактор конфигурации и внесите нужные изменения в уже имеющийся конфигурационный файл: ```bash ./namespace.sh configure_unmanaged workspace/config.yaml ``` Скорее всего, изменения не потребуются, но данный шаг гарантирует, что будут указаны все необходимые для развертывания настройки. 2. Удалите пространство имен в Kubernetes: ```bash kubectl delete namespace gs-cluster-k8s ``` ```{attention} Простого пересоздания ресурсов без удаления старого пространства имен будет недостаточно, так как от предыдущей версии могут остаться ресурсы, признанные устаревшими в новой версии. ``` ```{tip} Если вы не можете удалить пространство имен (например, из-за отсутствия прав), но у вас есть yaml-манифест с развернутой версией ресурсов Kubernetes, вы можете использовать команду `kubectl delete -f` для удаления ресурсов. Тогда вам не придется удалять пространство имен, секреты и роли при обновлении. ~~~bash kubectl delete -f workspace/resources.yaml ~~~ По причинам выше рекомендуется все же удалить пространство имен, если такая возможность есть. ``` 3. Сгенерируйте ресурсы заново: ```bash ./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 ``` И примените их: ```bash kubectl apply -f workspace/namespace.yaml # kubectl apply -f secrets.yaml # kubectl apply -f roles.yaml kubectl apply -f workspace/resources.yaml ```