4.9. OADP 恢复


4.9.1. 恢复应用程序

您可以通过创建一个 Restore 自定义资源 (CR) 来恢复应用程序备份。请参阅创建 Restore CR

您可以通过编辑 Restore CR 创建恢复 hook,以便在 pod 中的容器中运行命令。请参阅创建恢复 hook

4.9.1.1. 在运行备份和恢复前预览资源

OADP 根据类型、命名空间或标签备份应用程序资源。这意味着您可以在备份完成后查看资源。同样,您可以在恢复操作完成后根据命名空间、持久性卷(PV)或标签查看恢复的对象。要提前预览资源,您可以空运行备份和恢复操作。

先决条件

  • 已安装 OADP Operator。

流程

  1. 要在运行实际备份前预览备份中包含的资源,请运行以下命令:

    $ velero backup create <backup-name> --snapshot-volumes false 1
    1
    --snapshot-volumes 参数的值 指定为 false
  2. 要了解有关备份资源的更多详细信息,请运行以下命令:

    $ velero describe backup <backup_name> --details 1
    1
    指定备份的名称。
  3. 要在运行实际恢复前预览恢复中包含的资源,请运行以下命令:

    $ velero restore create --from-backup <backup-name> 1
    1
    指定为查看备份资源而创建的备份名称。
    重要

    velero restore create 命令在集群中创建恢复资源。在查看资源后,您必须删除作为恢复的一部分创建的资源。

  4. 要了解有关恢复资源的更多详细信息,请运行以下命令:

    $ velero describe restore <restore_name> --details 1
    1
    指定恢复的名称。

4.9.1.2. 创建恢复 CR

您可以通过创建一个 Restore CR 来恢复 Backup 自定义资源(CR)。

先决条件

  • 您必须安装用于数据保护(OADP)Operator 的 OpenShift API。
  • DataProtectionApplication CR 必须处于 Ready 状态。
  • 您必须具有 Velero Backup CR。
  • 持久性卷 (PV) 容量必须与备份时请求的大小匹配。如果需要,调整请求的大小。

流程

  1. 创建一个 Restore CR,如下例所示:

    apiVersion: velero.io/v1
    kind: Restore
    metadata:
      name: <restore>
      namespace: openshift-adp
    spec:
      backupName: <backup> 1
      includedResources: [] 2
      excludedResources:
      - nodes
      - events
      - events.events.k8s.io
      - backups.velero.io
      - restores.velero.io
      - resticrepositories.velero.io
      restorePVs: true 3
    1
    备份 CR 的名称
    2
    可选:指定要包含在恢复过程中的资源数组。资源可以是缩写方式(例如,po 代表 pods)或完全限定的方式。如果未指定,则会包含所有资源。
    3
    可选: restorePV 参数可以设置为 false,以从 Container Storage Interface (CSI) 快照的 VolumeSnapshot 或配置 VolumeSnapshotLocation 时从原生快照中恢复 PersistentVolume
  2. 输入以下命令验证 Restore CR 的状态是否为 Completed

    $ oc get restore -n openshift-adp <restore> -o jsonpath='{.status.phase}'
  3. 输入以下命令验证备份资源是否已恢复:

    $ oc get all -n <namespace> 1
    1
    备份的命名空间。
  4. 如果您使用卷恢复 DeploymentConfig,或使用 post-restore hook,请输入以下命令运行 dc-post-restore.sh cleanup 脚本:

    $ bash dc-restic-post-restore.sh -> dc-post-restore.sh
    注意

    在恢复过程中,OADP Velero 插件会缩减 DeploymentConfig 对象,并将 pod 恢复为独立 pod。这是为了防止集群在恢复时立即删除恢复的 DeploymentConfig pod,并允许 restore 和 post-restore hook 在恢复的 pod 上完成其操作。下面显示的清理脚本会删除这些断开连接的 pod,并将任何 DeploymentConfig 对象扩展至适当的副本数。

    例 4.1. dc-restic-post-restore.sh dc-post-restore.sh cleanup 脚本

    #!/bin/bash
    set -e
    
    # if sha256sum exists, use it to check the integrity of the file
    if command -v sha256sum >/dev/null 2>&1; then
      CHECKSUM_CMD="sha256sum"
    else
      CHECKSUM_CMD="shasum -a 256"
    fi
    
    label_name () {
        if [ "${#1}" -le "63" ]; then
    	echo $1
    	return
        fi
        sha=$(echo -n $1|$CHECKSUM_CMD)
        echo "${1:0:57}${sha:0:6}"
    }
    
    if [[ $# -ne 1 ]]; then
        echo "usage: ${BASH_SOURCE} restore-name"
        exit 1
    fi
    
    echo "restore: $1"
    
    label=$(label_name $1)
    echo "label:   $label"
    
    echo Deleting disconnected restore pods
    oc delete pods --all-namespaces -l oadp.openshift.io/disconnected-from-dc=$label
    
    for dc in $(oc get dc --all-namespaces -l oadp.openshift.io/replicas-modified=$label -o jsonpath='{range .items[*]}{.metadata.namespace}{","}{.metadata.name}{","}{.metadata.annotations.oadp\.openshift\.io/original-replicas}{","}{.metadata.annotations.oadp\.openshift\.io/original-paused}{"\n"}')
    do
        IFS=',' read -ra dc_arr <<< "$dc"
        if [ ${#dc_arr[0]} -gt 0 ]; then
    	echo Found deployment ${dc_arr[0]}/${dc_arr[1]}, setting replicas: ${dc_arr[2]}, paused: ${dc_arr[3]}
    	cat <<EOF | oc patch dc  -n ${dc_arr[0]} ${dc_arr[1]} --patch-file /dev/stdin
    spec:
      replicas: ${dc_arr[2]}
      paused: ${dc_arr[3]}
    EOF
        fi
    done

4.9.1.3. 创建恢复 hook

您可以通过编辑 Restore 自定义资源 (CR)创建恢复 hook,以便在 pod 中的容器中运行命令。

您可以创建两种类型的恢复 hook:

  • init hook 将 init 容器添加到 pod,以便在应用程序容器启动前执行设置任务。

    如果您恢复 Restic 备份,则会在恢复 hook init 容器前添加 restic-wait init 容器。

  • exec hook 在恢复的 pod 的容器中运行命令或脚本。

流程

  • Restore CR 的 spec.hooks 块中添加 hook,如下例所示:

    apiVersion: velero.io/v1
    kind: Restore
    metadata:
      name: <restore>
      namespace: openshift-adp
    spec:
      hooks:
        resources:
          - name: <hook_name>
            includedNamespaces:
            - <namespace> 1
            excludedNamespaces:
            - <namespace>
            includedResources:
            - pods 2
            excludedResources: []
            labelSelector: 3
              matchLabels:
                app: velero
                component: server
            postHooks:
            - init:
                initContainers:
                - name: restore-hook-init
                  image: alpine:latest
                  volumeMounts:
                  - mountPath: /restores/pvc1-vm
                    name: pvc1-vm
                  command:
                  - /bin/ash
                  - -c
                timeout: 4
            - exec:
                container: <container> 5
                command:
                - /bin/bash 6
                - -c
                - "psql < /backup/backup.sql"
                waitTimeout: 5m 7
                execTimeout: 1m 8
                onError: Continue 9
    1
    可选: hook 应用的命名空间数组。如果没有指定这个值,则 hook 适用于所有命名空间。
    2
    目前,pod 是唯一可以应用 hook 的支持的资源。
    3
    可选:此 hook 仅适用于与标签选择器匹配的对象。
    4
    可选:超时指定 Velero 等待 initContainers 完成的最大时间长度。
    5
    可选:如果没有指定容器,该命令将在 pod 的第一个容器中运行。
    6
    这是正在添加的 init 容器的入口点。
    7
    可选:等待容器就绪的时间。这应该足够长,以便容器可以启动,在相同容器中的任何以前的 hook 可以完成。如果没有设置,恢复过程会无限期等待。
    8
    可选:等待命令运行的时间。默认值为 30s
    9
    错误处理的允许值为 FailContinue
    • Continue: 只记录命令失败。
    • Fail: 任何 pod 中的任何容器中没有更多恢复 hook 运行。Restore CR 的状态将是 PartiallyFailed
重要

在文件系统备份(FSB)恢复操作中,引用 ImageStreamDeployment 资源没有被正确恢复。恢复运行 FSB 的 pod,postHook 会被提前终止。

这是因为在恢复操作中,OpenShift 控制器使用更新的 ImageStreamTag 哈希更新 Deployment 资源中的 spec.template.spec.containers[0].image 字段。更新会触发新 pod 的推出,终止 velero 运行 FSB 和后恢复 hook 的 pod。有关镜像流触发器的更多信息,请参阅"镜像流更改的触发更新"。

这个行为的临时解决方案分为两个步骤:

  1. 首先,执行排除 Deployment 资源的恢复,例如:

    $ velero restore create <RESTORE_NAME> \
      --from-backup <BACKUP_NAME> \
      --exclude-resources=deployment.apps
  2. 第一次恢复成功后,通过包含这些资源来执行第二次恢复,例如:

    $ velero restore create <RESTORE_NAME> \
      --from-backup <BACKUP_NAME> \
      --include-resources=deployment.apps
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.