• Русский
  • Использование Velero

    Velero — это инструмент с открытым исходным кодом для резервного копирования и миграции кластеров Kubernetes от VMware. KubeVirt предоставляет плагин Velero для поддержки резервного копирования и восстановления виртуальных машин.

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

    • Версия Kubernetes: 1.20 или выше (требование Velero)
    • S3-хранилище: для BackupStorageLocation Velero используйте объектное хранилище Ceph или MinIO, предоставляемое платформой
    • Блочное хранилище: Ceph RBD, предоставляемое платформой

    Шаги выполнения

    Подготовка

    1. Разверните Velero на платформе ACP через Platform Management → Cluster Management → Backup and Recovery → Backup Repository. Используйте данные объектного хранилища для создания репозитория резервных копий.

    2. Включите функцию CSI и добавьте плагин KubeVirt:

      kubectl edit deploy -n cpaas-system velero

      Добавьте следующее в деплоймент Velero:

      containers:
      - args:
        - server
        - --uploader-type=restic
        - --namespace=cpaas-system
        - --features=EnableCSI
        command:
        - /velero

      Добавьте в секцию initContainers:

      initContainers:
      - image: registry.example.org/3rdparty/kubevirt/kubevirt-velero-plugin:v0.7.0
        imagePullPolicy: IfNotPresent
        name: velero-plugin-kubevirt
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /target
          name: plugins
    3. Проверьте установку плагина KubeVirt:

      POD=$(kubectl -n cpaas-system get pod -l app.kubernetes.io/name=velero -o jsonpath='{.items[0].metadata.name}')
      kubectl -n cpaas-system exec -ti "$POD" -- /velero get plugins | grep kubevirt

      Пример вывода:

      kubevirt-velero-plugin/backup-datavolume-action               BackupItemAction
      kubevirt-velero-plugin/backup-datavolume-action               BackupItemAction
      kubevirt-velero-plugin/backup-virtualmachine-action           BackupItemAction
      kubevirt-velero-plugin/backup-virtualmachine-action           BackupItemAction
      kubevirt-velero-plugin/backup-virtualmachineinstance-action   BackupItemAction
      kubevirt-velero-plugin/backup-virtualmachineinstance-action   BackupItemAction
      kubevirt-velero-plugin/restore-pod-action                     RestoreItemAction
      kubevirt-velero-plugin/restore-pod-action                     RestoreItemAction
      kubevirt-velero-plugin/restore-pvc-action                     RestoreItemAction
      kubevirt-velero-plugin/restore-pvc-action                     RestoreItemAction
      kubevirt-velero-plugin/restore-vm-action                      RestoreItemAction
      kubevirt-velero-plugin/restore-vm-action                      RestoreItemAction
      kubevirt-velero-plugin/restore-vmi-action                     RestoreItemAction
      kubevirt-velero-plugin/restore-vmi-action                     RestoreItemAction
    4. Настройте node-agent для монтирования директории kubelet хоста и включите привилегированный режим (требуется для передачи данных через /var/lib/kubelet):

      kubectl edit ds -n cpaas-system node-agent

      Обновите следующим образом:

      securityContext:
        privileged: true
      volumeMounts:
      - mountPath: /host_pods
        mountPropagation: HostToContainer
        name: host-pods
      - mountPath: /var/lib/kubelet/plugins
        mountPropagation: HostToContainer
        name: host-plugins
      - mountPath: /scratch
        name: scratch
      securityContext:
        runAsUser: 0
      volumes:
      - hostPath:
          path: /var/lib/kubelet/pods
          type: ""
        name: host-pods
      - hostPath:
          path: /var/lib/kubelet/plugins
          type: ""
        name: host-plugins
      - emptyDir: {}
        name: scratch

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

    1. Создайте виртуальную машину с необходимым количеством дисков.

    2. Создайте ресурс резервного копирования:

      apiVersion: velero.io/v1
      kind: Backup
      metadata:
        annotations:
          velero.io/resource-timeout: 10m0s
          velero.io/source-cluster-k8s-gitversion: v1.30.4
          velero.io/source-cluster-k8s-major-version: "1"
          velero.io/source-cluster-k8s-minor-version: "30"
        labels:
          velero.io/storage-location: default
        name: example-backup
        namespace: cpaas-system
      spec:
        csiSnapshotTimeout: 10m0s
        defaultVolumesToFsBackup: false
        hooks: {}
        includedNamespaces:
        - example-namespace
        itemOperationTimeout: 4h0m0s
        metadata: {}
        snapshotMoveData: true
        storageLocation: default
        ttl: 720h0m0s
    3. Дождитесь завершения резервного копирования и проверьте его:

      POD=$(kubectl -n cpaas-system get pod -l app.kubernetes.io/name=velero -o jsonpath='{.items[0].metadata.name}')
      kubectl -n cpaas-system exec -ti "$POD" -- /velero backup describe example-backup --details
      kubectl -n cpaas-system exec -ti "$POD" -- /velero backup get example-backup

      Пример вывода:

      NAME             STATUS                       ERRORS   WARNINGS   CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
      example-backup   WaitingForPluginOperations   0        0          2025-01-25 14:14:08 +0000 UTC   29d       default            <none>
    4. Проверьте статус dataupload для передачи данных:

      kubectl get dataupload -n cpaas-system

      Пример вывода:

      NAME                   STATUS      STARTED   BYTES DONE    TOTAL BYTES   STORAGE LOCATION   AGE   NODE
      example-backup-fhc6b   Completed   11h       21474836480   21474836480   default            11h   192.168.254.66
      example-backup-qwwzh   Completed   11h       21474836480   21474836480   default            11h   192.168.254.15
    5. Подтвердите завершение резервного копирования:

      POD=$(kubectl -n cpaas-system get pod -l app.kubernetes.io/name=velero -o jsonpath='{.items[0].metadata.name}')
      kubectl -n cpaas-system exec -ti "$POD" -- /velero backup get example-backup

      Пример вывода:

      NAME             STATUS      ERRORS   WARNINGS   CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
      example-backup   Completed   0        0          2025-01-25 14:14:08 +0000 UTC   29d       default            <none>
    6. Проверьте репозиторий резервных копий (например, MinIO) на наличие директорий:

      mc ls <backup-repository>

      Пример вывода:

      [2025-01-26 09:23:08 CST]     0B backups/
      [2025-01-26 09:23:08 CST]     0B kopia/
      [2025-01-26 09:23:08 CST]     0B restic/

    Восстановление

    1. Удалите исходную виртуальную машину.

    2. Создайте ресурс восстановления через Platform Management → Cluster Management → Backup and Recovery → Restore Management или вручную:

      apiVersion: velero.io/v1
      kind: Restore
      metadata:
        annotations:
          cpaas.io/description: ""
        finalizers:
        - restores.velero.io/external-resources-finalizer
        name: example-restore
        namespace: cpaas-system
      spec:
        backupName: example-backup
        excludedResources:
        - nodes
        - events
        - events.events.k8s.io
        - backups.velero.io
        - restores.velero.io
        - resticrepositories.velero.io
        - csinodes.storage.k8s.io
        - volumeattachments.storage.k8s.io
        - backuprepositories.velero.io
        hooks: {}
        includedNamespaces:
        - example-namespace
        itemOperationTimeout: 4h0m0s
        namespaceMapping: {}
    3. Проверьте восстановление:

      kubectl exec -ti -n cpaas-system velero-5df7bb7598-ljjrn -- /velero restore get

      Проверьте статус datadownload:

      kubectl get datadownload -n cpaas-system

      Пример вывода:

      NAME       STATUS      STARTED   BYTES DONE    TOTAL BYTES   STORAGE LOCATION   AGE   NODE
      example-restore-7lfcm   Completed   11m       21474836480   21474836480   default            15m   192.168.254.66
      example-restore-cjcd8   Completed   15m       21474836480   21474836480   default            15m   192.168.254.66

      Статус восстановления:

      NAME   BACKUP           STATUS      STARTED                         COMPLETED                       ERRORS   WARNINGS   CREATED                         SELECTOR
      aa     example-backup   Completed   2025-01-26 01:53:14 +0000 UTC   2025-01-26 02:01:24 +0000 UTC   0        2          2025-01-26 01:53:14 +0000 UTC   <none>
    4. Подтвердите, что виртуальная машина восстановлена и работает.

    Восстановление между кластерами

    1. Разверните Velero в новом кластере и выполните шаги подготовки.
    2. Настройте тот же репозиторий резервных копий (тот же бакет и директорию), что и в исходном кластере. Ресурс резервного копирования появится автоматически.
    3. Следуйте шагам восстановления, описанным выше.

    Восстановление в другой namespace

    Добавьте поле namespaceMapping в спецификацию восстановления:

    spec:
      namespaceMapping:
        example-namespace: test-namespace

    Восстановление с другим StorageClass

    1. Создайте ConfigMap в namespace cpaas-system перед началом восстановления:
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: change-storage-class-config
        namespace: cpaas-system
        labels:
          velero.io/plugin-config: ""
          velero.io/change-storage-class: RestoreItemAction
      data:
        vm-cephrbd: vm-topolvm-a
    2. Убедитесь, что возможности хранилища (например, доступность между узлами, RWX) совпадают.
    3. Примечание: изменение режима RWX в настоящее время не поддерживается.