В данной статье рассмотрен процесс бэкапирования 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 следующий:
Установка 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
Подготовка конфигурации
На текущем шаге создадим файл
credentials-velero
с учетными данными s3 бакета следующего содержания:
cat credentials-velero
[default]
aws_access_key_id = <key>
aws_secret_access_key = <secret>
Установка
По умолчанию команда установки создает 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>
Проверка
Работспособность проверяется командой
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"
Первый бэкап
В velero можно сделать бэкап кластера целиком, неймспейса или ресурсов по лейблам. Сделаем бэкап неймспейса с помощью команды
velero backup create test-backup --include-namespaces test-namespace
Результат можно проверить командой
velero backup describe test-backup.
Восстановление из бэкапа
Для восстановления выполним команду
velero restore create --from-backup test-backup --namespace-mappings test-namespace:test-namespace-restore
.Соответственно будет создан namespace
test-namespace-restore
и в нем развернуты ресурсы.
В итоге у нас получилось забэкапить/восстановить манифесты. Однако как же быть с данными в PV? Рассмотрим далее.
Варианты бэкапирования PV
Возможны следующие варианты:
Plugin для Cloud Provider;
Restic;
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
Для настройки этого способа должны быть выполнены следующие условия:
В kubernetes имеется нативный механизм создания PV snapshots через CSI. Ваш csi driver должен поддерживать этот механизм;
Должны быть созданы ресурсы
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>..Ю
У нужного SnapshotStorageClass должен быть установлен label:
velero.io/csi-volumesnapshot-class: "true"
;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.