排解 Google Kubernetes Engine (GKE) 適用的 Eventarc 問題

本頁說明如何解決使用 GKE 適用的 Eventarc 時可能遇到的問題,包括在 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 服務帳戶,Eventarc 就無法管理 Google Kubernetes Engine (GKE) 叢集中的資源,此時就會發生這個錯誤。

如要解決這個問題,請確認 Eventarc 服務帳戶已正確設定,並具備建立資源的適當權限。詳情請按照特定供應商、事件類型和 GKE 目的地的說明操作。

找不到目標叢集,或目標叢集未啟用 GKE 適用的 Workload Identity Federation,因此無法建立觸發條件

您會收到類似下列其中一則的錯誤訊息:

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 叢集,或叢集未啟用 GKE 的 Workload Identity Federation,就會發生這個錯誤。

如要解決這個問題,請確認目標叢集存在,且已啟用 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/standard/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 或完整 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"}