Обновление Deckhouse Code устанавливает новую версию поверх текущей: конфигурация и данные сохраняются, настройка и миграции базы данных запускаются автоматически. Правила ниже действуют для всех типов установки.
Порядок версий
Обновляйтесь последовательно, без пропуска мажорных версий: миграции базы данных рассчитаны на переход с предыдущей мажорной версии. Если между текущей и целевой версией несколько мажорных релизов, устанавливайте их по очереди и дожидайтесь между шагами завершения фоновых миграций. Путь обновления для вашей пары версий уточните у вендора при получении новой версии.
Фоновые миграции
Обновление применяет основные миграции базы данных и не дожидается фоновых: они продолжают выполняться на уже работающем инстансе. Перед следующим обновлением все фоновые миграции должны завершиться, иначе обновление прервётся с ошибкой.
Чтобы проверить состояние миграций, в правом верхнем углу выберите «Admin», затем в левой панели перейдите в «Мониторинг» → «Фоновые миграции». Все миграции должны быть в конечном статусе: в списке не осталось задач в очереди и в процессе завершения, а задач, завершившихся с ошибкой, нет. На типовом инстансе это занимает минуты, на больших объёмах данных — дольше.
Перед обновлением
- Пакет для ОС Linux
- Omnibus Docker
- Helm-чарт
Создайте резервную копию по разделу «Резервное копирование и восстановление» и проверьте, что есть свежие копии файлов /etc/gitlab/gitlab-secrets.json и /etc/gitlab/gitlab.rb:
sudo gitlab-backup createСоздайте резервную копию данных и конфигурации по разделу «Резервное копирование и восстановление» и убедитесь, что архивы хранятся за пределами хоста.
Запишите тег, с которым запущен контейнер: к нему возвращает откат.
docker inspect --format '{{.Config.Image}}' codeКаждый релиз чарта указывает версию Deckhouse Code, которую он разворачивает. Проверьте её перед обновлением:
helm show chart deckhouse-code --version <CHART_VERSION>Создайте резервную копию по разделу «Резервное копирование и восстановление»: она нужна для отката изменения схемы базы данных.
Обновление инстанса
- Пакет для ОС Linux
- Omnibus Docker
- Helm-чарт
Конфигурация в файле /etc/gitlab/gitlab.rb и данные сохраняются.
Установите новый пакет; настройка и миграции запустятся автоматически:
# РЕД ОС. sudo rpm -Uvh ./deckhouse-code-<NEW_VERSION>.el8.x86_64.rpm # Ubuntu. sudo apt install -y ./deckhouse-code_<NEW_VERSION>_amd64.debПроверьте состояние инстанса и установленную версию:
# Все сервисы в состоянии run. sudo gitlab-ctl status # Установленная версия на РЕД ОС. rpm -q deckhouse-code # Установленная версия на Ubuntu. dpkg -l deckhouse-code # Ожидается health=200. curl --cacert /etc/gitlab/ssl/<HOSTNAME>.crt \ --resolve '<HOSTNAME>:443:127.0.0.1' -o /dev/null \ -w "health=%{http_code}\n" https://<HOSTNAME>/-/health
На время миграций инстанс отвечает медленнее; на типовом инстансе обновление занимает минуты.
Контейнер заменяется контейнером из нового тега образа; тома остаются, а данные и конфигурация инстанса на них переносятся при первом запуске. Каждый тег называет версию, отдельного тега для последней версии нет, поэтому целевая версия указывается явно.
Получите образ целевой версии:
docker pull <REGISTRY>/<FLAVOR>:<VERSION>Остановите и удалите контейнер. Тома — это каталоги хоста, они остаются на месте:
docker stop code docker rm codeСоздайте контейнер из нового тега с тем же именем, портами, томами и переменными окружения, что и в разделе «Быстрый старт»:
docker run -d --name code \ --shm-size 256m \ -p 80:80 -p 443:443 -p 22:22 \ -e GITLAB_OMNIBUS_CONFIG="external_url 'http://<HOSTNAME>'" \ -v /srv/code/config:/etc/gitlab \ -v /srv/code/logs:/var/log/gitlab \ -v /srv/code/data:/var/opt/gitlab \ <REGISTRY>/<FLAVOR>:<VERSION>Следите за запуском. Миграции базы данных выполняются во время настройки, и до её окончания инстанс отвечает 502:
docker logs -f codeПроверьте версию и сервисы:
docker logs code | grep 'Current version' docker exec code gitlab-ctl status docker inspect --format '{{.State.Health.Status}}' code
Стартовый скрипт читает версию данных на томе и сравнивает её с версией образа. Если перейти к новой версии за один шаг нельзя, в выводе указывается версия, которую нужно установить сначала, и запуск прекращается: запустите тег этой версии, дождитесь завершения фоновых миграций и затем запустите целевой тег.
После настройки скрипт приводит базу данных к версии PostgreSQL из нового образа. Неудачное обновление базы отменяется, и контейнер завершает работу с сообщением Upgrading the existing database failed and was reverted. Создайте контейнер с параметром -e GITLAB_SKIP_PG_UPGRADE=true, чтобы запустить инстанс на текущей версии PostgreSQL, и обновите базу данных отдельно.
Обновите релиз:
helm repo update
helm upgrade code deckhouse-code \
-n code \
-f values.yaml \
--version <CHART_VERSION>Команда переиспользует существующий values.yaml. Если по таблице соответствия версий нужно пройти через несколько версий Deckhouse Code, соблюдайте порядок версий: пропуск версии может привести к тому, что более поздняя миграция не сможет выполниться.
При каждом обновлении один раз выполняется задача миграций — перед перезапуском компонентов, которые зависят от новой схемы базы данных. Проверьте её ход:
d8 k -n code get jobs
d8 k -n code logs job/<MIGRATIONS_JOB_NAME>Фоновые миграции продолжаются на работающем инстансе после обновления и должны завершиться до следующего обновления.
Откат
Откат возможен только из резервной копии, снятой перед обновлением: новая версия перенесла данные.
- Пакет для ОС Linux
- Omnibus Docker
- Helm-чарт
Остановите и удалите контейнер:
docker stop code docker rm codeСоздайте контейнер из предыдущего тега с теми же томами.
Восстановите данные из резервной копии, сделанной перед обновлением, по разделу «Восстановление».
Откатите релиз на предыдущую ревизию:
helm rollback code <REVISION>Команда helm rollback откатывает только объекты Kubernetes релиза. Она не отменяет изменение схемы базы данных, сделанное миграциями обновления.
Если обновление, которое вы откатываете, изменило схему, после завершения отката восстановите резервную копию, созданную до обновления, по разделу «Восстановление».
Переход между пакетом, Docker и модулем
Перенос инстанса с пакета для ОС Linux или Omnibus Docker в модуль Deckhouse Kubernetes Platform и обратно описан в разделе «Миграция» документации модуля.
Модуль Deckhouse Kubernetes Platform
В поставке модулем обновление запускает платформа. Если в ресурсе CodeInstance заданы backup.enabled и backup.backupBeforeUpdate, оператор сначала создаёт резервную копию и обновляет остальные компоненты после успешного завершения задания копирования; неуспешное задание откладывает обновление и вызывает оповещение D8CodeOperatorUpdatePostpone. Порядок описан в разделе «Автоматическое создание бэкапов перед обновлениями модуля» документации модуля.