使用 Pub/Sub 消息接收事件 (gcloud CLI)
本快速入门介绍如何将 Google Kubernetes Engine (GKE) 服务设置为目标,以使用 Eventarc 接收来自 Pub/Sub 主题的事件。
在本快速入门中,您将执行以下操作:
- 创建 GKE 集群。
- 设置一个服务帐号,以使用将事件转发到目标的事件转发器组件从 Pub/Sub 中拉取事件。
- 在 Eventarc 中初始化 GKE 目标。
- 部署接收事件的 GKE 服务。
- 创建将 Pub/Sub 主题连接到 GKE 服务的 Eventarc 触发器。
- 生成并查看 Pub/Sub 事件。
准备工作
- 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
-
在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目。
-
确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能。
-
在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目。
-
确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能。
- 安装并初始化 Google Cloud CLI。如果系统提示您配置默认计算区域,请输入
n
。 - 更新 gcloud 组件:
gcloud components update
- 启用 Google Cloud、Cloud Build、Resource Manager、Google Kubernetes Engine API、Container Registry 和 Eventarc API:
gcloud services enable cloudapis.googleapis.com gcloud services enable cloudbuild.googleapis.com gcloud services enable cloudresourcemanager.googleapis.com gcloud services enable container.googleapis.com gcloud services enable containerregistry.googleapis.com gcloud services enable eventarc.googleapis.com
- 设置本快速入门中使用的配置变量:
gcloud config set project PROJECT_ID gcloud config set run/cluster events-cluster gcloud config set run/cluster_location us-central1 gcloud config set run/platform gke gcloud config set eventarc/location us-central1
将PROJECT_ID
替换为您的 Google Cloud 项目 ID。 - 可选:您可以使用 gcloud_name 输入以下命令来检查配置设置:
gcloud config list
输出应类似如下所示:[eventarc] location = us-central1 [run] cluster = events-cluster cluster_location = us-central1 platform = gke
创建 GKE 集群
使用 HttpLoadBalancing
插件创建 GKE 集群。启用 Workload Identity 以从 GKE 中运行的应用访问 Google Cloud 服务。
PROJECT_ID=$(gcloud config get-value project) gcloud beta container clusters create events-cluster \ --addons=HttpLoadBalancing \ --machine-type=n1-standard-4 \ --enable-autoscaling --min-nodes=2 --max-nodes=10 \ --no-issue-client-certificate --num-nodes=2 \ --logging=SYSTEM,WORKLOAD \ --monitoring=SYSTEM \ --scopes=cloud-platform,logging-write,monitoring-write,pubsub \ --zone us-central1 \ --release-channel=rapid \ --workload-pool=$PROJECT_ID.svc.id.goog
等待集群创建过程完成。您可以在创建过程中忽略警告。创建集群后,输出应类似于以下内容:
Creating cluster events-cluster...done.
Created [https://container.googleapis.com/v1beta1/projects/my-project
/zones/us-central1/clusters/events-cluster].
其中 my-project
是您的 Google Cloud 项目 ID。
这将在 my-project
中创建一个名为 events-cluster
的 GKE 集群。
设置 Google 服务帐号
设置用户提供的服务帐号并向其授予特定角色,以便事件转发器组件可以从 Pub/Sub 中拉取事件。
创建一个名为
TRIGGER_GSA
的服务帐号,用于创建触发器:TRIGGER_GSA=eventarc-gke-triggers gcloud iam service-accounts create $TRIGGER_GSA
向该服务帐号授予
pubsub.subscriber
和monitoring.metricWriter
角色:gcloud projects add-iam-policy-binding $PROJECT_ID \ --member "serviceAccount:$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/pubsub.subscriber" gcloud projects add-iam-policy-binding $PROJECT_ID \ --member "serviceAccount:$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/monitoring.metricWriter"
启用 GKE 目标
对于以 GKE 服务为目标的每个触发器,Eventarc 会创建一个事件转发器组件,用于从 Pub/Sub 拉取事件并将其转发到目标。如需在 GKE 集群中创建组件和管理资源,请向 Eventarc 服务帐号授予权限:
为 Eventarc 启用 GKE 目标:
gcloud eventarc gke-destinations init
在系统提示绑定所需角色时,输入
y
。以下角色绑定到服务帐号:
compute.viewer
container.developer
iam.serviceAccountAdmin
创建 GKE 服务目标
使用预构建的映像 gcr.io/cloudrun/hello
部署将接收和记录事件的 GKE 服务:
创建 Kubernetes Deployment:
SERVICE_NAME=hello-gke kubectl create deployment $SERVICE_NAME \ --image=gcr.io/cloudrun/hello
公开为 Kubernetes Service:
kubectl expose deployment $SERVICE_NAME \ --type LoadBalancer --port 80 --target-port 8080
创建 Pub/Sub 触发器
当消息发布到 Pub/Sub 主题时,Eventarc 触发器会将消息发送到 hello-gke
GKE 服务。
创建一个 GKE 触发器来监听 Pub/Sub 消息:
新的 Pub/Sub 主题
gcloud eventarc triggers create gke-trigger-pubsub \ --destination-gke-cluster=events-cluster \ --destination-gke-location=us-central1 \ --destination-gke-namespace=default \ --destination-gke-service=hello-gke \ --destination-gke-path=/ \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --service-account=$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com
这会创建一个新的 Pub/Sub 主题和一个名为
gke-trigger-pubsub
的触发器。现有 Pub/Sub 主题
gcloud eventarc triggers create gke-trigger-pubsub \ --destination-gke-cluster=events-cluster \ --destination-gke-location=us-central1 \ --destination-gke-namespace=default \ --destination-gke-service=hello-gke \ --destination-gke-path=/ \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --service-account=$TRIGGER_GSA@$PROJECT_ID.iam.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
的触发器。
确认触发器已成功创建:
gcloud eventarc triggers list
输出应类似如下所示:
NAME: gke-trigger-pubsub TYPE: google.cloud.pubsub.topic.v1.messagePublished DESTINATION: GKE: hello-gke ACTIVE: Yes
生成和查看事件
您可以通过向 Pub/Sub 主题发布消息来生成事件,以触发 GKE 服务。然后,您可以在 Pod 日志中查看该消息。
查找 Pub/Sub 主题并将其设置为环境变量:
TOPIC=$(gcloud eventarc triggers describe gke-trigger-pubsub --format='value(transport.pubsub.topic)')
向 Pub/Sub 主题发送消息以生成事件:
gcloud pubsub topics publish $TOPIC --message="Hello World"
GKE 服务会记录事件的消息。
要查看事件消息,请执行以下操作:
- 找到 Pod ID:
kubectl get pods
输出应类似如下所示:NAME READY STATUS RESTARTS AGE hello-gke-645964f578-2mjjt 1/1 Running 0 35s
其中,NAME
是 Pod 的名称。复制要在下一步中使用的NAME
。 - 查看 Pod 的日志:
kubectl logs NAME
将NAME
替换为您复制的 Pod 名称。 - 查找类似如下的日志条目:
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"[...]}
- 找到 Pod ID:
清理
虽然当服务未在使用时 Cloud Run 不会产生费用,但您可能仍然需要为在 Container Registry 中存储容器映像、Eventarc 资源、Pub/Sub 消息和 GKE 集群付费。
您可以删除映像、删除 Pub/Sub 主题、删除 Pub/Sub 订阅以及删除 GKE 集群。
要删除 Eventarc 触发器,请运行以下命令:
gcloud eventarc triggers delete gke-trigger-pubsub
或者,您也可以删除 Google Cloud 项目,以避免产生费用。删除 Cloud 项目后,系统即会停止对该项目中使用的所有资源计费。
gcloud projects delete PROJECT_ID_OR_NUMBER
将 PROJECT_ID_OR_NUMBER
替换为项目 ID 或编号。