$ alias velero='oc -n openshift-adp exec deployment/velero -c velero -it -- ./velero'
您可以使用OpenShift CLI 工具或Velero CLI 工具调试 Velero 自定义资源 (CR)。Velero CLI 工具提供更详细的日志和信息。
您可以检查安装问题、备份和恢复 CR 问题以及Restic 问题。
您可以使用must-gather工具收集日志和 CR 信息。
您可以通过以下方式获取 Velero CLI 工具:
下载 Velero CLI 工具
访问集群中 Velero 部署中的 Velero 二进制文件
您可以按照Velero 文档页面上的说明下载并安装 Velero CLI 工具。
该页面包含以下说明:
使用 Homebrew 安装 macOS
GitHub
使用 Chocolatey 安装 Windows
您已访问 Kubernetes 集群(v1.16 或更高版本),并启用了 DNS 和容器网络。
您已在本地安装了 kubectl。
打开浏览器并导航到 Velero 网站上的 "安装 CLI"。
按照适用于 macOS、GitHub 或 Windows 的相应步骤操作。
下载适合您的 OADP 和 OpenShift Container Platform 版本的 Velero 版本。
| OADP 版本 | Velero 版本 | OpenShift Container Platform 版本 |
|---|---|---|
1.1.0 |
4.9 及更高版本 |
|
1.1.1 |
4.9 及更高版本 |
|
1.1.2 |
4.9 及更高版本 |
|
1.1.3 |
4.9 及更高版本 |
|
1.1.4 |
4.9 及更高版本 |
|
1.1.5 |
4.9 及更高版本 |
|
1.1.6 |
4.11 及更高版本 |
|
1.1.7 |
4.11 及更高版本 |
|
1.2.0 |
4.11 及更高版本 |
|
1.2.1 |
4.11 及更高版本 |
|
1.2.2 |
4.11 及更高版本 |
|
1.2.3 |
4.11 及更高版本 |
|
1.3.0 |
4.10 - 4.15 |
|
1.3.1 |
4.10 - 4.15 |
|
1.3.2 |
4.10 - 4.15 |
|
1.4.0 |
4.14 及更高版本 |
|
1.4.1 |
4.14 及更高版本 |
您可以使用 shell 命令访问集群中 Velero 部署中的 Velero 二进制文件。
您的 DataProtectionApplication 自定义资源状态为 Reconcile complete。
输入以下命令设置所需的别名
$ alias velero='oc -n openshift-adp exec deployment/velero -c velero -it -- ./velero'
您可以通过检查 Velero 自定义资源 (CR) 和 Velero Pod 日志来调试备份或恢复失败。
使用 oc describe 命令检索与 Backup 或 Restore CR 相关的警告和错误摘要。
$ oc describe <velero_cr> <cr_name>
使用 oc logs 命令检索 Velero Pod 日志。
$ oc logs pod/<velero>
您可以在 DataProtectionApplication 资源中指定 Velero 日志级别,如下例所示。
|
此选项从 OADP 1.0.3 开始可用。 |
apiVersion: oadp.openshift.io/v1alpha1
kind: DataProtectionApplication
metadata:
name: velero-sample
spec:
configuration:
velero:
logLevel: warning
以下 logLevel 值可用:
trace
debug
info
warning
error
fatal
panic
建议大多数日志使用 debug。
您可以使用 Velero CLI 工具调试 Backup 和 Restore 自定义资源 (CR) 并检索日志。
Velero CLI 工具提供比 OpenShift CLI 工具更详细的信息。
使用 oc exec 命令运行 Velero CLI 命令。
$ oc -n openshift-adp exec deployment/velero -c velero -- ./velero \
<backup_restore_cr> <command> <cr_name>
$ oc -n openshift-adp exec deployment/velero -c velero -- ./velero \
backup describe 0e44ae00-5dc3-11eb-9ca8-df7e5254778b-2d8ql
使用 velero --help 选项列出所有 Velero CLI 命令。
$ oc -n openshift-adp exec deployment/velero -c velero -- ./velero \
--help
使用 velero describe 命令检索与 Backup 或 Restore CR 相关的警告和错误摘要。
$ oc -n openshift-adp exec deployment/velero -c velero -- ./velero \
<backup_restore_cr> describe <cr_name>
$ oc -n openshift-adp exec deployment/velero -c velero -- ./velero \
backup describe 0e44ae00-5dc3-11eb-9ca8-df7e5254778b-2d8ql
velero describe 请求的输出中将显示以下类型的恢复错误和警告:
Velero:与 Velero 本身操作相关的消息列表,例如,与连接到云、读取备份文件等相关的消息。
Cluster:与备份或恢复集群范围资源相关的消息列表。
Namespaces:与备份或恢复存储在命名空间中的资源相关的消息列表。
这些类别中的一项或多项错误会导致 Restore 操作的状态为 PartiallyFailed 而不是 Completed。警告不会导致完成状态发生变化。
|
使用 velero logs 命令检索 Backup 或 Restore CR 的日志。
$ oc -n openshift-adp exec deployment/velero -c velero -- ./velero \
<backup_restore_cr> logs <cr_name>
$ oc -n openshift-adp exec deployment/velero -c velero -- ./velero \
restore logs ccc7c2d0-6017-11eb-afab-85d0007f5a19-x4lbf
如果由于内存或 CPU 不足导致 Velero 或 Restic Pod 崩溃,您可以为这些资源设置特定的资源请求。
您可以使用 oadp_v1alpha1_dpa.yaml 文件中的 configuration.velero.podConfig.resourceAllocations 规范字段为 Velero Pod 设置特定的资源请求。
在 YAML 文件中设置 cpu 和 memory 资源请求。
apiVersion: oadp.openshift.io/v1alpha1
kind: DataProtectionApplication
...
configuration:
velero:
podConfig:
resourceAllocations: (1)
requests:
cpu: 200m
memory: 256Mi
| 1 | 列出的 resourceAllocations 用于平均使用情况。 |
您可以使用 configuration.restic.podConfig.resourceAllocations 规范字段为 Restic Pod 设置特定的资源请求。
在 YAML 文件中设置 cpu 和 memory 资源请求。
apiVersion: oadp.openshift.io/v1alpha1
kind: DataProtectionApplication
...
configuration:
restic:
podConfig:
resourceAllocations: (1)
requests:
cpu: 1000m
memory: 16Gi
| 1 | 列出的 resourceAllocations 用于平均使用情况。 |
|
资源请求字段的值必须遵循与 Kubernetes 资源需求相同的格式。此外,如果您未指定
|
当使用 Restic 或 Kopia 进行 NFS 恢复时,如果有多个卷,则恢复操作将失败。PodVolumeRestore 可能会失败并显示以下错误,或者在最终失败之前一直尝试恢复。
Velero: pod volume restore failed: data path restore failed: \
Failed to run kopia restore: Failed to copy snapshot data to the target: \
restore error: copy file: error creating file: \
open /host_pods/b4d...6/volumes/kubernetes.io~nfs/pvc-53...4e5/userdata/base/13493/2681: \
no such file or directory
要恢复的两个卷的 NFS 挂载路径不唯一。因此,velero 锁文件在恢复期间使用 NFS 服务器上的相同文件,导致 PodVolumeRestore 失败。
您可以通过为每个卷设置唯一的 pathPattern 来解决此问题,同时在 deploy/class.yaml 文件中定义 nfs-subdir-external-provisioner 的 StorageClass。使用以下 nfs-subdir-external-provisioner StorageClass 示例:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-client
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
parameters:
pathPattern: "${.PVC.namespace}/${.PVC.annotations.nfs.io/storage-path}" (1)
onDelete: delete
| 1 | 使用 PVC 元数据(例如标签、注释、名称或命名空间)指定创建目录路径的模板。要指定元数据,请使用 ${.PVC.<metadata>}。例如,要命名一个文件夹:<pvc-namespace>-<pvc-name>,请使用 ${.PVC.namespace}-${.PVC.name} 作为 pathPattern。 |
Velero 在恢复期间解决准入 Webhook 问题的能力有限。如果您有使用准入 Webhook 的工作负载,您可能需要使用额外的 Velero 插件或更改恢复工作负载的方式。
通常,使用准入 Webhook 的工作负载需要您首先创建特定类型的资源。如果您的工作负载具有子资源,则尤其如此,因为准入 Webhook 通常会阻止子资源。
例如,创建或恢复顶级对象(例如 service.serving.knative.dev)通常会自动创建子资源。如果首先执行此操作,则无需使用 Velero 来创建和恢复这些资源。这避免了 Velero 可能使用的准入 Webhook 阻止子资源的问题。
本节介绍使用准入 Webhook 的几种类型的 Velero 备份的资源恢复所需的附加步骤。
您可能会遇到使用 Velero 备份使用准入 Webhook 的 Knative 资源时的问题。
在备份和恢复使用准入 Webhook 的 Knative 资源时,您可以通过首先恢复顶级Service资源来避免此类问题。
恢复顶级service.serving.knative.dev Service资源
$ velero restore <restore_name> \
--from-backup=<backup_name> --include-resources \
service.serving.knavtive.dev
如果您在使用 Velero 恢复具有准入 Webhook 的 IBM® AppConnect 资源时遇到问题,您可以运行此过程中的检查。
检查集群中是否存在任何kind: MutatingWebhookConfiguration 的变异准入插件
$ oc get mutatingwebhookconfigurations
检查每个kind: MutatingWebhookConfiguration 的 YAML 文件,以确保其规则不会阻止正在遇到问题的对象的创建。更多信息,请参见官方 Kubernetes 文档。
检查备份时使用的type: Configuration.appconnect.ibm.com/v1beta1 中的任何spec.version 是否受已安装的 Operator 支持。
以下部分描述了 OpenShift 数据保护 API (OADP) 插件中的已知问题
当备份和备份存储位置 (BSL) 在数据保护应用程序 (DPA) 的范围之外管理时,OADP 控制器(即 DPA 调和)不会创建相关的oadp-<bsl_name>-<bsl_provider>-registry-secret。
运行备份时,OpenShift Velero 插件在镜像流备份上发生 panic,并显示以下 panic 错误
024-02-27T10:46:50.028951744Z time="2024-02-27T10:46:50Z" level=error msg="Error backing up item"
backup=openshift-adp/<backup name> error="error executing custom action (groupResource=imagestreams.image.openshift.io,
namespace=<BSL Name>, name=postgres): rpc error: code = Aborted desc = plugin panicked:
runtime error: index out of range with length 1, stack trace: goroutine 94…
要避免 Velero 插件 panic 错误,请执行以下步骤
使用相关标签标记自定义 BSL。
$ oc label backupstoragelocations.velero.io <bsl_name> app.kubernetes.io/component=bsl
标记 BSL 后,等待 DPA 调和。
|
您可以通过对 DPA 本身进行任何微小的更改来强制调和。 |
当 DPA 调和后,确认已创建相关的oadp-<bsl_name>-<bsl_provider>-registry-secret,并且正确的注册表数据已填充到其中。
$ oc -n openshift-adp get secret/oadp-<bsl_name>-<bsl_provider>-registry-secret -o json | jq -r '.data'
如果您同时启用cloudstorage 和restic 配置 DPA,则openshift-adp-controller-manager pod 将无限期地崩溃和重启,直到 pod 出现崩溃循环段错误。
您只能定义velero 或cloudstorage 之一,因为它们是互斥字段。
如果您同时定义了velero 和cloudstorage,则openshift-adp-controller-manager 会失败。
如果您既没有定义velero 也没有定义cloudstorage,则openshift-adp-controller-manager 会失败。
有关此问题的更多信息,请参见OADP-1054。
安装数据保护应用程序时,您可能会遇到由使用无效目录或不正确的凭据引起的问题。
Velero pod 日志显示错误消息Backup storage contains invalid top-level directories。
对象存储包含不是 Velero 目录的顶级目录。
如果对象存储不是专用于 Velero 的,则必须通过在DataProtectionApplication 清单中设置spec.backupLocations.velero.objectStorage.prefix 参数来为存储桶指定前缀。
oadp-aws-registry pod 日志显示错误消息InvalidAccessKeyId: The AWS Access Key Id you provided does not exist in our records.
Velero pod 日志显示错误消息NoCredentialProviders: no valid providers in chain。
用于创建Secret对象的credentials-velero文件格式不正确。
确保credentials-velero文件格式正确,如下例所示
credentials-velero文件[default] (1) aws_access_key_id=AKIAIOSFODNN7EXAMPLE (2) aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
| 1 | AWS 默认配置文件。 |
| 2 | 不要用引号(",')括住值。 |
OpenShift 数据保护 API (OADP) Operator 可能会遇到它无法解决的问题引起的问题。
OADP Operator 的 S3 存储桶可能为空,但是当您运行命令oc get po -n <OADP_Operator_namespace>时,您会看到 Operator 的状态为Running。在这种情况下,Operator 被认为是“悄悄失败”,因为它错误地报告它正在运行。
此问题是由云凭据提供权限不足引起的。
检索备份存储位置 (BSL) 列表,并检查每个 BSL 的清单是否有凭据问题。
运行以下命令之一以检索 BSL 列表
使用 OpenShift CLI
$ oc get backupstoragelocations.velero.io -A
使用 Velero CLI
$ velero backup-location get -n <OADP_Operator_namespace>
使用 BSL 列表,运行以下命令显示每个 BSL 的清单,并检查每个清单是否有错误。
$ oc get backupstoragelocations.velero.io -n <namespace> -o yaml
apiVersion: v1
items:
- apiVersion: velero.io/v1
kind: BackupStorageLocation
metadata:
creationTimestamp: "2023-11-03T19:49:04Z"
generation: 9703
name: example-dpa-1
namespace: openshift-adp-operator
ownerReferences:
- apiVersion: oadp.openshift.io/v1alpha1
blockOwnerDeletion: true
controller: true
kind: DataProtectionApplication
name: example-dpa
uid: 0beeeaff-0287-4f32-bcb1-2e3c921b6e82
resourceVersion: "24273698"
uid: ba37cd15-cf17-4f7d-bf03-8af8655cea83
spec:
config:
enableSharedConfig: "true"
region: us-west-2
credential:
key: credentials
name: cloud-credentials
default: true
objectStorage:
bucket: example-oadp-operator
prefix: example
provider: aws
status:
lastValidationTime: "2023-11-10T22:06:46Z"
message: "BackupStorageLocation \"example-dpa-1\" is unavailable: rpc
error: code = Unknown desc = WebIdentityErr: failed to retrieve credentials\ncaused
by: AccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity\n\tstatus
code: 403, request id: d3f2e099-70a0-467b-997e-ff62345e3b54"
phase: Unavailable
kind: List
metadata:
resourceVersion: ""
延长超时允许复杂或资源密集型进程成功完成而不会过早终止。此配置可以降低错误、重试或失败的可能性。
确保以逻辑方式平衡超时扩展,以免配置过长的超时,这可能会隐藏进程中的潜在问题。仔细考虑并监控满足进程需求和整体系统性能的适当超时值。
以下是各种 OADP 超时,以及如何以及何时实现这些参数的说明
spec.configuration.nodeAgent.timeout 参数定义 Restic 超时。默认值为1h。
在以下情况下,使用nodeAgent 部分中的 Restic timeout 参数
对于总 PV 数据使用量超过 500GB 的 Restic 备份。
如果备份超时并出现以下错误
level=error msg="Error backing up item" backup=velero/monitoring error="timed out waiting for all PodVolumeBackups to complete"
编辑 `DataProtectionApplication` 自定义资源 (CR) 清单文件中 `spec.configuration.nodeAgent.timeout` 块中的值,如下例所示
apiVersion: oadp.openshift.io/v1alpha1
kind: DataProtectionApplication
metadata:
name: <dpa_name>
spec:
configuration:
nodeAgent:
enable: true
uploaderType: restic
timeout: 1h
# ...
`resourceTimeout` 定义了在超时发生之前等待多个 Velero 资源的时间,例如 Velero 自定义资源定义 (CRD) 可用性、`volumeSnapshot` 删除和存储库可用性。默认值为 `10m`。
在以下情况下使用 `resourceTimeout`
对于总 PV 数据使用量超过 1TB 的备份。此参数用作 Velero 尝试清理或删除容器存储接口 (CSI) 快照(在将备份标记为完成之前)时的超时值。
此清理的一个子任务尝试修补 VSC,此超时可用于该任务。
创建或确保备份存储库已准备好用于 Restic 或 Kopia 的基于文件系统的备份。
在还原备份中的自定义资源 (CR) 或资源之前,检查 Velero CRD 是否在集群中可用。
编辑 `DataProtectionApplication` CR 清单文件中 `spec.configuration.velero.resourceTimeout` 块中的值,如下例所示
apiVersion: oadp.openshift.io/v1alpha1
kind: DataProtectionApplication
metadata:
name: <dpa_name>
spec:
configuration:
velero:
resourceTimeout: 10m
# ...
`timeout` 是用户提供的完成 `VolumeSnapshotBackup` 和 `VolumeSnapshotRestore` 的超时时间。默认值为 `10m`。
在以下情况下使用数据移动器 `timeout`
如果 `VolumeSnapshotBackups` (VSB) 和 `VolumeSnapshotRestores` (VSR) 的创建在 10 分钟后超时。
对于总 PV 数据使用量超过 500GB 的大规模环境。将超时设置为 `1h`。
使用 `VolumeSnapshotMover` (VSM) 插件。
仅适用于 OADP 1.1.x。
编辑 `DataProtectionApplication` CR 清单文件中 `spec.features.dataMover.timeout` 块中的值,如下例所示
apiVersion: oadp.openshift.io/v1alpha1
kind: DataProtectionApplication
metadata:
name: <dpa_name>
spec:
features:
dataMover:
timeout: 10m
# ...
`CSISnapshotTimeout` 指定创建期间等待的时间,直到 `CSI VolumeSnapshot` 状态变为 `ReadyToUse`,然后再返回超时错误。默认值为 `10m`。
在以下情况下使用 `CSISnapshotTimeout`
使用 CSI 插件。
对于可能需要超过 10 分钟才能创建快照的超大存储卷。如果在日志中发现超时,请调整此超时时间。
|
通常,`CSISnapshotTimeout` 的默认值不需要调整,因为默认设置可以适应大型存储卷。 |
编辑 `Backup` CR 清单文件中 `spec.csiSnapshotTimeout` 块中的值,如下例所示
apiVersion: velero.io/v1
kind: Backup
metadata:
name: <backup_name>
spec:
csiSnapshotTimeout: 10m
# ...
`defaultItemOperationTimeout` 定义了在超时之前等待异步 `BackupItemActions` 和 `RestoreItemActions` 完成的时间。默认值为 `1h`。
在以下情况下使用 `defaultItemOperationTimeout`
仅适用于数据移动器 1.2.x。
指定特定备份或还原应等待异步操作完成的时间。在 OADP 功能的上下文中,此值用于容器存储接口 (CSI) 数据移动器功能中涉及的异步操作。
当使用 `defaultItemOperationTimeout` 在数据保护应用程序 (DPA) 中定义 `defaultItemOperationTimeout` 时,它适用于备份和还原操作。您可以使用 `itemOperationTimeout` 来仅定义这些 CR 的备份或还原,如下面的“项目操作超时 - 还原”和“项目操作超时 - 备份”部分所述。
编辑 `DataProtectionApplication` CR 清单文件中 `spec.configuration.velero.defaultItemOperationTimeout` 块中的值,如下例所示
apiVersion: oadp.openshift.io/v1alpha1
kind: DataProtectionApplication
metadata:
name: <dpa_name>
spec:
configuration:
velero:
defaultItemOperationTimeout: 1h
# ...
`ItemOperationTimeout` 指定用于等待 `RestoreItemAction` 操作的时间。默认值为 `1h`。
在以下情况下使用还原 `ItemOperationTimeout`
仅适用于数据移动器 1.2.x。
对于数据移动器向 `BackupStorageLocation` 上传和下载数据。如果在达到超时时还原操作未完成,则将其标记为失败。如果由于存储卷大小较大而导致数据移动器操作因超时问题而失败,则可能需要增加此超时设置。
编辑 `Restore` CR 清单文件中 `Restore.spec.itemOperationTimeout` 块中的值,如下例所示
apiVersion: velero.io/v1
kind: Restore
metadata:
name: <restore_name>
spec:
itemOperationTimeout: 1h
# ...
`ItemOperationTimeout` 指定用于等待异步 `BackupItemAction` 操作的时间。默认值为 `1h`。
在以下情况下使用备份 `ItemOperationTimeout`
仅适用于数据移动器 1.2.x。
对于数据移动器向 `BackupStorageLocation` 上传和下载数据。如果在达到超时时备份操作未完成,则将其标记为失败。如果由于存储卷大小较大而导致数据移动器操作因超时问题而失败,则可能需要增加此超时设置。
编辑 `Backup` CR 清单文件中 `Backup.spec.itemOperationTimeout` 块中的值,如下例所示
apiVersion: velero.io/v1
kind: Backup
metadata:
name: <backup_name>
spec:
itemOperationTimeout: 1h
# ...
您可能会遇到这些常见的 `Backup` 和 `Restore` 自定义资源 (CR) 问题。
`Backup` CR 显示错误消息 `InvalidVolume.NotFound: The volume ‘vol-xxxx’ does not exist`。
持久卷 (PV) 和快照位置位于不同的区域。
编辑 `DataProtectionApplication` 清单文件中 `spec.snapshotLocations.velero.config.region` 密钥的值,以便快照位置与 PV 位于同一区域。
创建一个新的 `Backup` CR。
`Backup` CR 的状态保持在 `InProgress` 阶段并且未完成。
如果备份中断,则无法恢复。
检索 `Backup` CR 的详细信息
$ oc -n {namespace} exec deployment/velero -c velero -- ./velero \
backup describe <backup>
删除 `Backup` CR
$ oc delete backups.velero.io <backup> -n openshift-adp
您无需清理备份位置,因为进行中的 `Backup` CR 尚未将文件上传到对象存储。
创建一个新的 `Backup` CR。
查看 Velero 备份详细信息
$ velero backup describe <backup-name> --details
未使用 Restic 的 `Backup` CR 的状态保持在 `PartiallyFailed` 阶段并且未完成。未创建关联 PVC 的快照。
如果备份基于 CSI 快照类创建,但缺少标签,则 CSI 快照插件将无法创建快照。结果,Velero Pod 会记录类似于以下内容的错误
time="2023-02-17T16:33:13Z" level=error msg="Error backing up item" backup=openshift-adp/user1-backup-check5 error="error executing custom action (groupResource=persistentvolumeclaims, namespace=busy1, name=pvc1-user1): rpc error: code = Unknown desc = failed to get volumesnapshotclass for storageclass ocs-storagecluster-ceph-rbd: failed to get volumesnapshotclass for provisioner openshift-storage.rbd.csi.ceph.com, ensure that the desired volumesnapshot class has the velero.io/csi-volumesnapshot-class label" logSource="/remote-source/velero/app/pkg/backup/backup.go:417" name=busybox-79799557b5-vprq
删除 `Backup` CR
$ oc delete backups.velero.io <backup> -n openshift-adp
如有必要,请清理BackupStorageLocation 上存储的数据以释放空间。
为VolumeSnapshotClass 对象应用标签velero.io/csi-volumesnapshot-class=true
$ oc label volumesnapshotclass/<snapclass_name> velero.io/csi-volumesnapshot-class=true
创建一个新的 `Backup` CR。
使用 Restic 备份应用程序时,可能会遇到以下问题。
Restic Pod 日志显示错误消息:controller=pod-volume-backup error="fork/exec/usr/bin/restic: permission denied"。
如果您的 NFS 数据卷启用了root_squash,Restic 将映射到nfsnobody,并且没有权限创建备份。
您可以通过为Restic 创建一个补充组并将组 ID 添加到DataProtectionApplication 清单中来解决此问题
在 NFS 数据卷上为Restic 创建一个补充组。
在 NFS 目录上设置setgid 位,以便继承组所有权。
添加spec.configuration.nodeAgent.supplementalGroups 参数和组 ID 到DataProtectionApplication 清单,如下例所示
apiVersion: oadp.openshift.io/v1alpha1
kind: DataProtectionApplication
# ...
spec:
configuration:
nodeAgent:
enable: true
uploaderType: restic
supplementalGroups:
- <group_id> (1)
# ...
| 1 | 指定补充组 ID。 |
等待Restic Pod 重启,以便应用更改。
如果您为命名空间创建 Restic Backup CR,清空对象存储桶,然后为同一命名空间重新创建Backup CR,则重新创建的Backup CR 将失败。
velero Pod 日志显示以下错误消息:stderr=Fatal: unable to open config file: Stat: The specified key does not exist.\nIs there a repository at the following location?。
如果从对象存储中删除了 Restic 目录,Velero 不会从ResticRepository 清单中重新创建或更新 Restic 存储库。有关更多信息,请参见Velero 问题 4421。
通过运行以下命令删除命名空间中相关的 Restic 存储库
$ oc delete resticrepository openshift-adp <name_of_the_restic_repository>
在以下错误日志中,mysql-persistent 是有问题的 Restic 存储库。为了清晰起见,存储库名称以斜体显示。
time="2021-12-29T18:29:14Z" level=info msg="1 errors
encountered backup up item" backup=velero/backup65
logSource="pkg/backup/backup.go:431" name=mysql-7d99fc949-qbkds
time="2021-12-29T18:29:14Z" level=error msg="Error backing up item"
backup=velero/backup65 error="pod volume backup failed: error running
restic backup, stderr=Fatal: unable to open config file: Stat: The
specified key does not exist.\nIs there a repository at the following
location?\ns3:http://minio-minio.apps.mayap-oadp-
veleo-1234.qe.devcluster.openshift.com/mayapvelerooadp2/velero1/
restic/mysql-persistent\n: exit status 1" error.file="/remote-source/
src/github.com/vmware-tanzu/velero/pkg/restic/backupper.go:184"
error.function="github.com/vmware-tanzu/velero/
pkg/restic.(*backupper).BackupPodVolumes"
logSource="pkg/backup/backup.go:435" name=mysql-7d99fc949-qbkds
OpenShift Container Platform 4.14 实施了 Pod 安全准入 (PSA) 策略,这可能会妨碍 Restic 还原过程中的 Pod 就绪状态。
如果在创建 Pod 时找不到SecurityContextConstraints (SCC) 资源,并且 Pod 上的 PSA 策略未设置为满足所需标准,则会拒绝 Pod 准入。
此问题是由于 Velero 的资源还原顺序造成的。
\"level=error\" in line#2273: time=\"2023-06-12T06:50:04Z\"
level=error msg=\"error restoring mysql-869f9f44f6-tp5lv: pods\\\
"mysql-869f9f44f6-tp5lv\\\" is forbidden: violates PodSecurity\\\
"restricted:v1.24\\\": privil eged (container \\\"mysql\\\
" must not set securityContext.privileged=true),
allowPrivilegeEscalation != false (containers \\\
"restic-wait\\\", \\\"mysql\\\" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (containers \\\
"restic-wait\\\", \\\"mysql\\\" must set securityContext.capabilities.drop=[\\\"ALL\\\"]), seccompProfile (pod or containers \\\
"restic-wait\\\", \\\"mysql\\\" must set securityContext.seccompProfile.type to \\\
"RuntimeDefault\\\" or \\\"Localhost\\\")\" logSource=\"/remote-source/velero/app/pkg/restore/restore.go:1388\" restore=openshift-adp/todolist-backup-0780518c-08ed-11ee-805c-0a580a80e92c\n
velero container contains \"level=error\" in line#2447: time=\"2023-06-12T06:50:05Z\"
level=error msg=\"Namespace todolist-mariadb,
resource restore error: error restoring pods/todolist-mariadb/mysql-869f9f44f6-tp5lv: pods \\\
"mysql-869f9f44f6-tp5lv\\\" is forbidden: violates PodSecurity \\\"restricted:v1.24\\\": privileged (container \\\
"mysql\\\" must not set securityContext.privileged=true),
allowPrivilegeEscalation != false (containers \\\
"restic-wait\\\",\\\"mysql\\\" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (containers \\\
"restic-wait\\\", \\\"mysql\\\" must set securityContext.capabilities.drop=[\\\"ALL\\\"]), seccompProfile (pod or containers \\\
"restic-wait\\\", \\\"mysql\\\" must set securityContext.seccompProfile.type to \\\
"RuntimeDefault\\\" or \\\"Localhost\\\")\"
logSource=\"/remote-source/velero/app/pkg/controller/restore_controller.go:510\"
restore=openshift-adp/todolist-backup-0780518c-08ed-11ee-805c-0a580a80e92c\n]",
在您的 DPA 自定义资源 (CR) 中,检查或设置 Velero 服务器上的restore-resource-priorities 字段,以确保在资源列表中securitycontextconstraints 在pods 之前列出
$ oc get dpa -o yaml
# ...
configuration:
restic:
enable: true
velero:
args:
restore-resource-priorities: 'securitycontextconstraints,customresourcedefinitions,namespaces,storageclasses,volumesnapshotclass.snapshot.storage.k8s.io,volumesnapshotcontents.snapshot.storage.k8s.io,volumesnapshots.snapshot.storage.k8s.io,datauploads.velero.io,persistentvolumes,persistentvolumeclaims,serviceaccounts,secrets,configmaps,limitranges,pods,replicasets.apps,clusterclasses.cluster.x-k8s.io,endpoints,services,-,clusterbootstraps.run.tanzu.vmware.com,clusters.cluster.x-k8s.io,clusterresourcesets.addons.cluster.x-k8s.io' (1)
defaultPlugins:
- gcp
- openshift
| 1 | 如果您有现有的还原资源优先级列表,请确保将其与完整列表合并。 |
确保应用程序 Pod 的安全标准一致,如修复部署的 PodSecurity Admission 警告中所述,以防止部署警告。如果应用程序与安全标准不一致,则无论 SCC 如何,都可能发生错误。
|
此解决方案是临时的,目前正在进行讨论以解决此问题。 |
您可以使用must-gather 工具收集有关 OADP 自定义资源的日志、指标和信息。
必须将must-gather 数据附加到所有客户案例。
您可以使用以下数据收集选项运行must-gather 工具
完整的must-gather 数据收集会收集 Prometheus 指标、Pod 日志和安装了 OADP 运算符的所有命名空间的 Velero CR 信息。
必要的must-gather 数据收集会收集特定时间段(例如,一小时或 24 小时)的 Pod 日志和 Velero CR 信息。不包括 Prometheus 指标和重复日志。
带有超时的must-gather 数据收集。如果有很多失败的Backup CR,则数据收集可能需要很长时间。您可以通过设置超时值来提高性能。
Prometheus 指标数据转储会下载包含 Prometheus 收集的指标数据的存档文件。
您必须以具有cluster-admin 角色的用户身份登录到 OpenShift Container Platform 集群。
您必须安装 OpenShift CLI (oc)。
您必须使用带有 OADP 1.4 的 Red Hat Enterprise Linux (RHEL) 9。
导航到要存储must-gather 数据的目录。
针对以下数据收集选项之一运行oc adm must-gather 命令
完整的must-gather 数据收集,包括 Prometheus 指标
$ oc adm must-gather --image=registry.redhat.io/oadp/oadp-mustgather-rhel9:v1.4
数据保存为must-gather/must-gather.tar.gz。您可以将此文件上传到Red Hat 客户门户上的支持案例。
必要的must-gather 数据收集,不包括 Prometheus 指标,用于特定时间段
$ oc adm must-gather --image=registry.redhat.io/oadp/oadp-mustgather-rhel9:v1.4 \
-- /usr/bin/gather_<time>_essential (1)
| 1 | 以小时为单位指定时间。允许的值为1h、6h、24h、72h 或all,例如gather_1h_essential 或gather_all_essential。 |
带有超时的must-gather 数据收集
$ oc adm must-gather --image=registry.redhat.io/oadp/oadp-mustgather-rhel9:v1.4 \
-- /usr/bin/gather_with_timeout <timeout> (1)
| 1 | 以秒为单位指定超时值。 |
Prometheus 指标数据转储
$ oc adm must-gather --image=registry.redhat.io/oadp/oadp-mustgather-rhel9:v1.4 -- /usr/bin/gather_metrics_dump
此操作可能需要很长时间。数据保存为must-gather/metrics/prom_data.tar.gz。
如果使用自定义 CA 证书,则must-gather Pod 将无法获取velero logs/describe 的输出。要将must-gather 工具与不安全的 TLS 连接一起使用,您可以将gather_without_tls 标志传递给must-gather 命令。
使用以下命令将值设置为true的gather_without_tls 标志传递给must-gather 工具
$ oc adm must-gather --image=registry.redhat.io/oadp/oadp-mustgather-rhel9:v1.4 -- /usr/bin/gather_without_tls <true/false>
默认情况下,标志值设置为false。将其值设置为true以允许不安全的 TLS 连接。
目前,无法组合 must-gather 脚本,例如在允许不安全的 TLS 连接的同时指定超时阈值。在某些情况下,您可以通过在 must-gather 命令行上设置内部变量来解决此限制,例如以下示例
$ oc adm must-gather --image=registry.redhat.io/oadp/oadp-mustgather-rhel9:v1.4 -- skip_tls=true /usr/bin/gather_with_timeout <timeout_value_in_seconds>
在此示例中,在运行gather_with_timeout 脚本之前设置skip_tls 变量。结果是gather_with_timeout 和gather_without_tls 的组合。
您可以通过这种方式指定的其他变量只有以下这些:
logs_since,默认值为72h
request_timeout,默认值为0s
如果DataProtectionApplication 自定义资源 (CR) 配置了 s3Url 和 insecureSkipTLS: true,则由于缺少 CA 证书,CR 无法收集必要的日志。要收集这些日志,请使用以下选项运行must-gather 命令
$ oc adm must-gather --image=registry.redhat.io/oadp/oadp-mustgather-rhel9:v1.4 -- /usr/bin/gather_without_tls true
OpenShift Container Platform 提供了一个监控堆栈,允许用户和管理员有效地监控和管理其集群,以及监控和分析在集群上运行的用户应用程序和服务的负载性能,包括在发生事件时接收警报。
OADP 运算符利用 OpenShift Monitoring Stack 提供的 OpenShift 用户工作负载监控来从 Velero 服务端点检索指标。监控堆栈允许使用 OpenShift 指标查询前端创建用户定义的警报规则或查询指标。
启用用户工作负载监控后,可以配置和使用任何与 Prometheus 兼容的第三方 UI(例如 Grafana)来可视化 Velero 指标。
监控指标需要为用户定义的项目启用监控,并创建一个ServiceMonitor 资源,以便从位于openshift-adp 命名空间中的已启用 OADP 服务端点抓取这些指标。
您可以使用具有cluster-admin 权限的帐户访问 OpenShift Container Platform 集群。
您已创建集群监控配置映射。
编辑openshift-monitoring 命名空间中的cluster-monitoring-config ConfigMap 对象
$ oc edit configmap cluster-monitoring-config -n openshift-monitoring
在data 部分的config.yaml 字段中添加或启用enableUserWorkload 选项
apiVersion: v1
data:
config.yaml: |
enableUserWorkload: true (1)
kind: ConfigMap
metadata:
# ...
| 1 | 添加此选项或设置为true |
等待一小段时间,通过检查以下组件是否在openshift-user-workload-monitoring 命名空间中启动并运行来验证用户工作负载监控设置
$ oc get pods -n openshift-user-workload-monitoring
NAME READY STATUS RESTARTS AGE
prometheus-operator-6844b4b99c-b57j9 2/2 Running 0 43s
prometheus-user-workload-0 5/5 Running 0 32s
prometheus-user-workload-1 5/5 Running 0 32s
thanos-ruler-user-workload-0 3/3 Running 0 32s
thanos-ruler-user-workload-1 3/3 Running 0 32s
验证openshift-user-workload-monitoring 中是否存在user-workload-monitoring-config ConfigMap。如果存在,则跳过此过程中的其余步骤。
$ oc get configmap user-workload-monitoring-config -n openshift-user-workload-monitoring
Error from server (NotFound): configmaps "user-workload-monitoring-config" not found
为用户工作负载监控创建一个user-workload-monitoring-config ConfigMap 对象,并将其保存为2_configure_user_workload_monitoring.yaml 文件名
apiVersion: v1
kind: ConfigMap
metadata:
name: user-workload-monitoring-config
namespace: openshift-user-workload-monitoring
data:
config.yaml: |
应用2_configure_user_workload_monitoring.yaml 文件
$ oc apply -f 2_configure_user_workload_monitoring.yaml
configmap/user-workload-monitoring-config created
OADP 提供了一个openshift-adp-velero-metrics-svc 服务,该服务在配置 DPA 时创建。用户工作负载监控使用的服务监控器必须指向定义的服务。
运行以下命令获取有关服务的详细信息
确保openshift-adp-velero-metrics-svc 服务存在。它应该包含app.kubernetes.io/name=velero 标签,该标签将用作ServiceMonitor 对象的选择器。
$ oc get svc -n openshift-adp -l app.kubernetes.io/name=velero
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
openshift-adp-velero-metrics-svc ClusterIP 172.30.38.244 <none> 8085/TCP 1h
创建一个与现有服务标签匹配的ServiceMonitor YAML 文件,并将文件保存为3_create_oadp_service_monitor.yaml。服务监控器在openshift-adp-velero-metrics-svc 服务所在的openshift-adp 命名空间中创建。
ServiceMonitor 对象apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
app: oadp-service-monitor
name: oadp-service-monitor
namespace: openshift-adp
spec:
endpoints:
- interval: 30s
path: /metrics
targetPort: 8085
scheme: http
selector:
matchLabels:
app.kubernetes.io/name: "velero"
应用3_create_oadp_service_monitor.yaml 文件
$ oc apply -f 3_create_oadp_service_monitor.yaml
servicemonitor.monitoring.coreos.com/oadp-service-monitor created
使用 OpenShift Container Platform Web 控制台的**管理员**视角确认新的服务监控器处于**运行**状态
导航到**观察** → **目标**页面。
确保**过滤器**未选中,或者**用户**源已选中,并在文本搜索字段中键入openshift-adp。
验证服务监控器的**状态**是否为**运行**。
OpenShift Container Platform 监控堆栈允许接收使用警报规则配置的警报。要为 OADP 项目创建警报规则,请使用用户工作负载监控抓取的指标之一。
创建一个包含示例OADPBackupFailing 警报的PrometheusRule YAML 文件,并将其保存为4_create_oadp_alert_rule.yaml。
OADPBackupFailing 警报apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: sample-oadp-alert
namespace: openshift-adp
spec:
groups:
- name: sample-oadp-backup-alert
rules:
- alert: OADPBackupFailing
annotations:
description: 'OADP had {{$value | humanize}} backup failures over the last 2 hours.'
summary: OADP has issues creating backups
expr: |
increase(velero_backup_failure_total{job="openshift-adp-velero-metrics-svc"}[2h]) > 0
for: 5m
labels:
severity: warning
在此示例中,警报在以下条件下显示
过去两小时内新增失败备份的数量大于 0,并且此状态持续至少 5 分钟。
如果第一次增加的时间少于 5 分钟,则警报将处于待定状态,之后将变为触发状态。
应用4_create_oadp_alert_rule.yaml 文件,这将在openshift-adp 命名空间中创建PrometheusRule 对象
$ oc apply -f 4_create_oadp_alert_rule.yaml
prometheusrule.monitoring.coreos.com/sample-oadp-alert created
警报触发后,您可以通过以下方式查看它
在**开发人员**视角中,选择**观察**菜单。
在**管理员**视角下的**观察** → **警报**菜单中,选择**用户**作为**过滤器**框中的选项。否则,默认情况下只会显示**平台**警报。
以下是 OADP 提供的指标列表及其类型。
| 指标名称 | 描述 | 类型 |
|---|---|---|
|
从缓存中检索到的字节数 |
计数器 |
|
从缓存中检索内容的次数 |
计数器 |
|
从缓存中读取格式错误内容的次数 |
计数器 |
|
缓存中找不到内容并进行提取的次数 |
计数器 |
|
从底层存储检索到的字节数 |
计数器 |
|
底层存储中找不到内容的次数 |
计数器 |
|
无法将内容保存到缓存中的次数 |
计数器 |
|
使用 |
计数器 |
|
调用 |
计数器 |
|
调用 |
计数器 |
|
调用 |
计数器 |
|
传递给 |
计数器 |
|
调用 |
计数器 |
|
尝试备份的总数 |
计数器 |
|
尝试删除备份的总数 |
计数器 |
|
备份删除失败的总数 |
计数器 |
|
备份删除成功的总数 |
计数器 |
|
完成备份所需的时间(秒) |
直方图 |
|
备份失败的总数 |
计数器 |
|
备份期间遇到的错误总数 |
量规 |
|
已备份的项目总数 |
量规 |
|
备份的最后状态。值为 1 表示成功,0 表示失败。 |
量规 |
|
上次成功运行备份的时间(Unix 时间戳,单位为秒) |
量规 |
|
部分备份失败总数 |
计数器 |
|
备份成功总数 |
计数器 |
|
备份大小(字节) |
量规 |
|
当前存在的备份数量 |
量规 |
|
验证失败的备份总数 |
计数器 |
|
备份警告总数 |
计数器 |
|
尝试的CSI卷快照总数 |
计数器 |
|
CSI卷快照失败总数 |
计数器 |
|
CSI卷快照成功总数 |
计数器 |
|
尝试恢复的总数 |
计数器 |
|
恢复失败总数 |
计数器 |
|
部分恢复失败总数 |
计数器 |
|
恢复成功总数 |
计数器 |
|
当前存在的恢复数量 |
量规 |
|
验证失败的恢复总数 |
计数器 |
|
尝试的卷快照总数 |
计数器 |
|
卷快照失败总数 |
计数器 |
|
卷快照成功总数 |
计数器 |