排查 Eventarc for Google Kubernetes Engine (GKE) 问题

本页面介绍了如何解决在使用 Eventarc for GKE 时可能遇到的问题,包括在 GKE 集群中运行的专用服务和公共服务的公共端点。

有关您可能会遇到的其他问题,请参阅以下问题排查页面:

触发器创建操作失败,并显示资源创建权限错误

您收到以下错误消息之一:

Error applying IAM policy for service account 'projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT':
Error setting IAM policy for service account 'projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT':
googleapi: Error 403: Permission iam.serviceAccounts.setIamPolicy is required to perform this
operation on service account SERVICE_ACCOUNT., forbidden

Error when reading or editing Container Cluster "cluster": googleapi:
Error 403: Required "container.clusters.get" permission(s) for "..."., forbidden
Error reading instance group manager returned as an instance group URL:
"googleapi: Error 403: Required 'compute.instanceGroupManagers.get' permission
for '...', forbidden"

如果您未正确设置 Eventarc 管理 Google Kubernetes Engine (GKE) 集群中的资源所需的 Eventarc 服务账号,就会发生此错误。

如需解决此问题,请确保 Eventarc 服务账号已正确配置创建资源的适当权限。如需了解详情,请按照特定提供方、事件类型和 GKE 目标的说明操作。

由于找不到目标集群或目标集群未启用 Workload Identity,因此触发器创建操作失败

您收到以下错误消息之一:

ERROR: (gcloud.eventarc.triggers.create) NOT_FOUND: Not found: projects/PROJECT_ID/locations/
LOCATION/clusters/CLUSTER_NAME.
...
ERROR: (gcloud.eventarc.triggers.create) INVALID_ARGUMENT: workload identity is not enabled on
cluster CLUSTER_NAME in LOCATION
...

当 Eventarc 找不到目标 GKE 集群或者该集群未启用 Workload Identity 时,就会发生此错误。

要解决此问题,请确保目标集群存在并已启用 Workload Identity

触发器创建操作因资源状态无效而失败

您会收到有关项目的如下错误消息:

ERROR: (gcloud.eventarc.triggers.create) Invalid resource state for projects/PROJECT_ID/locations/LOCATION/triggers/TRIGGER_ID.
Ensure that you have enabled your GKE destination and assigned required permissions to the service account.
For more information, see https://cloud.google.com/eventarc/docs/gke/troubleshooting.

在以下情况下,会发生此错误:

  • GKE 目标尚未启用。
  • 服务账号未被授予 Eventarc 管理 GKE 目标的事件所需的角色和权限。

要解决此问题,请执行以下操作:

  1. 确保您已启用 GKE 目标:
    gcloud eventarc gke-destinations init
    如需了解详情,请按照“启用 GKE 目标”部分中特定提供方和事件类型的说明操作。
  2. 确保 Eventarc 服务账号已配置创建资源所需的权限。如需详细了解如何向服务账号授予适当的角色,请按照“准备创建触发器”中特定提供商和事件类型的说明操作。
  3. 如果此错误仍然存在,请与支持团队联系

已成功创建触发器,但目标未收到事件

确认创建触发器以后等待了足够长的时间。触发器最长可能需要两分钟才能发送事件。

  1. 如果事件未传送到目标,则从 Pub/Sub 发送到目标的事件可能会被丢弃:

    为确保事件不被丢弃,请设置 Pub/Sub 订阅重试政策将未传送的消息转发到死信主题(也称为死信队列)。

    在设置死信主题之前,请检索触发器的主题和订阅:

    gcloud eventarc triggers describe TRIGGER \
      --location=LOCATION

    替换以下内容:

    • TRIGGER:触发器的 ID 或完全限定标识符。
    • LOCATION:Eventarc 触发器的位置。
  2. 如果触发器仍然不正常,请检查 Eventarc 的事件转发器组件的状态,以查看它是否已正确部署:

    1. 通过列出名称中包含 event-forwarder 的所有 Pod,确定集群命名空间:
      kubectl get pods --all-namespaces | grep event-forwarder
      输出类似于以下内容:
      event-forwarder-namespace-hash1   event-forwarder-hash1   1/1   Running   0   5d2h
      event-forwarder-namespace-hash2   event-forwarder-hash2   1/1   Running   0   2d2h
      
      命名空间的前 30 个字符应与您创建的 Eventarc 触发器的名称一致,后跟哈希值,以消除任何具有相同的初始 30 个字符的触发器的歧义。
    2. 检索部署详细信息:
      kubectl get deployments -n EVENT_FORWARDER_NAMESPACE event-forwarder
    3. 检索 Pod 详细信息:
      kubectl describe pod -n EVENT_FORWARDER_NAMESPACE EVENT_FORWARDER_HASH
    4. 输出 Pod 日志以调查失败的原因或位置:
      kubectl logs -f -n EVENT_FORWARDER_NAMESPACE EVENT_FORWARDER_HASH
      例如,在以下日志中,服务账号已被撤消 Pub/Sub Subscriber 角色:
      {"error":"generic::permission_denied: missing 'pubsub.subscriptions.consume' permission",
      "message":"Permissions check failed","severity":"fatal","timestamp":"2021-07-07T14:57:49.038877483Z"}