4.3. 备份和恢复
4.3.1. 备份应用程序
您可以通过创建 Backup
自定义资源(CR) 来备份应用程序。
Backup
CR 为 Kubernetes 资源和内部镜像(S3 对象存储)和持久性卷(PV)创建备份文件,如果云供应商使用原生快照 API 或 Container Storage Interface(CSI) 来创建快照,如 OpenShift Container Storage 4。如需更多信息,请参阅 CSI 卷快照。
S3 存储的 CloudStorage
API 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的详情,请参考 https://access.redhat.com/support/offerings/techpreview/。
如果您的云供应商具有原生快照 API 或支持 Container Storage Interface(CSI)快照,则 Backup
CR 通过创建快照来备份持久性卷。如需更多信息,请参阅 OpenShift Container Platform 文档中的 CSI 卷快照概述。
如果您的云供应商不支持快照,或者应用程序位于 NFS 数据卷中,您可以使用 Restic 创建备份。
您可以创建 backup hook,以便在备份操作之前或之后运行命令。
您可以通过创建一个 Schedule
CR 而不是 Backup
CR 来调度备份。
4.3.1.1. 创建备份 CR
您可以通过创建 Backup
备份自定义资源(CR)来备份 Kubernetes 镜像、内部镜像和持久性卷(PV)。
先决条件
- 您必须安装用于数据保护(OADP)Operator 的 OpenShift API。
-
DataProtectionApplication
CR 必须处于Ready
状态。 备份位置先决条件:
- 您必须为 Velero 配置 S3 对象存储。
-
您必须在
DataProtectionApplication
CR 中配置了一个备份位置。
快照位置先决条件:
- 您的云供应商必须具有原生快照 API 或支持 Container Storage Interface(CSI)快照。
-
对于 CSI 快照,您必须创建一个
VolumeSnapshotClass
CR 来注册 CSI 驱动程序。 -
您必须在
DataProtectionApplication
CR 中配置了一个卷位置。
流程
检索
backupStorageLocations
CR:$ oc get backupStorageLocations
输出示例
NAME PHASE LAST VALIDATED AGE DEFAULT velero-sample-1 Available 11s 31m
创建一个
Backup
CR,如下例所示:apiVersion: velero.io/v1 kind: Backup metadata: name: <backup> labels: velero.io/storage-location: default namespace: openshift-adp spec: hooks: {} includedNamespaces: - <namespace> 1 storageLocation: <velero-sample-1> 2 ttl: 720h0m0s
验证
Backup
CR 的状态是否为Completed
:$ oc get backup -n openshift-adp <backup> -o jsonpath='{.status.phase}'
4.3.1.2. 使用 CSI 快照备份持久性卷
在创建 Backup
CR 前,您可以通过创建 VolumeSnapshotClass
自定义资源(CR)来注册 CSI 驱动程序,使用 Container Storage Interface(CSI)快照备份持久性卷。
先决条件
- 云供应商必须支持 CSI 快照。
-
您必须在
DataProtectionApplication
CR 中启用 CSI。
流程
创建
VolumeSnapshotClass
CR,如下例所示:Ceph RBD
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass deletionPolicy: Retain metadata: name: <volume_snapshot_class_name> labels: velero.io/csi-volumesnapshot-class: "true" snapshotter: openshift-storage.rbd.csi.ceph.com driver: openshift-storage.rbd.csi.ceph.com parameters: clusterID: openshift-storage csi.storage.k8s.io/snapshotter-secret-name: rook-csi-rbd-provisioner csi.storage.k8s.io/snapshotter-secret-namespace: openshift-storage
Ceph FS
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: <volume_snapshot_class_name> labels: velero.io/csi-volumesnapshot-class: "true" driver: openshift-storage.cephfs.csi.ceph.com deletionPolicy: Retain parameters: clusterID: openshift-storage csi.storage.k8s.io/snapshotter-secret-name: rook-csi-cephfs-provisioner csi.storage.k8s.io/snapshotter-secret-namespace: openshift-storage
其他云供应商
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: <volume_snapshot_class_name> labels: velero.io/csi-volumesnapshot-class: "true" driver: <csi_driver> deletionPolicy: Retain
现在,您可以创建一个 Backup
CR。
4.3.1.3. 使用 Restic 备份应用程序
您可以通过编辑备份自定义资源(CR)来使用 Restic Backup
资源、内部镜像和持久性卷备份 Kubernetes 资源。
您不需要在 DataProtectionApplication
CR 中指定快照位置。
先决条件
- 您必须安装用于数据保护(OADP)Operator 的 OpenShift API。
-
您不能将
DataProtectionApplication
CR 中的spec.configuration.restic.enable
设置为false
来禁用默认的 Restic 安装。 -
DataProtectionApplication
CR 必须处于Ready
状态。
流程
编辑
Backup
CR,如下例所示:apiVersion: velero.io/v1 kind: Backup metadata: name: <backup> labels: velero.io/storage-location: default namespace: openshift-adp spec: defaultVolumesToRestic: true 1 ...
- 1
- 将
defaultVolumesToRestic: true
添加到spec
块中。
4.3.1.4. 创建备份 hook
您可以通过编辑备份自定义资源(CR)来创建 Backup
hook 以在 pod 中运行的容器中运行命令。
在 pod 备份前运行 Pre hook。在备份后运行 Post hook。
流程
在
Backup
CR 的spec.hooks
块中添加 hook,如下例所示:apiVersion: velero.io/v1 kind: Backup metadata: name: <backup> 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 pre: 4 - exec: container: <container> 5 command: - /bin/uname 6 - -a onError: Fail 7 timeout: 30s 8 post: 9 ...
4.3.1.5. 调度备份
您可以通过创建 Schedule
自定义资源(CR)而不是 Backup
CR 来调度备份。
在您的备份调度中留有足够的时间,以便在创建另一个备份前完成了当前的备份。
例如,如果对一个命名空间进行备份通常需要 10 分钟才能完成,则调度的备份频率不应该超过每 15 分钟一次。
先决条件
- 您必须安装用于数据保护(OADP)Operator 的 OpenShift API。
-
DataProtectionApplication
CR 必须处于Ready
状态。
流程
检索
backupStorageLocations
CR:$ oc get backupStorageLocations
输出示例
NAME PHASE LAST VALIDATED AGE DEFAULT velero-sample-1 Available 11s 31m
创建一个
Schedule
CR,如下例所示:$ cat << EOF | oc apply -f - apiVersion: velero.io/v1 kind: Schedule metadata: name: <schedule> namespace: openshift-adp spec: schedule: 0 7 * * * 1 template: hooks: {} includedNamespaces: - <namespace> 2 storageLocation: <velero-sample-1> 3 defaultVolumesToRestic: true 4 ttl: 720h0m0s EOF
在调度的备份运行后验证
Schedule
CR 的状态是否为Completed
:$ oc get schedule -n openshift-adp <schedule> -o jsonpath='{.status.phase}'
4.3.2. 恢复应用程序
您可以通过创建 Restore
自定义资源(CR) 来恢复应用程序备份。
您可以创建 restore hooks,以在应用程序容器启动前或在应用程序容器本身中运行命令。
4.3.2.1. 创建恢复 CR
您可以通过创建一个 Restore
CR 来恢复 Backup
自定义资源(CR)。
先决条件
- 您必须安装用于数据保护(OADP)Operator 的 OpenShift API。
-
DataProtectionApplication
CR 必须处于Ready
状态。 -
您必须具有 Velero
Backup
CR。 - 调整请求的大小,以便持久性卷 (PV) 容量与备份时请求的大小匹配。
流程
创建一个
Restore
CR,如下例所示:apiVersion: velero.io/v1 kind: Restore metadata: name: <restore> namespace: openshift-adp spec: backupName: <backup> 1 excludedResources: - nodes - events - events.events.k8s.io - backups.velero.io - restores.velero.io - resticrepositories.velero.io restorePVs: true
- 1
备份 CR 的名称
。
验证
Restore
CR 的状态是否为Completed
:$ oc get restore -n openshift-adp <restore> -o jsonpath='{.status.phase}'
验证备份资源是否已恢复:
$ oc get all -n <namespace> 1
- 1
- 备份的命名空间。
4.3.2.2. 创建恢复 hook
您可以创建恢复 hook,以便在 pod 中运行的容器运行命令,同时通过编辑 Restore
自定义资源(CR)恢复应用程序。
您可以创建两种类型的恢复 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 - exec: container: <container> 4 command: - /bin/bash 5 - -c - "psql < /backup/backup.sql" waitTimeout: 5m 6 execTimeout: 1m 7 onError: Continue 8
- 1
- 可选: hook 应用的命名空间数组。如果没有指定这个值,则 hook 适用于所有命名空间。
- 2
- 目前,pod 是唯一支持的资源。
- 3
- 可选:此 hook 仅适用于与标签选择器匹配的对象。
- 4
- 可选:如果没有指定容器,该命令将在 pod 的第一个容器中运行。
- 5
- hook 运行的命令数组。
- 6
- 可选:如果没有指定
waitTimeout
,则恢复会无限期等待。您可以指定等待容器启动以及容器中前面的 hook 完成的时间。当容器恢复时,等待超时会启动,可能需要时间让容器拉取并挂载卷。 - 7
- 可选:等待命令运行的时间。默认值为
30s
。 - 8
- 错误处理的允许值为
Fail
和Continue
:-
Continue
: 只记录命令失败。 -
Fail
: 任何 pod 中的任何容器中没有更多恢复 hook 运行。Restore
CR 的状态将是PartiallyFailed
。
-