Способы бэкапирования Persistent Volumes в Kubernetes кластере с помощью Velero

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

В данной статье рассмотрен процесс бэкапирования Kubernetes кластера с помощью Velero в общих чертах, а также освещены аспекты бэкапирования Persistent Volumes.

В дальнейшем резервные копии могут быть использованы для миграции, восстановления кластера на определенную дату, а также клонирования стендов.

О Velero

Velero – программный продукт с открытым исходным кодом, предназначенный для безопасного бэкапирования и восстановления после сбоев и миграции Ресурсов Kubernetes кластера и постоянных хранилищ (PV). Входит в пакет программных продуктов Vmware-tanzu для production использования, предназначенных для упрощения и автоматизации задач по администрированию Kuberntetes кластера. Распростаняется под лицензией Apache License 2.0.

Kubernetes – сложная и комплексная платформа, обладающая богатым функционалом по запуску и управлению контейнерными нагрузками, но в тоже время требущая значительных технических компетенций. Также часть задач администрирования кластера в нативном Kubernetes нуждается в автоматизации, в частности - бэкапирование. И в этом случае мы можем воспользоваться Velero.

Всегда ли нужно бэкапирование? Думаю, нет. Возможно у вас реализован подход IaC и описание инфраструктуры хранится в Git, возможно настроено бэкапирование etcd. Эти способы подходят для определенных конфигураций, хотя можно привести некоторые недостатки.

Но если нужно создать бэкап как манифестов так и Persistent Volumes, то приведенные подходы в чистом виде не подойдут, надо добавлять сторонний функционал. Как раз в этом случае наиболее удобно воспользоваться Velero и решить задачу в целом одним инструментом.

Установка Velero и бэкапирование манифестов Kubernetes

Процесс установки и использования Velero достаточно прост, но следует иметь ввиду ряд нюансов:

  • Velero хранит копии манифестов в S3 Storage. Можно использовать облачный bucket, либо установить Minio;

  • Для бэкапирования Velero использует плагины. Один для манифестов, другой для PV, либо общий для манифестов и PV;

  • Рассмотрев страницу плагинов можно обнаружить, что для вашего облака (или платформы) плагин не представлен. В этом случае для хранения манифестов в S3 (от облака или minio) нужно использовать AWS plugin. Что использовать для PV, будет рассмотрен ниже.

После подготовки s3 бакета порядок развертывания Velero следующий:

  1. Установка Velero клиента

    Velero состоит из серверного и клиентского компонентов.
    Серверный компонент – kubernetes operator, отслеживающий определенные CRDs и делающий операции backup/restore. Его можно установить через helm или через клиентский компонент. Также с помощью клиентского компонента можно создавать задачи backup/restore.

    Установим клиентский компонент на Linux (также есть для mac OS):

curl -L https://github.com/vmware-tanzu/velero/releases/download/v1.8.1/velero-v1.8.1-linux-amd64.tar.gz -o velero-v1.8.1-linux-amd64.tar.gz
tar -zxvf velero-v1.8.1-linux-amd64.tar.gz
sudo cp velero-v1.8.1-linux-amd64/velero /usr/local/bin/
velero version
  1. Подготовка конфигурации

    На текущем шаге создадим файл credentials-velero с учетными данными s3 бакета следующего содержания:

cat credentials-velero

[default]    
aws_access_key_id = <key>
aws_secret_access_key = <secret>
  1. Установка

    По умолчанию команда установки создает namespace velero и устанавливает туда необходимые ресурсы. Выполним установку:

velero install \
 --provider aws \
 --plugins velero/velero-plugin-for-aws:v1.4.1 \
 --bucket velero \
 --secret-file ./credentials-velero \
 --use-volume-snapshots=false \
 --backup-location-config region=<region>s3ForcePathStyle="true",s3Url=<url>
  1. Проверка

    Работспособность проверяется командой kubectl logs deployment/velero -n velero.В выоде должно быть строчки, свидетельствующие об установке связи с s3 хранилищем:

time="2022-05-25T13:47:57Z" level=info msg="Validating backup storage location" backup-storage-location=default controller=backup-storage-location logSource="pkg/controller/backup_storage_location_controller.go:114"
time="2022-05-25T13:47:57Z" level=info msg="Backup storage location valid, marking as available" backup-storage-location=default controller=backup-storage-location logSource="pkg/controller/backup_storage_location_controller.go:121"
  1. Первый бэкап

    В velero можно сделать бэкап кластера целиком, неймспейса или ресурсов по лейблам. Сделаем бэкап неймспейса с помощью команды velero backup create test-backup --include-namespaces test-namespace

    Результат можно проверить командой velero backup describe test-backup.

  2. Восстановление из бэкапа

    Для восстановления выполним команду velero restore create --from-backup test-backup --namespace-mappings test-namespace:test-namespace-restore.

    Соответственно будет создан namespace test-namespace-restore и в нем развернуты ресурсы.

В итоге у нас получилось забэкапить/восстановить манифесты. Однако как же быть с данными в PV? Рассмотрим далее.

Варианты бэкапирования PV

Возможны следующие варианты:

  1. Plugin для Cloud Provider;

  2. Restic;

  3. CSI-plugin для Kubernetes.

Далее рассмотрим варианты подробней.

Plugin для Cloud Provider

Наверно, это самый удобный вариант. В этом случае плагин обращается к api Облака, с помощью которого делаются Снапшоты дисков. Это быстрая и экономичная процедура.

Однако есть недостатки и ограничения:

  • Не полчится мигрировать между облаками/теннантами;

  • Возможно у вас используется тип хранилища, не поддерживающий снапшоты (диск типа NFS или Object Storage);

  • Для вашего облака или инсталляции нет плагина.

Подробности установки можно посмотреть в документации соответствующего провайдера, например.

В общем случае в команде установки нужно указать следующие флаги: --provider <provider> --plugins <plugin> --use-volume-snapshots=true.

Бэкап/ресторе делается командами из прошлого раздела.

Restic

Restic является отдельным программным продуктом, предназначенным для бэкапирования на уровне файловой системы. В этом случае производится бэкапирование файловой структуры PV на S3 бакет, указанный для манифестов. Документация Velero.

Очевидное приемущество – универсальность. Подходит для миграции внутри облака, между облаками, в baremetal инсталляциях.
Недостатки – требуется дополнительное место, относительно низкая скорость. Вначале создается полный бэкап, далее – инкрементные.

Для установки достаточно добавить флаг –use-restic(-use-volume-snapshots=false остается).

У restic есть две стратегии бэкапа: бэкапить все volumes по-умолчанию или бэкапить только указанные. Рассмотрим вторую стратегию (она используется по умолчанию).
Для того, чтобы Volume пода попал в бэкап у пода должна быть следующая аннотация:kubectl -n test-namespaces annotate pod/nginx backup.velero.io/backup-volumes=pvc-volume

После того как аннотации поставлены на все нужные volumes, можно делать бэкап обычной командой.

CSI-Snapshort plugin

Для настройки этого способа должны быть выполнены следующие условия:

  1. В kubernetes имеется нативный механизм создания PV snapshots через CSI. Ваш csi driver должен поддерживать этот механизм;

  2. Должны быть созданы ресурсы StorageClass и SnapshotStorageClass. При этом provisioner в storageClass должен совпадать с driver в SnapshotStorageClass. Если это условие не выполняется, то вы получите следующую ошибку при бэкапировании:

rpc error: code = Unknown desc = failed to get volumesnapshotclass for storageclass <storage-class>: failed to get volumesnapshotclass for provisioner <provisioner>..Ю
  1. У нужного SnapshotStorageClass должен быть установлен label: velero.io/csi-volumesnapshot-class: "true";

  2. PV для бэкапирования должны быть созданы через PVC с указанным storageClass. Если вы создадите PV вручную и укажите PVC через claimRef, то получите следующую ошибку в логах:

rpc error: code = Unknown desc = Cannot snapshot PVC nginx-example/example-pvc, PVC has no storage class

Бэкап/ресторе делается обычной командой. При установке Velero должны быть указаны следующие флаги: --features=EnableCSI --plugins velero/velero-plugin-for-aws:v1.4.1,velero/velero-plugin-for-csi:v0.2.0 --use-volume-snapshots=false

Хотелось бы отметить, что механизм интересный, но все еще находится в beta стадии. Также специфическая логика реализации (совпадение provisioner в StorageClass c driver в snapshotStorageClass) накладывает ряд ограничений.

Заключение

В заключении хотелось бы отметить ряд моментов:

  • На мой взгляд Velero – достаточно развитый и зрелый программный продукт для бэкапирования, который можно использовать в production среде. Активно разрабатывается и поддерживается сообществом;

  • Velero является достаточно удобрым для использования: простая процедура установки, бэкапирования/восстановления, информативные логи;

  • Бэкапирование PV хорошо реализовано через плагины для популярных облачных платформ – AWS, Azure, GCP;

  • Если для вашего облака нет плагина, то следует использовать либо Restic, либо CSI-snapshot. Поддержки CSI-snapshot в вашей инсталляции kubernetes может не быть, также она может оказаться несовместимой с логикой csi-plugin Velero.

Источник: https://habr.com/ru/post/671706/


Интересные статьи

Интересные статьи

Мы продолжаем цикл обучающих статей для начинающих системных администраторов. В этом материале мы разберем Ansible, Ansible-Playbook, и как поднять полноценный веб-сервер с помощью системы автоматизац...
Меня заинтересовал челлендж: в течение 26 недель откладывать N+100 руб, где N - сумма, вложенная на прошлой неделе. Я решил откладывать деньги по средам, составил такую табличку в Google Sheets
NLP - natural language processingБольшая часть данных в мире не структурирована – это просто тексты на русском или на любом другом языке. Извлеченные факты из таких текст...
Лучшие практики Kubernetes. Создание небольших контейнеров Лучшие практики Kubernetes. Организация Kubernetes с пространством имен Лучшие практики Kubernetes. Проверка жизнеспособно...
Прим. перев.: Две недели назад стартовала программа Bug Bounty у Kubernetes — долгожданный и важный шаг для столь масштабного Open Source-проекта. В рамках этой инициативы любой энтузиаст, обнару...