Неуправляемый режим
Contents
Неуправляемый режим#
Утилита 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, необязателен.
Установите утилиту nscli в соответствии с инструкцией.
Подготовьте папку с комплектом приложений (appkit). Поместите её на машину с утилитой, например, по пути
~/nscli/workspace/appkit
.Подготовьте ресурсы секретов и роли для мониторинга.
Выполните в папке 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
Поместите упакованный комплект приложений (находится по тому же пути
~/nscli/workspace/appkit
) на системное (NFS-)хранилище, по указанному на предыдущем этапе пути (в нашем случае/nfs/sys/appkit/v1/
).Создайте ресурсы с пространством имен, группами и книгами:
./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
Проверьте, что кластер исправно работает:
просмотрите список развернутых подов при помощи
kubectl get -A pods
на наличие созданных ресурсов и проверьте, что они работают;попробуйте подключиться к веб-интерфейсу через браузер по указанному для HAProxy адресу.
В случае неисправностей проанализируйте логи и метрики при помощи Grafana.
Совет
Поды автоматически перезапускаются при критических ошибках, что мешает диагностике неисправностей. Чтобы остановить перезапуск включите режим отладки.
Шифрование настроек учетной записи от реестра образов 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 не имеет доступа к кластеру, вам придется своими руками выполнить процедуру, которую обычно при обновлении выполняет утилита:
Поместите новый комплект приложений в папку
(~/nscli/)workspace/appkit
.Переведите комплект приложений в состояние
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
Запустите редактор конфигурации:
./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
.Скопируйте новый комплект приложений с хешами (
workspace/appkit
) на системное NFS-хранилище по указанному пути (appkit/v2
).Примените новую конфигурацию.
./namespace.sh create_unmanaged_resources --config workspace/config.yaml --resources workspace/resources.yaml kubectl apply -f workspace/resources.yaml
Обновите базу данных. Для этого подключитесь к поду с эксклюзивным экземпляром сервера приложений (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
Проверьте, что вывод генератора таблиц не сообщает об ошибках.
Переведите новый комплект приложений в состояние
started
аналогично шагу 2.
Обновление должно быть завершено, а сервер приложений должен принимать пользователей.
Обратите внимание, что мы рассмотрели лишь обновление комплекта приложений, но не образов контейнеров. Ознакомьтесь с документацией Kubernetes по поводу существующих средств обновления контейнеров.
В качестве самого простого решения, удалите пространство имен в Kubernetes:
kubectl delete namespace gs-cluster-k8s
Сделайте нужные изменения в конфигурации, сгенерируйте ресурсы заново и примените их:
./namespace.sh configure_unmanaged workspace/config.yaml
./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