Резервное копирование хранилища etcd

В этом разделе описано, как осуществлять резервное копирование и восстановление из копии хранилища конфигураций etcd с помощью утилит etcdctl и etcdutl.

В разделе рассматривается работа с etcd при следующих условиях:

  • кластер развернут с помощью Kubespray;

  • etcd установлено как системный сервис и управляется с помощью утилиты systemctl.

В системе должны быть установлены утилиты etcdctl и etcdutl версии не ниже 3.5.17. Инструкция по установке представлена в репозитории разработчика etcd.

Резервное копирование etcd

Чтобы создать резервную копию etcd, выполните следующую команду:

ETCDCTL_API=3 etcdctl snapshot save snapshot.db --cert=/etc/ssl/etcd/ssl/ca.pem --key=/etc/ssl/etcd/ssl/ca-key.pem

На конкретных инсталляциях SIEM пути к файлам TLS-сертификата (--cert) и ключа (--key) могут отличаться. Просмотреть актуальные пути можно в файле /etc/etcd.env как значения следующих переменных окружения:

  • ETCD_CERT_FILE — путь к файлу сертификата;

  • ETCD_KEY_FILE — путь к файлу ключа.

Чтобы получить расширенный лог сообщений о ходе создания резервной копии, добавьте к команде выше опцию --debug=true.

Чтобы удостовериться, что резервная копия создана успешно, выполните следующую команду:

etcdutl snapshot status snapshot.db -w table
Пример вывода команды etcdutl snapshot status snapshot.db -w table
+---------+----------+------------+------------+
|  HASH   | REVISION | TOTAL KEYS | TOTAL SIZE |
+---------+----------+------------+------------+
| 7ef846e |   485261 |      11642 |      94 MB |
+---------+----------+------------+------------+

Номер ревизии (REVISION) увеличивается на 1 при каждой операции записи в etcd.

Восстановление etcd из резервной копии

Для восстановления etcd из резервной копии в кластере Kubernetes следует использовать вариант восстановления "revision bumps": контроллеры Kubernetes используют так называемые информеры (informers), которые работают как кэш. Восстановление etcd из резервной копии без использования revision bumps может привести к некорректному восстановлению кэшей и, как следствие, неопределенному поведению контроллеров.

Чтобы выполнить восстановление etcd из резервной копии:

  1. Выполните следующую команду:

    etcdutl snapshot restore snapshot.db --bump-revision <n_bumps> --mark-compacted --data-dir <new_dir>

    Здесь:

    • <n_bumps> — 64-битное целое число, на которое следует увеличить REVISION. Его можно оценить, умножив среднее число операций записи в etcd в секунду на число секунд с момента создания резервной копии. Можно установить значение, большее оценки, меньшее — не рекомендуется.

      Например, если в etcd производится 100 операций записи в секунду, а резервная копия создана 24 часа назад, минимально допустимое значение n_bumps — 24 * 60 * 100 = 144000.

    • <new_dir> — новый каталог данных etcd, например, /var/lib/etcd_restored/.

      Опция --mark-compacted отмечает предыдущие ревизии etcd как сжатые. Это позволяет удостовериться, что все процессы отслеживания etcd остановлены, и кэши информеров сделаны недействительными.

  2. Остановите сервис etcd, выполнив следующую команду:

    systemctl stop etcd.service
  3. В файле /etc/etcd.env измените значение переменной ETCD_DATA_DIR на путь, указанный в качестве значения <new_dir> на шаге 1.

  4. Запустите сервис etcd, выполнив следующую команду:

    systemctl start etcd.service
  5. При необходимости удалите каталог, в котором хранились данные etcd до восстановления, с помощью следующей команды:

    rm -rf <old_dir>

    Здесь:

    • <old_dir> — каталог, в котором хранились данные etcd до восстановления, например, /var/lib/etcd/.