Кластер Stronghold в режиме HA с хранилищем Raft обновляется поочерёдно, узел за узлом. Сначала обновляются standby-узлы, затем активный узел передаёт роль одному из обновлённых узлов и обновляется последним. Такой порядок сохраняет кворум и доступность кластера на время обновления.
Подготовка
Перед обновлением подготовьте кластер и новый бинарный файл:
Ознакомьтесь с примечаниями к выпуску для всех версий между текущей и целевой. Обратите внимание на изменения конфигурации и несовместимые изменения.
Проверьте версию и состояние кластера:
d8 stronghold status d8 stronghold operator raft list-peers d8 stronghold operator raft autopilot stateВсе узлы должны быть в состоянии
voter, Autopilot должен сообщатьHealthy: true.Создайте снимок хранилища и проверьте его (подробнее — в разделе «Создание снимка» и «Проверка снимка»):
d8 stronghold operator raft snapshot save pre-upgrade.snap d8 stronghold operator raft snapshot inspect pre-upgrade.snapСохраните копии конфигурационного файла, 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Убедитесь, что держатели ключей распечатывания доступны, если используется Shamir seal: каждый узел после перезапуска потребуется распечатать.
Скопируйте бинарный файл новой версии на все узлы, например в
/tmp/stronghold, и проверьте его версию:/tmp/stronghold versionОпределите активный узел: в выводе
d8 stronghold operator raft list-peersу него состояниеleader.
Обновление standby-узлов
Выполните шаги на каждом standby-узле по очереди. Не переходите к следующему узлу, пока текущий не вернулся в кластер.
Замените бинарный файл:
install -o root -g root -m 0755 /tmp/stronghold /opt/stronghold/strongholdПерезапустите сервис:
systemctl restart strongholdЕсли используется Shamir seal, распечатайте узел. Укажите адрес обновляемого узла:
export STRONGHOLD_ADDR=https://raft-node-2.demo.tld:8200 d8 stronghold operator unsealПроверьте, что узел вернулся в кластер и распечатан:
d8 stronghold status d8 stronghold operator raft autopilot stateДождитесь, пока Autopilot покажет узел как
healthy, а кластер —Healthy: true.Проверьте серверные журналы узла на ошибки:
journalctl -u stronghold.service --since "10 minutes ago"
Обновление активного узла
Обновите активный узел после обновления всех standby-узлов:
Передайте роль активного узла одному из обновлённых узлов. Выполните команду, указав адрес текущего активного узла:
export STRONGHOLD_ADDR=https://raft-node-1.demo.tld:8200 d8 stronghold operator step-downУбедитесь, что лидером стал другой узел:
d8 stronghold operator raft list-peersОбновите бывший активный узел так же, как standby-узлы: замените бинарный файл, перезапустите сервис, распечатайте узел и дождитесь его возвращения в кластер.
Проверка после обновления
После обновления всех узлов проверьте кластер:
Проверьте версию на каждом узле:
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Проверьте состояние кластера:
d8 stronghold operator raft list-peers d8 stronghold operator raft autopilot stateПроверьте основные сценарии: вход через используемые методы аутентификации, чтение и запись тестового секрета, выдачу динамических учётных данных.
Проверьте, что метрики и алерты работают (подробнее — в разделе «Мониторинг»).
В выводе autopilot state для каждого узла указана версия (Version), по ней можно убедиться, что все узлы обновлены.
Откат
Если после обновления узел не запускается или кластер работает некорректно:
- Остановите обновлённый узел и верните прежний бинарный файл из копии
/opt/stronghold/stronghold.bak. - Если данные хранилища уже были изменены новой версией и прежняя версия не запускается, восстановите кластер из снимка
pre-upgrade.snapна прежней версии (подробнее — в разделе «Восстановление из снимка»).
Восстановление из снимка возвращает данные к моменту его создания. Изменения, сделанные после создания снимка, будут потеряны.