Примеры создания резервных копий и восстановления данных
Предварительные условия
Перед началом работы с примерами 1-2 убедитесь, что выполнены следующие условия:
-
Созданы два кластера Nova Container Platform версии 7.0.0 и выше методом IPI в среде ZVirt
-
Требования к первому кластеру:
-
На нем должен быть установлен Harbor (например, из репозитория), в который добавлен любой образ.
-
Установлен MinIO с добавлением сертификата и снятием ограничения на передаваемые данные.
Подробнее с инструкцией по установке MinIO в Nova Container Platform вы можете ознакомиться в статье Установка MinIO Tenant в Nova Container Platform.
-
-
Требования ко второму кластеру:
-
На нем должен быть установлен модуль Longhorn.
Подробнее с инструкцией по работе с Longhorn в Nova Container Platform вы можете ознакомиться в разделе Longhorn (Tech Preview).
-
Должен быть установлен модуль Data Protection. Для этого используйте манифесты из ссылок ниже на обоих кластерах:
-
Настройка резервного копирования с помощью регулярного задания CronJob
-
Перед началом работы с примером 3 убедитесь, что выполнены следующие условия:
-
Создан кластер с ванильным Kubernetes
-
В кластере с ванильным Kubernetes установлен NFS как StorageClass
-
Создан кластер Nova Container Platform версии 7.0.0 и выше методом IPI в среде ZVirt
-
Требования к кластеру:
-
Установлен MinIO с добавлением сертификата и снятием ограничения на передаваемые данные.
Подробнее с инструкцией по установке MinIO в Nova Container Platform вы можете ознакомиться в статье Установка MinIO Tenant в Nova Container Platform.
-
На нем должен быть установлен модуль Longhorn.
Подробнее с инструкцией по работе с Longhorn в Nova Container Platform вы можете ознакомиться в разделе Longhorn (Tech Preview).
-
Должен быть установлен модуль Data Protection. Для этого используйте манифесты из ссылок ниже на обоих кластерах:
-
Настройка резервного копирования с помощью регулярного задания CronJob
-
Подготовка к примерам 1-2
Настройка места хранения резервного копирования
Предварительно создайте место хранения на MinIO на первом кластере. Для этого выполните следующие шаги:
-
Получите сертификат с помощью команды:
openssl s_client -showcerts -connect <MINIO_API_FQDN>:<MINIO_API_PORT> -servername <MINIO_API_FQDN> < /dev/null 2>/dev/null | openssl x509 -outform PEM | base64 -w0 (1)1 Добавьте имя сервиса MinIO API и порт Пример аннотации для Ingress MinIO (если не используете свой сертификат и для снятия лимитов):metadata: annotations: cert-manager.io/cluster-issuer: nova-dynamic-internal-cluster-issuer cert-manager.io/common-name: <MINIO_API_FQDN> (1) nginx.ingress.kubernetes.io/backend-protocol: HTTPS nginx.ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/ssl-redirect: 'true' nginx.ingress.kubernetes.io/proxy-body-size: "0" (2)1 FQDN вашего MinIO 2 Снимает ограничение на размер передаваемых данных (0 = неограниченно) Сохраните результат команды для использования в следующих шагах.
-
Создайте файл
cloud-credentials. Этот файл должен содержать Access Key и Secret Key для доступа к MinIO.[default] aws_access_key_id=minio (1) aws_secret_access_key=minio123 (1)1 Замените значения на ваши ключи доступа. -
Создайте секрет в кластере.
kubectl create secret generic cloud-credentials -n nova-cluster-backup --from-file cloud=cloud-credentials (1)1 cloud-credentials— имя файла с ключами, созданного на предыдущем шаге. -
Создайте ресурс BackupStorageLocation в пространстве имен
nova-cluster-backup. В манифест подставьте данные, полученные на предыдущих шагах. Ниже представлен пример манифеста:apiVersion: velero.io/v1 kind: BackupStorageLocation metadata: name: default namespace: nova-cluster-backup spec: config: region: ru-dc-1 s3ForcePathStyle: 'true' s3Url: https://<MINIO_API_FQDN> (1) credential: key: cloud name: cloud-credentials (2) default: true objectStorage: bucket: velero-backup-bucket (3) caCert: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0 (4) provider: aws1 s3Url(тип: string) - адрес вашего S3-совместимого хранилища2 name(тип: string) - имя секрета с ключами доступа3 objectStorage.bucket(тип: string) - имя бакета в вашем S3-совместимом хранилище4 objectStorage.caCert(тип: string) - сертификат CA для вашего S3-совместимого хранилища -
Примените манифест.
Создание резервной копии
Создайте резервную копию namespace с Harbor на первом кластере. Резервную копию можно создать через манифест или через веб-форму в консоли Nova.
-
Перейдите в раздел Резервные копии.
-
Нажмите кнопку Создать резервную копию.
-
Далее необходимо задать параметры конфигурации. В верхней части интерфейса выберите один из следующих способов:
Через YAML-манифест
Заполните поля манифеста:
Пример конфигурационного файла приведен ниже:
apiVersion: velero.io/v1 kind: Backup metadata: name: harbor (1) namespace: nova-cluster-backup (2) spec: csiSnapshotTimeout: 10m0s defaultVolumesToFsBackup: true includedNamespaces: (3) - harbor includedResources: - '*' itemOperationTimeout: 4h0m0s snapshotMoveData: false snapshotVolumes: false storageLocation: default (4) ttl: 24h0m0s (5)1 metadata.name(тип данных:string) - имя ресурса Backup. Должно быть уникальным в Namespace.2 metadata.namespace(тип данных:string) - пространство имен, в котором расположен ресурс Backup.3 spec.includedNamespaces(тип данных:[]string) - массив пространств имен для включения в резервную копию.*или если не указан, включает все пространства имен.4 spec.storageLocation(тип данных:string) - имя объекта StorageLocation, который будет использоваться для резервного копирования.5 spec.ttl(тип данных:string) - время до удаления резервной копии.Через заполнение формы
Некоторые поля спецификации могут не отображаться в этом представлении формы. Пожалуйста, выберите представление YAML для детальной настройки.
-
Заполните поле Имя. Параметр отвечает за имя ресурса Backup. Должно быть уникальным в Namespace.
-
Заполните поле Namespace. Параметр отвечает за пространство имен, в котором расположен ресурс Backup (пример:
nova-cluster-backup). -
Необязательно. Заполните поле Включить ресурсы - массив ресурсов для включения в резервную копию.
-
Необязательно. Заполните поле Включить пространства имен - массив пространств имен для включения в резервную копию (пример:
harbor). -
Заполните поле TTL - время до удаления резервной копии (пример:
24h0m0s). -
Заполните поле Место резервного копирования - местоположение для хранения резервных копий (пример:
default).
-
-
Нажмите кнопку Создать.
-
Убедитесь, что резервная копия создана успешно и ошибок нет. Подробнее о проверке после создания резервных копий, читайте в статье Проверка после создания резервных копий
1. Пример 1. Восстановление данных Harbor из резервной копии в другом кластере Nova
1.1. Задачи сценария
-
Восстановление Harbor из резервной копии в другом кластере Nova
-
Восстановление в namespace, отличном от оригинального
-
При восстановлении изменить StorageClass и URL для Ingress
1.2. Настройка места хранения резервного копирования
Подключите созданное ранее место хранения резервного копирования на втором кластере по аналогии с пунктом выше.
1.3. Изменение пароля для velero-репозитория
Секрет velero-repo-credentials создается на первом кластере после успешного резервного копирования и содержит пароль доступа к репозиторию с данными томов.
Скопируйте секрет из первого кластера во второй в то же пространство имен nova-cluster-backup перед запуском восстановления.
|
Сохраните старый пароль второго кластера: после восстановления данных его нужно вернуть обратно. |
1.4. Настройка изменения ресурсов в процессе восстановления
Создайте ConfigMap для изменения настроек ресурсов при восстановлении из резервного копирования на втором кластере. ConfigMap позволяет после восстановления заменить StorageClass с oVirt на Longhorn для PVC и ссылку для Ingress. Ниже представлен пример конфигурации.
Пример конфигурации
kind: ConfigMap
apiVersion: v1
metadata:
name: modifier
namespace: nova-cluster-backup
labels: (1)
velero.io/change-storage-class: RestoreItemAction
velero.io/plugin-config: ''
data:
resource-modifiers.yaml: |
version: v1
resourceModifierRules:
- conditions:
groupResource: persistentvolumeclaims (2)
patches:
- operation: replace
path: "/spec/storageClassName"
value: "longhorn-storage-single-replica"
- conditions:
groupResource: ingresses.networking.k8s.io (2)
patches:
- operation: replace
path: "/metadata/annotations/cert-manager.io~1common-name"
value: "harbor.apps.<name>.platform" (3)
- operation: replace
path: "/spec/tls/0/hosts/0"
value: "harbor.apps.<name>.platform" (3)
- operation: replace
path: "/spec/tls/0/secretName"
value: "harbor.apps.<name>.platform" (3)
- operation: replace
path: "/spec/rules/0/host"
value: "harbor.apps.<name>.platform" (3)
| 1 | labels - указывать не обязательно, но в этом случае данный ConfigMap не отобразится в веб интерфейсе при настройке восстановления. Также если присутствуют несколько ConfigMap с данными лейблами – возникнет ошибка при восстановлении. |
| 2 | groupResource - названия групп ресурсов. Их можно найти с помощью команды:
|
| 3 | value (тип: string) - значение, которое подставляется в целевой ресурс Kubernetes при выполнении операции replace через JSON Patch в рамках Velero Resource Modifier. Оно определяет новое содержимое для поля, указанного в path, и используется для автоматизации изменений при восстановлении (например, StorageClass для PVC или хосты для Ingress). |
Все методы для изменения ресурсов после восстановления вы можете найти в официальной документации Velero.
1.5. Восстановление из резервной копии
Создайте восстановление с указанием конкретного ресурса с использованием labelSelector на втором кластере.
-
Перейдите в раздел Резервное копирование→Восстановление.
-
Нажмите кнопку Создать восстановление.
Создать восстановление можно сделать двумя способами:
С помощью манифеста
Выберите способ создания через манифест.
Заполните по аналогии с примером ниже:
apiVersion: velero.io/v1 kind: Restore metadata: name: res1 namespace: nova-cluster-backup spec: backupName: harbor itemOperationTimeout: 4h namespaceMapping: harbor: test restorePVs: true preserveNodePorts: true includedResources: - '*' resourceModifier: kind: ConfigMap name: modifierС помощью веб-интерфейса
Выберите способ создания через форму и заполните поля формы.
-
Нажмите Создать.
-
Убедитесь, что восстановление завершилось успешно и ошибок нет. В поле Статус должно отобразиться значение Завершен. Убедитесь, что в восстановленном harbor присутствует загруженный ранее образ.
2. Пример 2. Восстановление одного пода и PVC из резервной копии Harbor
2.1. Задачи сценария
-
Восстановление одного пода и PVC для сервиса Harbor из резервной копии, созданной в другом кластере Nova.
2.2. Восстановление из резервной копии
Создайте восстановление с указанием конкретного ресурса с использованием labelSelector на втором кластере.
-
Перейдите в раздел Резервное копирование→Восстановление.
-
Нажмите кнопку Создать восстановление. Создать восстановление можно сделать двумя способами:
С помощью манифеста
Выберите способ создания через манифест.
Заполните по аналогии с примером ниже:
apiVersion: velero.io/v1 kind: Restore metadata: name: res2 namespace: nova-cluster-backup spec: backupName: harbor scheduleName: '' itemOperationTimeout: 4h namespaceMapping: {} restorePVs: true preserveNodePorts: true includedResources: - pods - persistentvolumeclaims - persistentvolumes labelSelector: matchLabels: component: redisС помощью веб-интерфейса
Выберите способ создания через форму и заполните поля формы.
-
Нажмите Создать.
-
Убедитесь, что восстановление завершилось успешно и ошибок нет. В поле Статус должно отобразиться значение Завершен. Убедитесь, что создался под и PVC в namespace
harbor
3. Пример 3. Резервное копирование на ванильном Kubernetes и восстановление в Nova
3.1. Задачи сценария
-
Резервное копирование пода и PVC на ванильном Kubernetes
-
Восстановление созданной резервной копии в Nova
3.2. Создание пода с данными в ванильном Kubernetes
-
Создайте namespace, под и PVC, используя NFS StorageClass. Ниже приведен пример манифеста (namespace, Pod, PVC).
Пример манифеста
apiVersion: v1 kind: Namespace metadata: name: test --- apiVersion: v1 kind: Pod metadata: name: busybox-pod namespace: test spec: containers: - name: busybox image: hub-nova.orionsoft.ru/library/busybox:latest command: ["/bin/sh", "-c", "sleep 3600"] volumeMounts: - mountPath: /tmp/busybox name: busybox-storage volumes: - name: busybox-storage persistentVolumeClaim: claimName: busybox-pvc --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: busybox-pvc namespace: test spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: nfs-client -
Создайте тестовый файл в поде:
kubectl exec -it busybox-pod -n test -- touch /tmp/busybox/test.txt
3.3. Подготовка к установке velero в ванильном Kubernetes
-
На мастер-узле ванильного Kubernetes создайте файл с данными для подключения к MinIO.
echo '[default] aws_access_key_id=minio aws_secret_access_key=minio123' > credentials-velero -
Создайте в MinIO новый бакет с именем
velero.Имя бакета должно быть уникальным: он будет инициализирован для использования kopia. Используйте имя
velero.
3.4. Установка velero через helm в ванильный Kubernetes
Установите velero через helm, указав те же параметры BackupStorageLocation, что и при настройке в кластере Nova.
helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts
helm install velero vmware-tanzu/velero \
--namespace velero \
--create-namespace \
--set-file credentials.secretContents.cloud=./credentials-velero \
--set configuration.backupStorageLocation[0].name=default \
--set configuration.backupStorageLocation[0].provider=aws \
--set configuration.backupStorageLocation[0].bucket=velero \
--set configuration.backupStorageLocation[0].config.region=ru-dc-1 \
--set configuration.backupStorageLocation[0].config.s3ForcePathStyle=true \
--set configuration.backupStorageLocation[0].config.s3Url=https://<MINIO_API_FQDN> \ (1)
--set snapshotsEnabled=false \
--set deployNodeAgent=true \
--set uploaderType=kopia \
--set image.repository=hub-nova.orionsoft.ru/library/velero \
--set image.tag=v1.15.2 \
--set nodeAgent.image.repository=hub-nova.orionsoft.ru/library/velero \
--set nodeAgent.image.tag=v1.15.2 \
--set kubectl.image.repository=hub-nova.orionsoft.ru/library/kubectl \
--set kubectl.image.tag=1.33 \
--set initContainers[0].name=velero-plugin-for-aws \
--set initContainers[0].image=hub-nova.orionsoft.ru/library/velero-plugin-for-aws:v1.11.1 \
--set initContainers[0].volumeMounts[0].mountPath='/target' \
--set initContainers[0].volumeMounts[0].name=plugins \
--set configuration.backupStorageLocation[0].caCert=LS0tLS1CRUdJTiBDRVJUSUZJQ0FU (2)
| 1 | Замените <MINIO_API_FQDN> на адрес вашего MinIO. |
| 2 | Добавьте сертификат. |
3.5. Создание резервной копии namespace test в ванильном Kubernetes
-
Создайте резервную копию всего namespace test с помощью манифеста:
apiVersion: velero.io/v1 kind: Backup metadata: name: test-backup namespace: velero spec: csiSnapshotTimeout: 10m0s defaultVolumesToFsBackup: true includedNamespaces: - test includedResources: - '*' itemOperationTimeout: 4h0m0s snapshotMoveData: false storageLocation: default ttl: 720h0m0s -
Подождите пока не завершится резервное копирование. Для этого выполните команду и убедитесь, что Phase содержит значение Completed.
kubectl describe backup test-backup -n velero
3.6. Настройка места хранения резервного копирования Nova
Настройте место хранения резервного копирования на MinIO на втором кластере Nova для бакета velero. Для этого выполните следующие шаги:
-
Получите сертификат с помощью команды:
openssl s_client -showcerts -connect <MINIO_API_FQDN>:<MINIO_API_PORT> -servername <MINIO_API_FQDN> < /dev/null 2>/dev/null | openssl x509 -outform PEM | base64 -w0 (1)1 Замените имя хоста и порт на адрес вашего S3-совместимого хранилища. Сохраните результат команды для использования в следующих шагах.
-
Создайте файл
cloud-credentials. Этот файл должен содержать Access Key и Secret Key для доступа к MinIO.[default] aws_access_key_id=minio (1) aws_secret_access_key=minio123 (1)1 Замените значения на ваши ключи доступа. -
Создайте секрет в кластере.
kubectl create secret generic cloud-credentials -n nova-cluster-backup --from-file cloud=cloud-credentials (1)1 cloud-credentials— имя файла с ключами, созданного на предыдущем шаге. -
Создайте ресурс BackupStorageLocation в пространстве имен
nova-cluster-backup. В манифест подставьте данные, полученные на предыдущих шагах. Ниже представлен пример манифеста:apiVersion: velero.io/v1 kind: BackupStorageLocation metadata: name: velero namespace: nova-cluster-backup spec: config: region: ru-dc-1 s3ForcePathStyle: 'true' s3Url: https://<MINIO_API_FQDN> (1) credential: key: cloud name: cloud-credentials (2) objectStorage: bucket: velero (3) caCert: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0 (4) provider: aws1 s3Url(тип: string) - адрес вашего S3-совместимого хранилища2 name(тип: string) - имя секрета с ключами доступа3 objectStorage.bucket(тип: string) - имя бакета в вашем S3-совместимом хранилище4 objectStorage.caCert(тип: string) - сертификат CA для вашего S3-совместимого хранилища -
Примените манифест.
3.7. Изменение пароля для velero-репозитория
Скопируйте пароль из секрета velero-repo-credentials из ванильного Kubernetes кластера во второй кластер Nova.
kubectl get secrets velero-repo-credentials -n velero -o yaml
|
Сохраните старый пароль второго кластера: после восстановления данных его нужно вернуть обратно. |
3.8. Настройка изменения ресурсов в процессе восстановления
Измените созданный ранее ConfigMap для изменения настроек ресурсов при восстановлении из резервного копирования на втором кластере Nova. Данный ConfigMap позволяет после восстановления ресурсов изменить StorageClass с NFS на Longhorn для PVC.
kind: ConfigMap
apiVersion: v1
metadata:
name: modifier
namespace: nova-cluster-backup
labels: (1)
velero.io/change-storage-class: RestoreItemAction
velero.io/plugin-config: ''
data:
resource-modifiers.yaml: |
version: v1
resourceModifierRules:
- conditions:
groupResource: persistentvolumeclaims (2)
patches:
- operation: replace
path: "/spec/storageClassName"
value: "longhorn-storage-single-replica"
| 1 | labels (тип: map[string]string) - метки для фильтрации ресурсов. labels можно не указывать, но в этом случае данный ConfigMap не отобразится в веб интерфейсе при настройке восстановления. Также если присутствуют несколько ConfigMap с данными лейблами – возникнет ошибка при восстановлении. |
| 2 | groupResource - названия групп ресурсов. Их можно найти с помощью команды:
|
Все методы для изменения ресурсов после восстановления вы можете найти в официальной документации Velero.
3.9. Восстановление из резервной копии
Создайте восстановление во втором кластере Nova.
-
Перейдите в раздел Резервное копирование→Восстановление.
-
Нажмите кнопку Создать восстановление. Восстановление можно создать двумя способами:
С помощью манифеста
Выберите способ создания через манифест.
Заполните по аналогии с примером ниже:
apiVersion: velero.io/v1 kind: Restore metadata: name: res3 namespace: nova-cluster-backup spec: backupName: test-backup itemOperationTimeout: 4h namespaceMapping: {} restorePVs: true preserveNodePorts: true includedResources: - '*' resourceModifier: kind: ConfigMap name: modifierС помощью веб-интерфейса
Выберите способ создания через форму и заполните поля формы.
-
Нажмите Создать.
-
Убедитесь, что восстановление завершилось успешно и ошибок нет. В поле Статус должно отобразиться значение Завершен. Убедитесь, что создался под и PVC в namespace
test. Убедитесь, что файл появился в PVC с помощью команды:kubectl exec -it busybox-pod -n test -- ls /tmp/busybox/test.txt