Для улучшения работы сайта мы используем файлы cookies. Оставаясь на сайте, вы соглашаетесь с политикой обработки персональных данных.

Примеры создания резервных копий и восстановления данных

Предварительные условия

Перед началом работы с примерами 1-2 убедитесь, что выполнены следующие условия:

  • Созданы два кластера Nova Container Platform версии 7.0.0 и выше методом IPI в среде ZVirt

  • Требования к первому кластеру:

    • На нем должен быть установлен Harbor (например, из репозитория), в который добавлен любой образ.

    • Установлен MinIO с добавлением сертификата и снятием ограничения на передаваемые данные.

      Подробнее с инструкцией по установке MinIO в Nova Container Platform вы можете ознакомиться в статье Установка MinIO Tenant в Nova Container Platform.

  • Требования ко второму кластеру:

Перед началом работы с примером 3 убедитесь, что выполнены следующие условия:

  • Создан кластер с ванильным Kubernetes

  • В кластере с ванильным Kubernetes установлен NFS как StorageClass

  • Создан кластер Nova Container Platform версии 7.0.0 и выше методом IPI в среде ZVirt

  • Требования к кластеру:

Подготовка к примерам 1-2

Настройка места хранения резервного копирования

Предварительно создайте место хранения на MinIO на первом кластере. Для этого выполните следующие шаги:

  1. Получите сертификат с помощью команды:

    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 = неограниченно)

    Сохраните результат команды для использования в следующих шагах.

  2. Создайте файл cloud-credentials. Этот файл должен содержать Access Key и Secret Key для доступа к MinIO.

    [default]
    aws_access_key_id=minio (1)
    aws_secret_access_key=minio123 (1)
    1 Замените значения на ваши ключи доступа.
  3. Создайте секрет в кластере.

    kubectl create secret generic cloud-credentials -n nova-cluster-backup --from-file cloud=cloud-credentials (1)
    1 cloud-credentials — имя файла с ключами, созданного на предыдущем шаге.
  4. Создайте ресурс 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: aws
    1 s3Url (тип: string) - адрес вашего S3-совместимого хранилища
    2 name (тип: string) - имя секрета с ключами доступа
    3 objectStorage.bucket (тип: string) - имя бакета в вашем S3-совместимом хранилище
    4 objectStorage.caCert (тип: string) - сертификат CA для вашего S3-совместимого хранилища
  5. Примените манифест.

Создание резервной копии

Создайте резервную копию namespace с Harbor на первом кластере. Резервную копию можно создать через манифест или через веб-форму в консоли Nova.

  1. Перейдите в раздел Резервные копии.

  2. Нажмите кнопку Создать резервную копию.

    Создать резервную копию
  3. Далее необходимо задать параметры конфигурации. В верхней части интерфейса выберите один из следующих способов:

    Через YAML-манифест

    Заполните поля манифеста:

    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).

  4. Нажмите кнопку Создать.

  5. Убедитесь, что резервная копия создана успешно и ошибок нет. Подробнее о проверке после создания резервных копий, читайте в статье Проверка после создания резервных копий

1. Пример 1. Восстановление данных Harbor из резервной копии в другом кластере Nova

1.1. Задачи сценария

  • Восстановление Harbor из резервной копии в другом кластере Nova

  • Восстановление в namespace, отличном от оригинального

  • При восстановлении изменить StorageClass и URL для Ingress

1.2. Настройка места хранения резервного копирования

Подключите созданное ранее место хранения резервного копирования на втором кластере по аналогии с пунктом выше.

1.3. Изменение пароля для velero-репозитория

Секрет velero-repo-credentials создается на первом кластере после успешного резервного копирования и содержит пароль доступа к репозиторию с данными томов.

backup ex 3

Скопируйте секрет из первого кластера во второй в то же пространство имен 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 - названия групп ресурсов. Их можно найти с помощью команды:
kubectl api-resources
3 value (тип: string) - значение, которое подставляется в целевой ресурс Kubernetes при выполнении операции replace через JSON Patch в рамках Velero Resource Modifier. Оно определяет новое содержимое для поля, указанного в path, и используется для автоматизации изменений при восстановлении (например, StorageClass для PVC или хосты для Ingress).

Все методы для изменения ресурсов после восстановления вы можете найти в официальной документации Velero.

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

Создайте восстановление с указанием конкретного ресурса с использованием labelSelector на втором кластере.

  1. Перейдите в раздел Резервное копированиеВосстановление.

  2. Нажмите кнопку Создать восстановление.

    backup ex 4

    Создать восстановление можно сделать двумя способами:

    С помощью манифеста

    Выберите способ создания через манифест.

    backup ex 5

    Заполните по аналогии с примером ниже:

    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
    С помощью веб-интерфейса

    Выберите способ создания через форму и заполните поля формы.

    backup ex 6
  3. Нажмите Создать.

  4. Убедитесь, что восстановление завершилось успешно и ошибок нет. В поле Статус должно отобразиться значение Завершен. Убедитесь, что в восстановленном harbor присутствует загруженный ранее образ.

2. Пример 2. Восстановление одного пода и PVC из резервной копии Harbor

2.1. Задачи сценария

  • Восстановление одного пода и PVC для сервиса Harbor из резервной копии, созданной в другом кластере Nova.

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

Создайте восстановление с указанием конкретного ресурса с использованием labelSelector на втором кластере.

  1. Перейдите в раздел Резервное копированиеВосстановление.

  2. Нажмите кнопку Создать восстановление. Создать восстановление можно сделать двумя способами:

    С помощью манифеста

    Выберите способ создания через манифест.

    backup ex 7

    Заполните по аналогии с примером ниже:

    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
    С помощью веб-интерфейса

    Выберите способ создания через форму и заполните поля формы.

    backup ex 8
  3. Нажмите Создать.

  4. Убедитесь, что восстановление завершилось успешно и ошибок нет. В поле Статус должно отобразиться значение Завершен. Убедитесь, что создался под и PVC в namespace harbor

3. Пример 3. Резервное копирование на ванильном Kubernetes и восстановление в Nova

3.1. Задачи сценария

  • Резервное копирование пода и PVC на ванильном Kubernetes

  • Восстановление созданной резервной копии в Nova

3.2. Создание пода с данными в ванильном Kubernetes

  1. Создайте 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
  2. Создайте тестовый файл в поде:

    kubectl exec -it busybox-pod -n test -- touch /tmp/busybox/test.txt

3.3. Подготовка к установке velero в ванильном Kubernetes

  1. На мастер-узле ванильного Kubernetes создайте файл с данными для подключения к MinIO.

    echo '[default]
    aws_access_key_id=minio
    aws_secret_access_key=minio123' > credentials-velero
  2. Создайте в 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

  1. Создайте резервную копию всего 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
  2. Подождите пока не завершится резервное копирование. Для этого выполните команду и убедитесь, что Phase содержит значение Completed.

    kubectl describe backup test-backup -n velero

3.6. Настройка места хранения резервного копирования Nova

Настройте место хранения резервного копирования на MinIO на втором кластере Nova для бакета velero. Для этого выполните следующие шаги:

  1. Получите сертификат с помощью команды:

    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-совместимого хранилища.

    Сохраните результат команды для использования в следующих шагах.

  2. Создайте файл cloud-credentials. Этот файл должен содержать Access Key и Secret Key для доступа к MinIO.

    [default]
    aws_access_key_id=minio (1)
    aws_secret_access_key=minio123 (1)
    1 Замените значения на ваши ключи доступа.
  3. Создайте секрет в кластере.

    kubectl create secret generic cloud-credentials -n nova-cluster-backup --from-file cloud=cloud-credentials (1)
    1 cloud-credentials — имя файла с ключами, созданного на предыдущем шаге.
  4. Создайте ресурс 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: aws
    1 s3Url (тип: string) - адрес вашего S3-совместимого хранилища
    2 name (тип: string) - имя секрета с ключами доступа
    3 objectStorage.bucket (тип: string) - имя бакета в вашем S3-совместимом хранилище
    4 objectStorage.caCert (тип: string) - сертификат CA для вашего S3-совместимого хранилища
  5. Примените манифест.

3.7. Изменение пароля для velero-репозитория

Скопируйте пароль из секрета velero-repo-credentials из ванильного Kubernetes кластера во второй кластер Nova.

kubectl get secrets velero-repo-credentials -n velero -o yaml
backup ex 3

Сохраните старый пароль второго кластера: после восстановления данных его нужно вернуть обратно.

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 - названия групп ресурсов. Их можно найти с помощью команды:
kubectl api-resources

Все методы для изменения ресурсов после восстановления вы можете найти в официальной документации Velero.

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

Создайте восстановление во втором кластере Nova.

  1. Перейдите в раздел Резервное копированиеВосстановление.

  2. Нажмите кнопку Создать восстановление. Восстановление можно создать двумя способами:

    С помощью манифеста

    Выберите способ создания через манифест.

    backup ex 9

    Заполните по аналогии с примером ниже:

    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
    С помощью веб-интерфейса

    Выберите способ создания через форму и заполните поля формы.

    backup ex 10
  3. Нажмите Создать.

  4. Убедитесь, что восстановление завершилось успешно и ошибок нет. В поле Статус должно отобразиться значение Завершен. Убедитесь, что создался под и PVC в namespace test. Убедитесь, что файл появился в PVC с помощью команды:

    kubectl exec -it busybox-pod -n test -- ls /tmp/busybox/test.txt