Обновление системы#
Стандартное обновление - это обновление комплекта приложения (appkit) с применением изменений так, что сервер приложений перезапускается, а пользователи отключаются на время перезапуска.
Как правило, применяется когда меняется хотя бы один из компонентов:
globalserver.zip(сервер приложений)profile.zip(профиль конфигурации)applib.zip(прикладное решение)а также когда требуется обновление схемы БД.
Горячее обновление - режим, при котором можно обновить только прикладное решение без отключения пользователей и без перезапуска серверов, но при строгих условиях:
включён флаг
hot_reload: trueв группе ресурсов (resgroup);меняется только
applib.zip(и опциональноappsrc), аglobalserver.zipиprofile.zipостаются без изменений;если в рамках обновления требуется миграция/обновление схемы БД, поведение зависит от настройки «осушения» кластера перед обновлением БД (
drain_cluster_before_db_upgrade).
Внимание
Если вы запускаете обновление схемы БД при включённом drain_cluster_before_db_upgrade: true, пользователи будут отключены на время обновления БД, даже если горячее обновление включено.
Стандартное обновление#
Вариант A. С использованием nscli#
Для обновления комплекта приложения (appkit: сервера приложений, прикладного решения) подготовьте его и загрузите на NFS-хранилище:
./appkit.sh push --namespace gs-ctk --source workspace/appkit --destination appkit/v2
--namespace gs-ctk- пространство имен, в котором развертанgs-ctk.--source workspace/appkit- путь к папке с комплектом на локальной ФС относительно текущей папки.--destination appkit/v2- путь к папке, в которую следует поместить комплект, относительно точки монтирования системного хранилища.
Обновите хеши и пути к комплекту приложения (appkit) в конфигурации при помощи команды:
# не требует подключения к кластеру, хеши будут посчитаны с комплекта приложений на локальном диске ./appkit.sh switch_local --config-path ./config.yaml --resgroup gs-cluster-1 --local-appkit workspace/appkit --remote-appkit appkit/v2
--config-path ./config.yaml- путь к конфигурационному ресурсу.--resgroup gs-cluster-1- название группы ресурсов.--local-appkit workspace/appkit- путь к папке с комплектом на локальной ФС относительно текущей папки (--sourceиз предыдущего пункта).--remote-appkit appkit/v2- путь к папке на системном хранилище, в котором находится комплект (--destinationиз предыдущего пункта).
ИЛИ
# хеши читаются с комплекта приложений на хранилище в кластере, следовательно требует подключения к кластеру ./appkit.sh switch_remote --config-path ./config.yaml --resgroup gs-cluster-1 --namespace gs-ctk --remote-appkit appkit/v2
--config-path ./config.yaml- путь к конфигурационному ресурсу.--resgroup gs-cluster-1- название группы ресурсов.--namespace gs-ctk- пространство имен, в котором развертанgs-ctk.--remote-appkit appkit/v2- путь к папке на системном хранилище, в котором находится комплект (--destinationиз предыдущего пункта).
Переключите показатель версии базы данных
database_schema_version, чтобы запустить обновление базы данных при следующем применении ресурса:./appkit.sh upgrade --config-path ./config.yaml --resgroup gs-cluster-1
Повторно примените ресурс:
kubectl apply -f ./config.yaml
Совет
Для отслеживания статуса обновления и чтения логов, используйте команду:
./appkit.sh wait_upgrade --namespace gs-ctk --resgroup gs-cluster-1
Вариант B. Без nscli (вручную)#
Этот вариант делает то же самое по сути, но без использования утилиты.
Сформируйте комплект приложения
Необходимо подготовить три zip-архива:
globalserver.zipapplib.zipprofile.zip
Внимание
Архивы должны содержать содержимое соответствующих папок, а не саму папку верхнего уровня (то есть внутри
applib.zipлежат модули, а не директорияapplib/целиком).Сгенерируйте sha1-файлы рядом с архивами
Рядом с каждым архивом должен лежать файл
*.sha1с sha1-суммой (строка без лишних символов).Пример скрипта:
for archive in appkit/*.zip do sha1sum < "$archive" | tr -d ' -' | tr -d '\n' > "$archive.sha1" done
Загрузите архивы и
.sha1на системное NFS-хранилищеЗагрузите в новый каталог вида
appkit/v2(необходимо сделать инкремент текущей версии appkit).Обновите конфигурацию
В конфигурационном ресурсе обновите:
путь к комплекту (
path)хеши:
applib_sha1,appsrc_sha1(если используется),globalserver_sha1,profile_sha1счётчики:
globalserver_instanceиdatabase_schema_version
Примените ресурс:
kubectl apply -f config.yaml
Горячее обновление#
Горячее обновление имеет смысл, когда меняется только applib.zip (и/или appsrc), а globalserver.zip и
profile.zip остаются прежними. Иначе необходимо использовать стандартное обновдение.
Функция управляется параметрами в GlobalConfiguration:
apiVersion: global-system.ru/v1
kind: GlobalConfiguration
metadata:
name: config
spec:
resgroups:
- hot_reload: true
drain_cluster_before_db_upgrade: false
Ключевые параметры:
hot_reloadtrue- разрешает горячее обновление, если изменяется толькоapplib.zip, а сервер приложений (globalserver.zip) и профиль (profile.zip) остаются без изменений. Обновления применяется без перезапуска серверов.false- любое обновление приводит к перезапуску и отключению пользователей
drain_cluster_before_db_upgradetrue(рекомендуется, по умолчанию) - перед обновлением БД кластер «осушается» (новые соединения не принимаются, текущие завершаются). Это гарантирует согласованность данных и отсутствие конфликтов.false- Обновление БД выполняется в фоне, пока пользователи продолжают работу.
Предупреждение
Параллельная работа пользователей и процесс обновления могут конфликтовать, что потенциально приводит к ошибкам и неполному применению изменений в БД.
Примечание
Если вы инициируйте обновление БД при помощи ./appkit.sh upgrade при включенном осушении кластера (drain_cluster_before_db_upgrade = true), то пользователи будут отключены на время обновления БД независимо от того, включено горячее обновление (hot_reload) или нет.
Вариант A. Горячее обновление с использованием nscli#
Включите hot reload и настройте «осушение»:
Используйте интерактивный мастер для настройки параметров группы ресурсов:
./configmgr.sh configure_resgroup --config-path config.yaml --resgroup gs-cluster-1
Настройка группы ресурсов: gs-cluster-1 ======================================= ... Включить горячие обновления?[да,нет]:да Осушать кластер перед запуском обновления?[да,нет]:нет ...
Или точечно командами:
# Включение/выключение горячего обновления ./appkit.sh allow_hot_reload --config-path config.yaml --resgroup gs-cluster-1 ./appkit.sh disallow_hot_reload --config-path config.yaml --resgroup gs-cluster-1 # Управление осушением кластера перед обновлением БД ./appkit.sh drain_before_upgrade --config-path config.yaml --resgroup gs-cluster-1 ./appkit.sh do_not_drain_before_upgrade --config-path config.yaml --resgroup gs-cluster-1
Загрузите на хранилище обновленные компоненты:
Для того, чтобы скопировать на сетевое хранилище только нужные компоненты (например, только прикладное решение), используйте аргумент
--itemsкоманды./appkit.sh push:./appkit.sh push --namespace gs-ctk --source workspace/appkit --destination appkit/v2 --items applib,appsrc
Обновите хеши компонентов в конфигурационном файле:
./appkit.sh switch_remote --config-path ./config.yaml --resgroup gs-cluster-1 --namespace gs-ctk --remote-appkit appkit/v2
Обновите целевую версию схемы:
./appkit.sh upgrade --config-path ./config.yaml --resgroup gs-cluster-1
Примените ресурс:
kubectl apply -f config.yaml
После этого начнётся обновление прикладного решения (и при необходимости БД) в соответствии с выбранными флагами.
Вариант B. Горячее обновление без nscli (вручную)#
Включите hot reload и настройте «осушение» в
GlobalConfiguration.Сформируйте архив
applib.zip(и при необходимостиappsrc).Сгенерируйте
applib.zip.sha1рядом с архивом (пример скрипта тот же, что и в обычном обновлении).Загрузите архив и
applib.zip.sha1на системное NFS-хранилище.В конфигурационном ресурсе обновите:
путь к комплекту (
path);applib_sha1(иappsrc_sha1, если используетсяappsrc);счётчики:
globalserver_instanceиdatabase_schema_version
Примените ресурс:
kubectl apply -f config.yaml
Режимы обновления базы данных#
Есть два режима обновления базы данных:
Через запуск мигратора на поде global_server_excl по команде nsctl.
Через ресурс Kubernetes типа Job с запуском отдельного пода.
По умолчанию используется первый способ, но второй способ имеет ряд преимуществ:
Процесс обновления запускается через nsctl, но не зависит от него.
Запуск временного сервера приложения позволяет изолировать ошибки, связанные с нагоном релиза.
В будущем, запуск через Job заменит собой запуск мигратора на поде global_server_excl.
Чтобы выбрать режим, используйте интерактивный мастер для настройки параметров группы ресурсов:
./configmgr.sh configure_resgroup --config-path config.yaml --resgroup gs-cluster-1
Настройка группы ресурсов: gs-cluster-1
=======================================
...
Включить обновление при помощи ресурса Kubernetes типа Job?[да,нет]:да
Укажите размер кучи Java (Xmx) для Job обновления: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
...
Режим также можно изменить, установив значение параметра группы ресурсов upgrade_job.enabled в true или false.
При включенном обновлении через Job после выполнения ./appkit.sh upgrade (или изменения параметра группы ресурсов database_schema_version другим способом) и применения конфигурационного ресурса, nsctl должен удалить старый Job вместе с созданным им подом, и создать новый.
Job и под обновления можно определить по метке (label) global-system.ru/is-upgrade-job-pod-for, значение которого соответствует названию группы ресурсов. Название Job состоит из префикса upgrade-job- и названия группы ресурсов, например, upgrade-job-gs-cluster-1.
Обновление кластерных утилит#
Загрузите и распакуйте новую версию nscli и Helm-чарт
Обновите, используя созданный ранее
values.yaml:helm upgrade gs-ctk ~/nscli/helm_chart -f values.yaml