使用 Pub/Sub 訊息接收事件 (gcloud CLI)

本快速入門導覽課程說明如何設定 Google Kubernetes Engine (GKE) 服務做為目的地,以接收使用 Eventarc 的 Pub/Sub 主題事件。

在本快速入門導覽課程中,您將:

  1. 完成準備工作,例如啟用 API 和設定服務帳戶。
  2. 建立 GKE 叢集。
  3. 在 Eventarc 中初始化 GKE 目的地。
  4. 部署接收事件的 GKE 服務。
  5. 建立 Eventarc 觸發條件,將 Pub/Sub 主題連結至 GKE 服務。
  6. 產生及查看 Pub/Sub 事件。

事前準備

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.

  3. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  4. To initialize the gcloud CLI, run the following command:

    gcloud init
  5. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Install the Google Cloud CLI.

  8. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  9. To initialize the gcloud CLI, run the following command:

    gcloud init
  10. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  11. Make sure that billing is enabled for your Google Cloud project.

  12. 更新 Google Cloud CLI 元件:
    gcloud components update
  13. 啟用 Eventarc、Resource Manager 和 Google Kubernetes Engine API:
    gcloud services enable eventarc.googleapis.com \
       cloudresourcemanager.googleapis.com \
       container.googleapis.com
  14. 設定本快速入門導覽課程中使用的設定變數:
    PROJECT_ID=$(gcloud config get-value project)
    CLUSTER_NAME=events-cluster
    SERVICE_NAME=hello-gke
    LOCATION=us-central1
  15. 如果您是專案建立者,系統會授予基本「擁有者」角色 (roles/owner)。根據預設,這個身分與存取權管理 (IAM) 角色包含完全存取大多數 Google Cloud資源所需的權限,因此您可以略過這個步驟。

    如果您不是專案建立者,必須在專案中將必要權限授予適當的主體。舉例來說,主體可以是 Google 帳戶 (適用於使用者) 或服務帳戶 (適用於應用程式和運算工作負載)。詳情請參閱活動目的地的「角色和權限」頁面。

    所需權限

    如要取得完成本快速入門所需的權限,請要求管理員為您授予專案的下列 IAM 角色:

    如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

    您或許還可透過自訂角色或其他預先定義的角色取得必要權限。

  16. 記下 Compute Engine 預設服務帳戶,因為您會將其附加至 Eventarc 觸發程序,代表觸發程序的身分,以利進行測試。啟用或使用採用 Compute Engine 的服務後,系統會自動建立這個服務帳戶,電子郵件地址格式如下: Google Cloud

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    PROJECT_NUMBER 替換為專案編號。 Google Cloud您可以在 Google Cloud 控制台的「歡迎」頁面找到專案編號,也可以執行下列指令:

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'

    在正式環境中,我們強烈建議建立新的服務帳戶,並授予一或多個包含最低必要權限的 IAM 角色,遵循最低權限原則。

  17. 在專案中,將 Pub/Sub 訂閱者角色 (roles/pubsub.subscriber) 授予 Compute Engine 預設服務帳戶,讓 Eventarc 觸發程序可以從 Pub/Sub 提取事件。
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/pubsub.subscriber
  18. 如果您是在 2021 年 4 月 8 日當天或之前啟用 Cloud Pub/Sub 服務代理,請將服務帳戶權杖建立者角色 (roles/iam.serviceAccountTokenCreator) 授予服務代理,以支援已驗證的 Pub/Sub 推送要求。否則,系統會預設授予這個角色:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator

建立 GKE 叢集

GKE 叢集至少包含一個叢集控制層機器,以及多個稱為「節點」的工作站機器。節點為 Compute Engine 虛擬機器 (VM) 執行個體,會執行必要的 Kubernetes 程序,才能加入叢集。您將應用程式部署至叢集後,應用程式會在節點上運作。

建立名為 events-cluster 的 Autopilot 叢集:

gcloud container clusters create-auto $CLUSTER_NAME \
    --region $LOCATION

建立叢集可能需要幾分鐘的時間。叢集建立完成後,輸出內容應如下所示:

Creating cluster events-cluster...done.
Created [https://container.googleapis.com/v1/projects/MY_PROJECT/zones/us-central1/clusters/events-cluster].
[...]
STATUS: RUNNING

這會在專案中建立名為 events-cluster 的 GKE 叢集,專案的 Google Cloud 專案 ID 為 MY_PROJECT

啟用 GKE 目的地

針對以 GKE 服務為目標的每個觸發條件,Eventarc 會建立事件轉送器元件,從 Pub/Sub 提取事件並轉送至目標。如要在 GKE 叢集中建立元件及管理資源,請授予 Eventarc 服務代理程式權限:

  1. 為 Eventarc 啟用 GKE 目的地:

    gcloud eventarc gke-destinations init
  2. 在系統提示繫結必要角色時,輸入 y

    下列角色已繫結至服務帳戶:

    • compute.viewer
    • container.developer
    • iam.serviceAccountAdmin

建立 GKE 服務目的地

部署 GKE 服務,使用預先建構的映像檔 us-docker.pkg.dev/cloudrun/container/hello 接收及記錄事件:

  1. Kubernetes 使用名為 kubeconfig 的 YAML 檔案來儲存 kubectl 的叢集驗證資訊。使用憑證和端點資訊更新 kubeconfig 檔案,指向 GKE 叢集:kubectl

    gcloud container clusters get-credentials $CLUSTER_NAME \
        --region $LOCATION
    
  2. 建立 Kubernetes 部署:

    kubectl create deployment $SERVICE_NAME \
        --image=us-docker.pkg.dev/cloudrun/container/hello
    
  3. 將其公開為 Kubernetes 服務:

    kubectl expose deployment $SERVICE_NAME \
        --type ClusterIP \
        --port 80 \
        --target-port 8080
    

建立 Eventarc 觸發條件

訊息發布至 Pub/Sub 主題時,Eventarc 觸發程序會將訊息傳送至 hello-gke GKE 服務。

  1. 建立 GKE 觸發條件,監聽 Pub/Sub 訊息:

    新增 Pub/Sub 主題

    gcloud eventarc triggers create gke-trigger-pubsub \
        --location="$LOCATION" \
        --destination-gke-cluster=$CLUSTER_NAME \
        --destination-gke-location=$LOCATION \
        --destination-gke-namespace=default \
        --destination-gke-service=$SERVICE_NAME \
        --destination-gke-path=/ \
        --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
        --service-account="PROJECT_NUMBER-compute@developer.gserviceaccount.com"
    

    這會建立新的 Pub/Sub 主題,以及名為「gke-trigger-pubsub」的觸發條件。

    現有 Pub/Sub 主題

    gcloud eventarc triggers create gke-trigger-pubsub \
        --location="$LOCATION" \
        --destination-gke-cluster=$CLUSTER_NAME \
        --destination-gke-location=$LOCATION \
        --destination-gke-namespace=default \
        --destination-gke-service=$SERVICE_NAME \
        --destination-gke-path=/ \
        --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
        --service-account="PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
        --transport-topic=projects/PROJECT_ID/topics/TOPIC_ID
    

    更改下列內容:

    • PROJECT_ID:您的 Google Cloud專案 ID
    • TOPIC_ID:現有 Pub/Sub 主題的 ID。這會為現有 Pub/Sub 主題建立名為 gke-trigger-pubsub 的觸發程序。
  2. 確認觸發條件是否已成功建立。觸發條件最多可能需要兩分鐘才能正常運作。

     gcloud eventarc triggers list
    

    畫面會顯示如下的輸出內容:

    NAME: gke-trigger-pubsub
    TYPE: google.cloud.pubsub.topic.v1.messagePublished
    DESTINATION: GKE: hello-gke
    ACTIVE: Yes
    LOCATION: us-central1
    

產生及查看活動

您可以將訊息發布至 Pub/Sub 主題,藉此產生事件來觸發 GKE 服務。然後您就可以在 Pod 記錄中查看訊息。

  1. 找出並將 Pub/Sub 主題設為環境變數:

    TOPIC=$(gcloud eventarc triggers describe gke-trigger-pubsub \
        --location=us-central1 \
        --format='value(transport.pubsub.topic)')
  2. 將訊息傳送至 Pub/Sub 主題,產生事件:

    gcloud pubsub topics publish $TOPIC --message="Hello World"

    GKE 服務會記錄事件的訊息。

  3. 如要查看活動訊息,請按照下列步驟操作:

    1. 找出 Pod ID:

      kubectl get pods

      畫面會顯示如下的輸出內容:

      NAME                                         READY   STATUS             RESTARTS   AGE
      hello-gke-645964f578-2mjjt                   1/1     Running            0          35s

      複製 pod 的 NAME,以便在下一個步驟中使用。

    2. 檢查 Pod 的記錄:

      kubectl logs NAME

      NAME 替換為您複製的 Pod 名稱。

    3. 尋找類似下列內容的記錄項目:

      2022/02/24 22:23:49 Hello from Cloud Run! The container started successfully and is listening for HTTP requests on $PORT
      {"severity":"INFO","eventType":"google.cloud.pubsub.topic.v1.messagePublished","message":"Received event of type google.cloud.pubsub.topic.v1.messagePublished. Event data: Hello World"[...]}
      

清除所用資源

完成本文所述工作後,您可以刪除已建立的資源,避免繼續計費。

您可以:

  1. 刪除 Eventarc 觸發條件

    這也會刪除相關聯的 Pub/Sub 主題。

  2. 刪除 GKE 叢集

或者,您也可以刪除 Google Cloud 專案,以免產生費用。 刪除 Google Cloud 專案後,系統就會停止對專案使用的所有資源收取費用。

Delete a Google Cloud project:

gcloud projects delete PROJECT_ID

如果打算進行多個教學課程及快速入門導覽課程,重複使用專案有助於避免超出專案配額限制。

後續步驟

使用 Cloud 稽核記錄接收事件 (Google Cloud CLI)