本文档介绍了在使用 Backup for GKE 执行恢复操作时可能会遇到的错误和相应代码。每个部分都包含在执行操作以解决恢复错误时需要考虑的事项,以及有关如何解决恢复操作错误的说明。
错误 200010301:由于准入 webhook 服务不可用,无法完成恢复操作
当尝试完成恢复操作失败时,会发生错误 200010301
,这是因为准入 webhook 服务(也称为 HTTP 回调)不可用,从而导致以下错误消息。此错误消息表明,GKE API 服务器在尝试恢复资源时尝试联系准入 webhook,但支持该 webhook 的服务不可用或未找到:
resource [/example-group/ClusterSecretStore/example-store] restore failed:
Internal error occurred: failed calling webhook "example-webhook.io":
failed to call webhook: Post "https://example-webhook.example-namespace.svc:443/validate-example": service "example-webhook" not found.
当目标集群中存在有效的 ValidatingAdmissionWebhook
或 MutatingAdmissionWebhook
GKE 资源,但 GKE API 服务器无法访问 Webhook 中配置的端点时,会发生此错误。准入网络钩子会拦截发送到 GKE API 服务器的请求,其配置会指定 GKE API 服务器应如何查询这些请求。
Webhook 的 clientConfig
指定了处理准入请求的后端,可以是内部集群服务,也可以是外部网址。选择这两种方案中的哪一种取决于 Webhook 的具体运营和架构要求。根据选项类型的不同,恢复操作可能会由于以下原因而失败:
集群内服务:当 GKE API 服务器尝试调用 webhook 时,GKE 服务及其支持 pod 尚未恢复或准备就绪。当集群范围的 webhook 配置在命名空间服务完全处于
ready
状态之前应用时,就会发生这种情况。外部网址:由于 GKE 集群与外部端点之间的网络连接问题,或者由于 DNS 解析问题或防火墙规则,外部端点暂时不可用。
如需解决此错误,请按照以下说明操作:
确定错误消息中提及的失败的 webhook。例如
failed calling webhook "..."
。运行
kubectl get validatingwebhookconfigurations
命令,检查 webhook:kubectl get validatingwebhookconfigurations WEBHOOK_NAME -o yaml
将
WEBHOOK_NAME
替换为错误消息中发现的 webhook 的名称。您还可以运行
kubectl get mutatingwebhookconfigurations
命令来检查 Webhook:kubectl get mutatingwebhookconfigurations WEBHOOK_NAME -o yaml
将
WEBHOOK_NAME
替换为错误消息中发现的 webhook 的名称。请根据您的配置类型执行以下问题排查步骤:
基于服务的
clientConfig
通过修改
RestorePlan
资源来定义自定义恢复顺序,以包含具有GroupKindDependency
条目的RestoreOrder
。这样一来,在ValidatingWebhookConfiguration
或MutatingWebhookConfiguration
之前,支持webhook的组件(例如Deployment
、StatefulSet
或Service
)便可恢复并准备就绪。如需了解如何定义自定义恢复顺序,请参阅指定恢复期间的资源恢复顺序。
此方法可能会失败,因为即使在创建
Service
对象后,服务的 pod 也不会进入完全ready
状态。失败的另一个原因可能是,webhook 配置可能由其他应用意外创建。或者,您也可以按照以下步骤执行两阶段恢复操作:通过配置具有精细恢复过滤器的恢复操作,使用备份创建
Restore
资源,该过滤器将包含 webhook 正常运行所需的特定资源,例如Namespaces
、Deployments
、StatefulSets
或Services
。如需详细了解如何使用精细恢复过滤器配置恢复,请参阅启用精细恢复。
为备份操作创建另一个
Restore
资源,并配置您选择的其余资源。
基于网址的
clientConfig
验证外部 HTTPS 端点,确保其处于活跃状态、可访问且运行正常。
确认 GKE 集群的节点和控制平面与外部网址之间存在网络连接。您可能还需要检查防火墙规则,例如,如果您使用的是虚拟私有云、本地网络或托管webhook的云服务商,则需要检查网络政策和 DNS 解析。
重试恢复操作。如果操作仍失败,请与 Cloud Customer Care 联系以获取进一步帮助。
错误 200010302:由于资源创建请求遭拒,无法完成恢复操作
当尝试完成恢复操作失败时,会发生错误 200010302
,这是因为准入webhook拒绝了资源创建请求,从而导致以下错误消息,表明由于活跃的准入webhook拦截了请求并根据自定义政策拒绝了该请求,因此无法在目标集群中创建备份中的资源:
[KubeError]; e.g. resource
[/example-namespace/example-api/ExampleResource/example-name]
restore failed: admission webhook "example-webhook.example.com" denied the request: {reason for denial}
此错误是由目标 GKE 集群中设置的配置导致的,该配置具有 ValidatingAdmissionWebhook
或 MutatingAdmissionWebhook
,可对资源创建和修改强制执行特定规则,从而阻止资源创建请求。例如,由于集群中已存在相关但冲突的资源,webhook 会阻止创建资源。例如,如果部署已由 HorizontalPodAutoscaler
GKE API 资源管理,webhook 可能会拒绝创建该部署。
如需解决此错误,请按照以下说明操作:
使用恢复操作失败时出现的错误消息来确定拒绝请求的 Webhook。例如,
webhook WEBHOOK_NAME denied the request
错误消息包含以下信息:webhook名称:拒绝请求的webhook的名称。
拒绝原因:拒绝请求的具体原因。
运行
kubectl get validatingwebhookconfigurations
命令,检查 webhook:kubectl get validatingwebhookconfigurations WEBHOOK_NAME -o yaml
将
WEBHOOK_NAME
替换为您在错误消息中发现的webhook的名称。您还可以运行
kubectl get mutatingwebhookconfigurations
命令来检查 webhook:kubectl get mutatingwebhookconfigurations WEBHOOK_NAME -o yaml
将
WEBHOOK_NAME
替换为您从错误消息中确定的 webhook 的名称。解决目标集群中的根本问题。正确的操作取决于具体错误。例如,如果存在
HorizontalPodAutoscaler
冲突,您需要在运行恢复之前删除目标集群中现有的HorizontalPodAutoscaler
,以便创建备份的工作负载及其关联的资源。重试恢复操作。如果恢复操作仍失败,请与 Cloud Customer Care 联系以获取进一步帮助。
错误 200060202:在工作负载验证期间,由于缺少 GKE 资源,恢复操作未能完成
在恢复操作的工作负载验证阶段,如果目标集群中找不到 Backup for GKE 希望验证的 GKE 资源,就会发生错误 200060202
,并显示以下错误消息:
Workload Validation Error: [KIND] "[NAME]" not found
例如 Example: Workload Validation Error: pods "jenkins-0" not found
。
当 Backup for GKE 在恢复操作过程中成功创建或更新 GKE 资源,但在验证阶段开始时,由于在恢复流程最初创建或更新资源后但在 GKE 资源的工作负载验证完成之前,该资源已被删除,因此目标集群中不再存在一个或多个 GKE 资源,此时就会发生此错误。出现此类错误的原因如下:
手动删除:用户或管理员使用
kubectl
或其他 Google Cloud 工具手动删除了资源。外部自动化:GitOps 控制器(例如 Config Sync、ArgoCD、Flux、自定义脚本或其他集群管理工具)已恢复或删除资源,以匹配代码库中的所需状态。
GKE 控制器:GKE 控制器因资源与其他资源或政策冲突而删除了资源,或者
OwnerReference
链导致了垃圾回收,或者 GKE 的自动化清理流程在删除依赖资源的owner
资源时删除了这些依赖资源。
如需解决此错误,请按照以下说明操作:
使用恢复操作无法完成时显示的错误消息来确定缺失的资源。
使用以下方法之一找到资源所属的命名空间:
GKE 审核日志:检查尝试执行恢复操作时生成的 GKE 审核日志。您可以过滤资源
Kind
和Name
的删除操作日志。审核日志条目包含原始命名空间。备份详细信息:查看恢复操作的范围和备份的内容。备份索引会显示资源的原始命名空间。您还可以验证
RestorePlan
是否包含TransformationRule
,该文件指定了在您选择的命名空间中恢复资源的相关规则。跨命名空间搜索:运行
kubectl get
命令以在所有命名空间中搜索资源:kubectl get KIND --all-namespaces | grep NAME
将
KIND
和NAME
替换为错误消息中的值。如果资源仍然存在,此命令将显示其命名空间。
运行
kubectl get
命令,验证是否已删除:kubectl get KIND NAME -n [NAMESPACE]
将
KIND
和NAME
替换为错误消息中的值。您应该会收到not found
错误消息。使用以下方法之一调查删除原因:
GKE 审核日志:确定哪个实体发出了删除请求。例如,用户、服务账号或控制器。
检查已配置的自动化流程:如果您使用 GitOps 或其他自动化工具,请检查其日志和状态,看看它们是否干扰了已恢复的资源。
检查相关事件:运行
kubectl get events
命令,检查所确定命名空间中的 GKE 事件:kubectl get events -n NAMESPACE_NAME --sort-by='.lastTimestamp'
将
NAMESPACE_NAME
替换为命名空间的名称。
根据上一步的结果,解决资源删除的原因。例如,暂停冲突的自动化操作、更正错误配置或调整用户权限。
使用以下方法之一恢复丢失的资源:
重新应用清单文件:如果您有缺失资源的清单,可以将其重新应用到正确的命名空间。
执行精细恢复:执行精细恢复操作,以从同一备份中选择性地恢复丢失的资源,确保您指定正确的命名空间。如需详细了解如何执行精细恢复操作,请参阅启用精细恢复。
重试恢复操作。如果恢复操作仍失败,请与 Cloud Customer Care 联系以获取进一步帮助。
错误 200060201:因工作负载验证超时而无法完成恢复操作
当一个或多个已恢复的工作负载在集群中创建资源后,在预期的时间限制内未能完全变为 ready
时,就会出现错误 200060201
,从而导致以下错误消息:
Workload Validation Error: Timedout waiting for workloads to be ready - [namespace/workload_name, ...]
出现此错误的原因是,Backup for GKE 在恢复 GKE 资源配置后会执行验证步骤,以确保关键工作负载正常运行。Backup for GKE 会等待某些工作负载达到 ready
状态,但至少有一个工作负载在分配的超时时间内未满足以下就绪条件:
对于
Pods
:status.Phase
为Running
对于
Deployments
:status.ReadyReplicas
等于spec.Replicas
对于
StatefulSets
:status.ReadyReplicas
等于spec.Replicas
对于
DaemonSets
:status.NumberReady
等于status.DesiredNumberScheduled
如需解决此错误,请按照以下说明操作:
在错误消息中,找出未处于
ready
状态的工作负载。该消息会列出未能进入ready
状态的工作负载及其命名空间。运行
kubectl describe
命令,检查工作负载状态并获取失败工作负载的详细信息和事件:kubectl describe WORKLOAD_TYPE WORKLOAD_NAME -n NAMESPACE_NAME kubectl get pods -n NAMESPACE_NAME -l SELECTOR_FOR_WORKLOAD
替换以下内容:
WORKLOAD_TYPE
:工作负载的类型,例如Deployment
、StatefulSet
或DaemonSet
。WORKLOAD_NAME
:特定工作负载实例的名称。NAMESPACE_NAME
:工作负载所在的命名空间。SELECTOR_FOR_WORKLOAD
:用于查找与工作负载关联的Pods
的标签选择器。例如app=my-app
。
对于
Deployments
或StatefulSets
工作负载类型中的 pod,请运行kubectl describe pod
命令来检查各个 pod 的状态:kubectl describe pod POD_NAME -n NAMESPACE_NAME
替换以下内容:
POD_NAME
:特定 pod 的名称。NAMESPACE_NAME
:Pod 所在的命名空间。
在
Events
部分中,分析describe
输出中的事件和日志,并找到以下信息:ImagePullBackOff / ErrImagePull
:表示提取容器映像时存在问题。CrashLoopBackOff
:表示容器正在启动并崩溃。
在
Containers
部分中,分析describe
输出中的容器日志,通过运行kubectl logs
命令找到容器名称:kubectl logs POD_NAME -n NAMESPACE_NAME -c CONTAINER_NAME
替换以下内容:
POD_NAME
:特定 pod 的名称。NAMESPACE_NAME
:Pod 所在的命名空间。CONTAINER_NAME
:Pod 中容器的名称。
根据
describe
输出,Pod 可能未显示在资源输出中,原因有多种,包括:就绪性探测失败:容器的就绪性探测未成功。
资源问题:集群中的 CPU、内存或其他资源不足,或者已达到配额限制。
init 容器问题:init 容器中的故障阻止了主容器启动。
配置错误:
ConfigMaps
、Secrets
或环境变量中的错误。网络问题:
Pods
无法与所需服务通信。
检查 GKE 集群资源,确保 GKE 集群具有足够的节点容量、CPU 和内存来运行已恢复的工作负载。在 Autopilot 集群中,节点自动预配可能需要额外的时间,因此,我们建议您检查是否存在任何节点伸缩限制或错误。根据您的发现解决潜在问题,并解决阻止工作负载进入
ready
状态的问题。此方法可能涉及更正清单、调整资源请求或限制、修复网络政策,或确保满足依赖项。解决潜在问题后,等待工作负载进入
ready
状态。您无需再次运行恢复操作。
如果问题仍然存在,请与 Cloud Customer Care 联系以获取进一步帮助。
错误 200060102:由于卷验证错误,无法完成恢复操作
错误 200060102
的出现是因为一个或多个 VolumeRestore
资源(用于管理将数据从 VolumeBackup
恢复到 PersistentVolume
的过程)在恢复操作的卷验证阶段进入了 failed
或 deleting
状态。卷恢复失败会导致恢复资源的 stateReason 字段中显示以下错误消息:
Volume Validation Error: Some of the volume restores failed - [projects/PROJECT_ID/locations/LOCATION/restorePlans/RESTORE_PLAN_ID/restores/RESTORE_ID/volumeRestores/VOLUME_RESTORE_ID (PVC: NAMESPACE/PVC_NAME), ...]
错误消息会列出失败的 VolumeRestore
的完整资源名称,包括目标 PersistentVolumeClaim
名称和命名空间。此错误消息表明,当 Backup for GKE 启动 VolumeRestore
资源以从 VolumeBackups
预配 PersistentVolumes
时,受影响的 PersistentVolumeClaim
的数据恢复过程未成功完成,并且从快照创建底层 Persistent Disk 失败。VolumeRestore
失败可能由以下原因导致:
配额不足:项目或区域中分配的 Persistent Disk 配额不足,例如
SSD_TOTAL_GB
。权限问题:Backup for GKE 使用的服务账号缺少创建磁盘或访问快照所需的权限。
网络问题:存在暂时性或持续性网络问题,导致磁盘创建过程中断。
无效的快照:来源
VolumeBackup
或底层 Persistent Disk 快照已损坏或无法访问。资源限制:其他集群资源限制阻碍了卷配置。
内部错误:Persistent Disk 服务存在内部问题。
如需解决此错误,请按照以下说明操作:
确定错误消息中列出的失败的
PersistentVolumeClaims
,其中列出了失败的VolumeRestore
对象的完整资源名称。运行
gcloud beta container backup-restore volume-restores describe
命令,获取每个失败的VolumeRestore
资源的详细信息:gcloud beta container backup-restore volume-restores describe VOLUME_RESTORE_ID \ --project=PROJECT_ID \ --location=LOCATION \ --restore-plan=RESTORE_PLAN_ID \ --restore=RESTORE_ID
替换以下内容:
VOLUME_RESTORE_ID
:失败的VolumeRestore
资源的 ID。PROJECT_ID
:您的 Google Cloud 项目的 ID。LOCATION
:恢复的 Google Cloud 位置。RESTORE_PLAN_ID
:恢复方案的 ID。RESTORE_ID
:恢复操作的 ID。
检查输出中的
state
和stateMessage
字段,了解有关失败的详细信息。运行
kubectl get pvc
命令,检查目标PersistentVolumeClaim
的状态:kubectl get pvc PVC_NAME -n NAMESPACE_NAME -o yaml
替换以下内容:
PVC_NAME
:PersistentVolumeClaim
资源的名称。NAMESPACE_NAME
:PersistentVolumeClaim
所在的命名空间。
确认输出的
status.phase
部分显示的是Pending
阶段。此阶段意味着PersistentVolumeClaim
尚未绑定到PersistentVolume
,如果VolumeRestore
失败,则这是预期行为。检查 YAML 输出中的
Events
部分,查找与配置失败相关的消息,例如ProvisioningFailed
:Cloud KMS error when using key projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/CRYPTO_KEY: Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource 'projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/CRYPTO_KEY' (or it may not exist).
输出表明,在创建磁盘期间访问加密密钥时存在权限问题。如需提供
compute service agent
访问密钥的相关权限,请按照 Backup for GKE 文档中有关启用 CMEK 加密的说明操作。运行
kubectl get events
命令,查看PersistentVolumeClaim
命名空间中的 GKE 事件,这些事件会提供来自PersistentVolume
控制器或 CSI 驱动程序的详细错误消息:kubectl get events -n NAMESPACE_NAME --sort-by='.lastTimestamp'
将
NAMESPACE_NAME
替换为PersistentVolumeClaim
的命名空间,识别与
PersistentVolumeClaim
名称相关的事件,该名称包含FailedProvisioning
或ExternalProvisioning
等关键字。 这些事件还可能包含来自存储空间配置程序的错误,例如pd.csi.storage.gke.io
。检查 Cloud Audit Logs 和 Cloud Logging 中的 Persistent Disk 日志,看看在故障发生前后是否存在与磁盘创建操作相关的任何错误,从而检查 Persistent Disk 日志。
根据生成的错误消息,解决以下潜在问题:
如果系统指示,请增加永久性磁盘配额,例如
(QUOTA_EXCEEDED}: Quota SSD_TOTAL_GB exceeded
。验证并更正 IAM 权限。
调查并解决网络问题。
请与 Cloud Customer Care 联系,以解决快照或 Persistent Disk 服务方面的问题。
PersistentVolumeClaim
仍处于Pending
状态。恢复操作流程不会自动重试
VolumeRestore
。如需解决此问题,您应针对使用受影响的PersistentVolumeClaim
的Deployment
或StatefulSet
工作负载触发恢复操作。使用精细恢复功能,有选择地恢复与失败的
PersistentVolumeClaim
关联的Deployment
或StatefulSet
工作负载。如果底层问题得到解决,此方法可让标准 GKE 机制再次处理PersistentVolumeClaim
创建和绑定过程。如需详细了解精细恢复,请参阅启用精细恢复。
如果问题仍然存在,或者 VolumeRestore
失败的原因尚不清楚,请与 Cloud Customer Care 联系以获取进一步帮助。
错误 200060101:由于卷验证超时,无法完成恢复操作
在恢复操作的卷验证阶段,如果至少一个负责从 VolumeBackup
恢复数据的 VolumeRestore
资源在分配的超时时间内未达到 succeeded
状态,导致 Backup for GKE 停止等待,则会发生错误 200060101
。其他 VolumeRestore
资源也可能不完整。
Restore
资源的 stateReason
字段中的错误消息显示了在检查超时时遇到的第一个尚未处于 succeeded
状态的 VolumeRestore
资源。它包含特定 VolumeRestore
的目标 PersistentVolumeClaim
名称和命名空间,例如:
Volume Validation Error: Timed out waiting for volume restore [projects/PROJECT_ID/locations/LOCATION/restorePlans/RESTORE_PLAN_NAME/restores/RESTORE_NAME/volumeRestores/VOLUME_RESTORE_ID (PVC: PVC_NAMESPACE/PVC_NAME)]
Backup for GKE 会启动 VolumeRestore
资源,以从 VolumeBackups
预配 PersistentVolumes
。此错误表明,从快照创建底层 Persistent Disk 以及随后将 PersistentVolumeClaim
绑定到 PersistentVolume
的时间超过了所引用 VolumeRestore
的计算超时时间。同一恢复操作的其他 VolumeRestores
也可能处于未完成状态。
即使从 Backup for GKE 的角度来看已达到超时时间,上述 VolumeRestore
资源(可能还有 VolumeRestore
资源)的底层磁盘创建过程可能仍在进行中或已失败。
如需解决此问题,请按照以下说明操作:
在错误消息中找到超时的
PersistentVolumeClaim
名称和命名空间,例如(PVC: PVC_NAMESPACE/PVC_NAME)
。运行
gcloud beta container backup-restore volume-restores list
命令,列出与恢复操作关联的所有VolumeRestores
,以查看它们的当前状态:gcloud beta container backup-restore volume-restores list \ --project=PROJECT_ID \ --location=LOCATION \ --restore-plan=RESTORE_PLAN_NAME \ --restore=RESTORE_NAME
替换以下内容:
PROJECT_ID
: Google Cloud 项目的 ID。LOCATION
:恢复的 Google Cloud 位置。RESTORE_PLAN_NAME
:恢复方案的名称。RESTORE_NAME
:恢复操作的名称。
找到未处于
succeeded
状态的VolumeRestores
。运行
gcloud beta container backup-restore volume-restores describe
命令,获取错误中提及的VolumeRestore
以及任何其他未处于succeeded
状态的VolumeRestores
的详细信息:gcloud beta container backup-restore volume-restores describe VOLUME_RESTORE_ID \ --project=PROJECT_ID \ --location=LOCATION \ --restore-plan=RESTORE_PLAN_NAME \ --restore=RESTORE_NAME
替换以下内容:
VOLUME_RESTORE_ID
:VolumeRestore
资源的 ID。PROJECT_ID
:您的 Google Cloud 项目的 ID。LOCATION
:恢复的 Google Cloud 位置。RESTORE_PLAN_NAME
:恢复方案的名称。RESTORE_NAME
:恢复操作的名称。
检查
state
和stateMessage
字段。state
字段的值很可能是creating
或restoring
。stateMessage
字段可能会提供更多背景信息,并包含目标PersistentVolumeClaim
详细信息。运行
kubectl get pvc
命令,检查已识别的目标PersistentVolumeClaims
的状态:kubectl get pvc PVC_NAME -n PVC_NAMESPACE -o yaml
替换以下内容:
PVC_NAME
:PersistentVolumeClaim
的名称。PVC_NAMESPACE
:PersistentVolumeClaim
的命名空间。
PersistentVolumeClaim's
status.phase
的值很可能为Pending
。在Events
部分中检查是否存在以下错误:Waiting for first consumer to be created before binding
:表示StorageClass
具有volumeBindingMode: WaitForFirstConsumer
。PersistentVolume
的预配会延迟,直到创建并调度使用PersistentVolumeClaim
的Pod
。问题可能出在Pod
调度上,而不是卷配置本身。因此,我们建议您确认Pods
消耗PersistentVolumeClaim
的原因,看看它们为何未被调度或未启动。FailedProvisioning
或存储空间配置程序中的错误:例如pd.csi.storage.gke.io
。
运行
kubectl get events
命令,查看相关命名空间中的 GKE 事件:kubectl get events -n PVC_NAMESPACE --sort-by='.lastTimestamp'
将
PVC_NAMESPACE
替换为PersistentVolumeClaim
的命名空间。查找与
PersistentVolumeClaim
名称相关的事件,例如配置消息或错误。在 Cloud Logging 中检查 Cloud Audit Logs 和 Persistent Disk 日志。
监控处于
creating
和restoring
状态的所有VolumeRestores
的状态。问题修复后,
VolumeRestores
的状态可以转换为succeeded
或failed
状态。如果VolumeRestores
达到succeeded
状态,PersistentVolumeClaims
应变为Bound
,并且工作负载应正常运行。如果任何VolumeRestore
进入failed
状态,您需要执行问题排查步骤来解决卷验证错误。如需了解详情,请参阅错误 200060102:因卷验证错误而无法完成恢复操作
如果 VolumeRestores
长时间保持 creating
或 restoring
状态,请与 Cloud Customer Care 联系以获取进一步帮助。