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

Перенос данных из любого Kubernetes кластера в Nova Container Platform

1. Сценарий

Требуется перенести все ресурсы (включая данные на PVC) в определенном namespace из обычного Kubernetes кластера в Nova Container Platform.

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

  • В Nova Container Platform установлен модуль Data Protection

  • Подготовлен и настроен сервер с MinIO

  • В MinIO создан бакет с именем velero-backup-bucket

  • В MinIO создан Access Key

3. Настройка хранилища резервных копий

В данном примере используется MinIO, но можно использовать любое S3-совместимое хранилище.

3.1. Nova Container Platform

  1. Создайте файл с именем cloud-credentials. Он должен содержать Access и Secret ключи для MinIO. Далее представлен пример файла. Используйте его, чтобы создать свой.

    [default]
    aws_access_key_id = minio
    aws_secret_access_key = minio123
  2. Создайте секрет с использованием файла cloud-credentials с помощью команды:

    kubectl create secret generic cloud-credentials -n nova-cluster-backup --from-file cloud=cloud-credentials
  3. Получите сертификат MinIO и закодируйте его в base64 формате.

    openssl s_client -showcerts -connect minioapi.mycompany.local:443 -servername minioapi.mycompany.local < /dev/null 2>/dev/null | openssl x509 -outform PEM | base64 -w0
  4. Для настройки места хранения резервного копирования используйте специальный манифест. Далее представлен пример манифеста и описание его полей.

    apiVersion: velero.io/v1
    kind: BackupStorageLocation
    metadata:
      name: minio (1)
      namespace: nova-cluster-backup (2)
    spec:
      config:
        region: ru-dc-1 (3)
        s3ForcePathStyle: 'true'
        s3Url: https://minioapi.mycompany.local (4)
      credential:
        key: cloud
        name: cloud-credentials (5)
      objectStorage:
        bucket: velero-backup-bucket (6)
        caCert: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0 (7)
      provider: aws
    1 name (тип string) - имя CR BackupStorageLocation;
    2 namespace (тип string) - пространство имен, где регистрируется объектное хранилище. Должно быть всегда nova-cluster-backup;
    3 region (тип string) - регион для подключения к объектному хранилищу;
    4 s3Url (тип string) - точка подключения к объектному хранилищу;
    5 credential (тип string) - имя секрета доступа к объектному хранилищу;
    6 bucket (тип string) - имя бакета для хранения резервных копий;
    7 caCert (тип string) - сертификат закодированный в base64 формате.

3.2. Другие Kubernetes кластера

  1. Создайте файл с именем cloud-credentials. Он должен содержать Access и Secret ключи для MinIO. Далее представлен пример файла. Используйте его, чтобы создать свой.

    [default]
    aws_access_key_id = minio
    aws_secret_access_key = minio123
  2. Получите сертификат MinIO и закодируйте его в base64 формате.

    openssl s_client -showcerts -connect minioapi.mycompany.local:443 -servername minioapi.mycompany.local < /dev/null 2>/dev/null | openssl x509 -outform PEM | base64 -w0
  3. Используя Helm установите Velero в ваш Kubernetes кластер и настройки места хранения резервного копирования

    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 \ (1)
        --set configuration.backupStorageLocation[0].name=minio \ (2)
        --set configuration.backupStorageLocation[0].provider=aws \
        --set configuration.backupStorageLocation[0].bucket=velero-backup-bucket \ (3)
        --set configuration.backupStorageLocation[0].config.region=ru-dc-1 \ (4)
        --set configuration.backupStorageLocation[0].config.s3ForcePathStyle=true \
        --set configuration.backupStorageLocation[0].config.s3Url=https://minioapi.mycompany.local \ (5)
        --set snapshotsEnabled=false \
        --set deployNodeAgent=true \
        --set uploaderType=kopia \ (6)
        --set image.repository=hub.nova-platform.io/registry/velero/velero \ (7)
        --set image.tag=v1.15.2 \ (7)
        --set nodeAgent.image.repository=hub.nova-platform.io/registry/velero/velero \ (7)
        --set nodeAgent.image.tag=v1.15.2 \ (7)
        --set kubectl.image.repository=docker.io/bitnamilegacy/kubectl \ (8)
        --set kubectl.image.tag=1.31 \ (8)
        --set initContainers[0].name=velero-plugin-for-aws \
        --set initContainers[0].image=hub.nova-platform.io/registry/velero/velero-plugin-for-aws:v1.12.2 \ (7)
        --set initContainers[0].volumeMounts[0].mountPath='/target' \
        --set initContainers[0].volumeMounts[0].name=plugins \
        --set configuration.backupStorageLocation[0].caCert=LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0 (9)
    1 файл содержащий Access и Secret ключи для MinIO
    2 имя CR BackupStorageLocation
    3 имя бакета для хранения резервных копий
    4 регион для подключения к объектному хранилищу
    5 точка подключения к объектному хранилищу
    6 используем kopia для резервного копирования данных из PVC
    7 нужно использовать такие же версии Velero и плагина для AWS, как и в Nova Container Platform. Убедитесь, что версии совпадают.
    8 нужно указать версию вашего Kubernetes кластера или выше
    9 сертификат закодированный в base64 формате

4. Подготовка данных для резервного копирования

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

  1. В вашем Kubernetes кластере создайте namespace с именем test, под и PVC. В данном примере используется NFS как StorageClass. Измените его на используемый в вашей инфраструктуре.

    apiVersion: v1
    kind: Namespace
    metadata:
      name: test
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: busybox-pod
      namespace: test
    spec:
      containers:
      - name: busybox
        image: 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

5. Резервное копирование

  1. В вашем Kubernetes кластере сделайте резервную копию всего namespace test используя следующий манифест.

    apiVersion: velero.io/v1
    kind: Backup
    metadata:
      name: test-backup (1)
      namespace: velero (2)
    spec:
      csiSnapshotTimeout: 10m0s
      defaultVolumesToFsBackup: true (3)
      includedNamespaces: (4)
      - test
      includedResources: (5)
        - '*'
      itemOperationTimeout: 4h0m0s
      snapshotMoveData: false
      storageLocation: minio (6)
      ttl: 720h0m0s (7)
    1 name (тип string) - имя ресурса для резервного копирования;
    2 namespace (тип string) - пространство имен, в котором установлен Velero. Должно быть velero;
    3 defaultVolumesToFsBackup (тип bool) - использование kopia для резервного копирования файлов внутри PVC;
    4 includedNamespaces (тип list) - резервное копирование указанного пространства имен. В данном случае - test;
    5 includedResources (тип list) - резервное копирование указанных ресурсов. В данном случае - всех;
    6 storageLocation (тип string) - выбор созданного ранее места хранения резервного копирования;
    7 ttl (тип string) - время хранения резервной копии.
  2. Подождите пока не завершится резервное копирование. Для этого выполните следующую команду и убедитесь, что Phase содердит значение Completed.

    kubectl describe backup test-backup -n velero
  3. При резервном копировании с помощью kopia - данные хранятся в MinIO в зашифрованном виде. Получите пароль с помощью команды.

    kubectl get secrets velero-repo-credentials -n velero -o yaml

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

  1. В веб-интерфейсе Nova Container Platform убедитесь, что реезервное копирование появилось. Перейдите на вкладку Резервное копированиеРезервные копии.

  2. Выберите namespace nova-cluster-backup или все.

  3. Перейдите на вкладку РесурсыSecrets. Выберите секрет velero-repo-credentials и перейдите на вкладку YAML.

  4. Замените пароль от репозитория на тот, что вы получили из вашего Kubernetes кластера на этапе получения пароля.

  5. Убедитесь, что DaemonSet node-agent установил поды на Worker-узлы.

  6. Необязательно. Если необходимо изменить ресурсы при восстановлении (например, указать другой StorageClass), то создайте следующий ConfigMap:

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: modifier (1)
      namespace: nova-cluster-backup (2)
    data:
      resource-modifiers.yaml: |
        version: v1
        resourceModifierRules:
        - conditions:
            groupResource: persistentvolumeclaims (3)
          patches:
          - operation: replace
            path: "/spec/storageClassName"
            value: "longhorn-storage-single-replica"
    1 name (тип string) - имя ConfigMap;
    2 namespace (тип string) - пространство имен. Должно быть nova-cluster-backup;
    3 groupResource (тип string) - стандартный патч для изменения StorageClass.
  7. Создайте ресурс для восстановления данных из резервной копии.

    apiVersion: velero.io/v1
    kind: Restore
    metadata:
      name: test-restore (1)
      namespace: nova-cluster-backup (2)
    spec:
      backupName: test-backup (3)
      itemOperationTimeout: 4h
      namespaceMapping: {} (4)
      restorePVs: true (5)
      preserveNodePorts: true
      includedResources: (6)
        - '*'
      resourceModifier: (7)
        kind: ConfigMap
        name: modifier
    1 name (тип string) - имя ресурса для восстановления данных из резервной копии;
    2 namespace (тип string) - пространство имен. Должно быть nova-cluster-backup;
    3 backupName (тип string) - имя резервной копии;
    4 namespaceMapping (тип map) - используется только если нужно изменить имя namespace при восстановлении;
    5 restorePVs (тип bool) - восстанавливаются данные на PVC;
    6 includedResources (тип list) - включены указанные ресурсы. Укажите *, если хотите выбрать все ресурсы;
    7 resourceModifier (тип object) - необязателен к заполнению. Указывается ConfigMap с патчем для изменения ресурсов при восстановлении. Необходимо удалить, если ничего не меняется.
  8. Убедитесь, что восстановление создано успешно и нет никаких ошибок.

    Могут возникнуть предупреждения, однако это не критично.

  9. Убедитесь, что все ресурсы восстановились и созданный ранее файл существует.

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

7. Изучение ошибок

Все ошибки связанные с резервным копированием и восстановлением можно найти в логах пода velero.