使用 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. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 安装 Google Cloud CLI。
  3. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  4. 创建或选择 Google Cloud 项目

    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替换为您要创建的 Google Cloud 项目的名称。

    • 选择您创建的 Google Cloud 项目:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替换为您的 Google Cloud 项目 名称。

  5. 确保您的 Google Cloud 项目已启用结算功能

  6. 安装 Google Cloud CLI。
  7. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  8. 创建或选择 Google Cloud 项目

    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替换为您要创建的 Google Cloud 项目的名称。

    • 选择您创建的 Google Cloud 项目:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替换为您的 Google Cloud 项目 名称。

  9. 确保您的 Google Cloud 项目已启用结算功能

  10. 更新 Google Cloud CLI 组件:
    gcloud components update
  11. 启用 Eventarc、Resource Manager 和 Google Kubernetes Engine API:
    gcloud services enable eventarc.googleapis.com \
       cloudresourcemanager.googleapis.com \
       container.googleapis.com
  12. 设置本快速入门中使用的配置变量:
    PROJECT_ID=$(gcloud config get-value project)
    CLUSTER_NAME=events-cluster
    SERVICE_NAME=hello-gke
    LOCATION=us-central1
  13. 如果您是项目创建者,则会被授予基本 Owner 角色 (roles/owner)。默认情况下,此 Identity and Access Management (IAM) 角色可提供完全访问大多数 Google Cloud 资源所需的权限,您可以跳过此步骤。

    如果您不是项目创建者,则必须向主账号授予项目的必需权限。例如,主账号可以是 Google 账号(针对最终用户)或服务账号(针对应用和计算工作负载)。如需了解详情,请参阅事件目标位置的角色和权限页面。

    所需权限

    如需获得完成本快速入门所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:

    如需详细了解如何授予角色,请参阅管理访问权限

    您也可以通过自定义角色或其他预定义角色来获取所需的权限。

  14. 启用或使用包含 Compute Engine 的 Google Cloud 服务后,系统会自动创建 Compute Engine 默认服务账号

    为了进行测试,您可以将此服务账号附加到 Eventarc 触发器以表示该触发器的身份。请记下创建触发器时要使用的电子邮件地址格式:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

    PROJECT_NUMBER 替换为您的 Google Cloud 项目编号。您可以在 Google Cloud 控制台的欢迎页面上或者通过运行以下命令找到项目编号:

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

    系统会自动向 Compute Engine 服务账号授予项目的基本 Editor 角色 (roles/editor)。但是,如果自动角色授予功能已停用,请参阅适用的角色和权限说明以创建新的服务账号并为其授予所需的角色。

  15. 将项目的 Pub/Sub Subscriber 角色 (roles/pubsub.subscriber) 授予 Compute Engine 默认服务账号,以便 Eventarc 触发器可以拉取事件。
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/pubsub.subscriber
  16. 如果您在 2021 年 4 月 8 日或之前启用了 Cloud Pub/Sub 服务代理,以支持经过身份验证的 Pub/Sub 推送请求,请向 Google 管理的服务账号授予 Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator)。否则,系统会默认授予此角色:
    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 集群由至少一台集群控制平面计算机和多台称为节点的工作计算机组成。节点是运行 Kubernetes 进程的 Compute Engine 虚拟机 (VM) 实例,必须有这些进程,节点才能加入到集群中。您将应用部署到集群,该应用在节点上运行。

创建名为 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

这将在 Google Cloud 项目 ID 为 MY_PROJECT 的项目中创建一个名为 events-cluster 的 GKE 集群。

启用 GKE 目标

对于以 GKE 服务为目标的每个触发器,Eventarc 会创建一个事件转发器组件,用于从 Pub/Sub 拉取事件并将其转发到目标。如需在 GKE 集群中创建组件和管理资源,请向 Eventarc 服务代理授予权限:

  1. 为 Eventarc 启用 GKE 目标:

    gcloud eventarc gke-destinations init
    
  2. 在系统提示绑定所需角色时,输入 y

    以下角色绑定到服务账号:

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

创建 GKE 服务目标

使用预构建的映像 gcr.io/cloudrun/hello 部署将接收和记录事件的 GKE 服务:

  1. Kubernetes 使用名为 kubeconfig 的 YAML 文件存储 kubectl 的集群身份验证信息。使用凭据和端点信息更新 kubeconfig 文件,以将 kubectl 指向 GKE 集群:

    gcloud container clusters get-credentials $CLUSTER_NAME \
        --region $LOCATION
    
  2. 创建 Kubernetes Deployment:

    kubectl create deployment $SERVICE_NAME \
        --image=gcr.io/cloudrun/hello
    
  3. 公开为 Kubernetes Service:

    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"[...]}
      

清理

虽然当服务未在使用时 Cloud Run 不会产生费用,但您可能仍然需要为在 Container Registry 中存储容器映像Eventarc 资源Pub/Sub 消息GKE 集群付费。

您可以删除映像删除 Pub/Sub 主题删除 Pub/Sub 订阅以及删除 GKE 集群

要删除 Eventarc 触发器,请运行以下命令:

gcloud eventarc triggers delete gke-trigger-pubsub

或者,您也可以删除 Google Cloud 项目,以避免产生费用。删除 Google Cloud 项目后,系统会停止对该项目中使用的所有资源计费。

gcloud projects delete PROJECT_ID_OR_NUMBER

PROJECT_ID_OR_NUMBER 替换为项目 ID 或编号。

后续步骤

使用 Cloud Audit Logs 接收事件 (Google Cloud CLI)