Thank you for reading this post, don't forget to subscribe!
-
Восстановление снапшота полностью заменяет текущее хранилище Vault содержимым снапшота.
-
После восстановления снова становятся валидными root-токен и recovery-ключи от исходного кластера (того, где снимали снапшот).
-
Если исходный кластер использовал AWS KMS (возможно, в другом регионе), на время восстановления понадобится доступ к старому KMS-ключу, чтобы расшифровать данные.
-
Во время миграции типа seal вы увидите
Seal Migration in Progress: true— это нормально, пока вы не завершите миграцию на каждом pod’е.
1) Поднимите пустой кластер (или один узел)
Разверните «чистый» Vault (в примере — деплой из инфраструктурного репозитория через Terragrunt). Пока кластер не инициализирован, pod’ы будут перезапускаться (проверы падают) — это ожидаемо.
Временная рекомендация (опционально): выключить probes на время восстановления
YAML
12345 kubectl -n vault patch sts vault --type='json' -p='[{"op":"remove","path":"/spec/template/spec/containers/0/livenessProbe"},{"op":"remove","path":"/spec/template/spec/containers/0/readinessProbe"}]'
Позже вернёте probes обратно через Helm values.
2) Выполните минимальную начальную инициализацию (временно)
Это нужно лишь для того, чтобы заработали API/CLI для команды восстановления (снапшот всё равно перезапишет данные).
|
1 2 3 4 5 6 7 8 9 10 11 |
kubectl -n vault exec -it vault-0 -c vault -- sh export VAULT_ADDR=https://vault-0.vault-internal:8200 # Инициализация (пример: 5 ключевых долей, порог 3) vault operator init -key-shares=5 -key-threshold=3 # Временное unseal (введите любые 3 ключа из выданных при init) vault operator unseal vault operator unseal vault operator unseal |
Временные ключи и root-токен из этого шага не пригодятся после восстановления.
Будут использоваться учётные данные снапшота.
3) Скопируйте снапшот в pod
|
1 2 |
kubectl -n vault cp ./vault-2025-08-17.raft vault/vault-0:/tmp/vault.snap -c vault |
4) Дайте временный доступ к старому KMS (если снапшот зашифрован в другом регионе)
Если исходный Vault использовал AWS KMS в eu-central-1, выдайте роли pod’а временные права на старый ключ:
|
1 2 3 4 5 6 7 8 9 10 11 |
{ "Sid": "KMSDecryptTemp", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:DescribeKey", "kms:Encrypt" ], "Resource": "arn:aws:kms:eu-central-1:<account_id>:key/mrk-xxxxxx" } |
Если в окружении pod’а глобально установлено
AWS_REGION=us-east-1, то настройка региона в seal "awskms" { region = "eu-central-1" } может быть переопределена переменной окружения. Временно задайте нужный регион явно через значения чарта:|
1 2 3 4 |
server: extraEnvironmentVars: AWS_REGION: "eu-central-1" |
Переменная окружения AWS_REGION имеет приоритет над region в блоке seal "awskms" {}.
Это требуется только на время восстановления, если старый ключ в другом регионе.
5) Восстановите Raft-снапшот
Выполните на одном pod’е (лидере после шага 2):
|
1 2 3 4 5 |
export VAULT_ADDR=https://vault-0.vault-internal:8200 # ВНИМАНИЕ: команда перезапишет всё состояние хранилища из снапшота vault operator raft snapshot restore -force /tmp/vault.snap |
После восстановления:
-
Процессные настройки (vault.hcl, env, Helm values) останутся как в деплое.
-
Storage data/policies/auth/mounts будут точной копией исходного кластера.
-
С этого момента используйте root-токен и recovery-ключи от исходного кластера (источника снапшота).
6) Выполните unseal и завершите миграцию seal
Если в снапшоте был Shamir или KMS в другом регионе, вы, скорее всего, увидите:
|
1 2 3 4 5 |
vault status # … # Seal Migration in Progress true # Sealed true|false |
Запустите миграцию на каждом pod’е:
|
1 2 3 4 5 6 7 8 9 10 |
# Для vault-0 export VAULT_ADDR=https://vault-0.vault-internal:8200 vault operator unseal -migrate # Введите Recovery Key 1/2/3 (те самые, из исходного кластера) # Затем vault-1, vault-2, … export VAULT_ADDR=https://vault-1.vault-internal:8200 vault operator unseal -migrate # … |
-
Seal Migration in Progress: trueозначает, что не все pod’ы завершили миграцию. -
Когда каждый pod будет мигрирован, вы увидите:
-
Seal Migration in Progress: false -
Sealed: false(при условии, что KMS доступен)
-
7) Переключитесь на новый KMS в целевом регионе
Когда восстановление прошло успешно:
-
Обновите блок seal на ваш целевой KMS/регион (пример для
us-east-1):
|
1 2 3 4 5 |
seal "awskms" { region = "${local.config.regions-us.main}" kms_key_id = "${dependency.kms.outputs.key_arn}" } |
-
Уберите временную переменную окружения, которой фиксировали старый регион:
|
1 2 3 4 |
server: extraEnvironmentVars: # AWS_REGION: "eu-central-1" # ← удалить эту строку |
-
Удалите временные права доступа к старому KMS-ключу.
-
Перезапустите/переразверните Vault.
-
Снова увидите
Seal Migration in Progress: true— это ожидаемо при смене KMS/региона.
Повторите на каждом pod’е:
|
1 2 3 4 |
export VAULT_ADDR=https://vault-<i>.vault-internal:8200 vault operator unseal -migrate # Введите Recovery Keys (из снапшота) |
Ожидаемое итоговое состояние:
-
Seal Type: awskms -
Sealed: false -
Seal Migration in Progress: false(поле может и вовсе отсутствовать)
8) Включите probes
Рекомендуется вернуть readiness/liveness через Helm values (а не через kubectl patch):
|
1 2 3 4 5 6 7 8 |
server: readinessProbe: enabled: true # … ваши настройки livenessProbe: enabled: true # … ваши настройки |
Убедитесь, что убрали все временные настройки (например, AWS_REGION для старого региона).
9) Проверьте доступ к данным
Используйте root-токен от исходного кластера (источника снапшота):
|
1 2 3 4 5 6 7 8 |
export VAULT_ADDR=https://vault-<i>.vault-internal:8200 export VAULT_TOKEN=<root-token-from-snapshot> vault status vault secrets list -detailed vault kv list secret/ # Выполните точечные чтения/листы по ожидаемым путям |
Заодно можно проверить доступность данных через UI.
Полезная ссылка
-
Официальная заметка HashiCorp: AWS KMS to AWS KMS Seal Migration
https://support.hashicorp.com/hc/en-us/articles/10375276754707-AWS-KMS-to-AWS-KMS-Seal-Migration