Кластер Stronghold в режиме HA с хранилищем Raft обновляется поочерёдно, узел за узлом. Сначала обновляются standby-узлы, затем активный узел передаёт роль одному из обновлённых узлов и обновляется последним. Такой порядок сохраняет кворум и доступность кластера на время обновления.

Подготовка

Перед обновлением подготовьте кластер и новый бинарный файл:

  1. Ознакомьтесь с примечаниями к выпуску для всех версий между текущей и целевой. Обратите внимание на изменения конфигурации и несовместимые изменения.

  2. Проверьте версию и состояние кластера:

    d8 stronghold status
    d8 stronghold operator raft list-peers
    d8 stronghold operator raft autopilot state

    Все узлы должны быть в состоянии voter, Autopilot должен сообщать Healthy: true.

  3. Создайте снимок хранилища и проверьте его (подробнее — в разделе «Создание снимка» и «Проверка снимка»):

    d8 stronghold operator raft snapshot save pre-upgrade.snap
    d8 stronghold operator raft snapshot inspect pre-upgrade.snap
  4. Сохраните копии конфигурационного файла, systemd-unit и текущего бинарного файла на каждом узле:

    cp -a /opt/stronghold/stronghold /opt/stronghold/stronghold.bak
    cp -a /opt/stronghold/config.hcl /opt/stronghold/config.hcl.bak
    cp -a /etc/systemd/system/stronghold.service /etc/systemd/system/stronghold.service.bak
  5. Убедитесь, что держатели ключей распечатывания доступны, если используется Shamir seal: каждый узел после перезапуска потребуется распечатать.

  6. Скопируйте бинарный файл новой версии на все узлы, например в /tmp/stronghold, и проверьте его версию:

    /tmp/stronghold version
  7. Определите активный узел: в выводе d8 stronghold operator raft list-peers у него состояние leader.

Обновление standby-узлов

Выполните шаги на каждом standby-узле по очереди. Не переходите к следующему узлу, пока текущий не вернулся в кластер.

  1. Замените бинарный файл:

    install -o root -g root -m 0755 /tmp/stronghold /opt/stronghold/stronghold
  2. Перезапустите сервис:

    systemctl restart stronghold
  3. Если используется Shamir seal, распечатайте узел. Укажите адрес обновляемого узла:

    export STRONGHOLD_ADDR=https://raft-node-2.demo.tld:8200
    d8 stronghold operator unseal
  4. Проверьте, что узел вернулся в кластер и распечатан:

    d8 stronghold status
    d8 stronghold operator raft autopilot state

    Дождитесь, пока Autopilot покажет узел как healthy, а кластер — Healthy: true.

  5. Проверьте серверные журналы узла на ошибки:

    journalctl -u stronghold.service --since "10 minutes ago"

Обновление активного узла

Обновите активный узел после обновления всех standby-узлов:

  1. Передайте роль активного узла одному из обновлённых узлов. Выполните команду, указав адрес текущего активного узла:

    export STRONGHOLD_ADDR=https://raft-node-1.demo.tld:8200
    d8 stronghold operator step-down
  2. Убедитесь, что лидером стал другой узел:

    d8 stronghold operator raft list-peers
  3. Обновите бывший активный узел так же, как standby-узлы: замените бинарный файл, перезапустите сервис, распечатайте узел и дождитесь его возвращения в кластер.

Проверка после обновления

После обновления всех узлов проверьте кластер:

  1. Проверьте версию на каждом узле:

    for node in raft-node-1 raft-node-2 raft-node-3; do
      STRONGHOLD_ADDR=https://${node}.demo.tld:8200 d8 stronghold status | grep -E 'Version|HA Mode|Sealed'
    done
  2. Проверьте состояние кластера:

    d8 stronghold operator raft list-peers
    d8 stronghold operator raft autopilot state
  3. Проверьте основные сценарии: вход через используемые методы аутентификации, чтение и запись тестового секрета, выдачу динамических учётных данных.

  4. Проверьте, что метрики и алерты работают (подробнее — в разделе «Мониторинг»).

В выводе autopilot state для каждого узла указана версия (Version), по ней можно убедиться, что все узлы обновлены.

Откат

Если после обновления узел не запускается или кластер работает некорректно:

  1. Остановите обновлённый узел и верните прежний бинарный файл из копии /opt/stronghold/stronghold.bak.
  2. Если данные хранилища уже были изменены новой версией и прежняя версия не запускается, восстановите кластер из снимка pre-upgrade.snap на прежней версии (подробнее — в разделе «Восстановление из снимка»).

Восстановление из снимка возвращает данные к моменту его создания. Изменения, сделанные после создания снимка, будут потеряны.