接收自定义事件

了解如何使用 curl 命令行工具生成自定义事件,然后将这些事件发送到 Cloud Run for Anthos on Google Cloud 中的服务。

准备工作

为完成此任务,您必须拥有一个事件代理,并知道它正在哪个命名空间中运行。了解如何配置 Events for Cloud Run for Anthos 并创建事件代理

如果您正在运行事件代理,则可以运行以下命令来查看 Kubernetes 命名空间

kubectl get brokers -n NAMESPACE

部署 Cloud Run for Anthos on Google Cloud 事件接收器服务

部署可从事件代理接收事件的 Cloud Run for Anthos on Google Cloud 服务。

要部署 Cloud Run for Anthos on Google Cloud 服务,请执行以下操作:

  1. 克隆代码库:

    Python

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
    cd python-docs-samples/eventarc/audit-storage
    

    Java

    git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
    cd java-docs-samples/eventarc/audit-storage
    

    Go

    git clone https://github.com/GoogleCloudPlatform/golang-samples.git
    cd golang-samples/eventarc/audit_storage
    

    Node.js

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
    cd nodejs-docs-samples/eventarc/audit-storage
    

    C#

    git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git
    cd dotnet-docs-samples/eventarc/audit-storage
    
  2. 构建容器并将其上传到 Cloud Build:

    gcloud builds submit \
      --tag gcr.io/$(gcloud config get-value project)/CLOUD_RUN_CONTAINER_NAME
    
  3. 将容器映像部署到 Cloud Run for Anthos on Google Cloud:

    gcloud run deploy CLOUD_RUN_SERVICE_NAME \
        --namespace=NAMESPACE \
        --image gcr.io/$(gcloud config get-value project)/CLOUD_RUN_CONTAINER_NAME
    

当您看到服务网址时,表示已成功部署服务。

使用 cURL 生成事件

您可以使用在 Google Kubernetes Engine Pod 中运行的 curl 生成事件:

  1. 在事件代理的命名空间中创建 Google Kubernetes Engine Pod:

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        run: curl
      name: curl
      namespace: NAMESPACE
    spec:
      containers:
      - image: radial/busyboxplus:curl
        imagePullPolicy: IfNotPresent
        name: curl
        stdin: true
        tty: true
    EOF
    

    其中 NAMESPACE 是与您的事件代理相同的命名空间。

  2. 通过运行以下命令验证 Pod 是否正常运行:

    kubectl get pod curl -n NAMESPACE
    

    其中 NAMESPACE 是与您的事件代理相同的命名空间。

    您会看到一个名为 curl 的 Pod 启动并运行(状态:正在运行)。

为事件代理创建触发器

  1. 使用过滤条件 alpha-type 事件创建触发器:

    gcloud beta events triggers create TRIGGER_NAME \
        --namespace NAMESPACE \
        --target-service=CLOUD_RUN_SERVICE_NAME \
        --type=alpha-type \
        --custom-type
    

    其中 NAMESPACE 是与您的事件代理相同的命名空间。

    如果您未指定过滤条件,则所有事件都将发送到 Cloud Run for Anthos on Google Cloud 服务。请注意,支持对任意数量的 CloudEvents 属性和扩展程序进行精确过滤。如果您的过滤器设置了多个属性,则事件必须匹配所有属性。

  2. 验证触发器是否已设置:

    gcloud beta events triggers list \
        --target-service 'CLOUD_RUN_SERVICE_NAME' \
        --namespace NAMESPACE
    

    其中 NAMESPACE 是与您的事件代理相同的命名空间。

    输出内容类似如下:

    TRIGGER                  EVENT TYPE           TARGET
    trigger-name           alpha-type           cloud-run-service
    

您将看到触发器 [TRIGGER-NAME] 启动并运行。

创建活动

要生成事件,请从 Google Kubernetes Engine Pod 向事件代理发送 HTTP 请求。

  1. 获取 HTTP 请求将发送到的事件代理的网址:

    kubectl get brokers default \
        --namespace NAMESPACE \
        --output jsonpath="{.status.address.url}"
    

    记下代理的网址,您将使用它来发送 HTTP 请求。

  2. 通过 SSH 连接到 Pod:

    kubectl --namespace NAMESPACE attach curl -it
    
  3. 使用 curl 发出 HTTP 标头为 Ce-Type: alpha-type 的 HTTP 请求,以将触发器的过滤条件与事件代理匹配。在此示例中,消息为 send-cloudevents-to-broker

    curl -v "EVENT_BROKER_URL" \
        -X POST \
        -H "Ce-Id: my-id" \
        -H "Ce-Specversion: 1.0" \
        -H "Ce-Type: alpha-type" \
        -H "Ce-Subject: custom event" \
        -H "Ce-Source: my-source" \
        -H "Content-Type: application/json" \
        -d '{"msg":"send-cloudevents-to-broker"}'
    

    此操作会生成一个事件,然后代理将做出响应,并返回 HTTP 202 响应。

查看事件

通过查看 Cloud Run for Anthos on Google Cloud 接收器服务的日志来查看事件:

  1. 如需查看日志,请输入:

    gcloud logging read "resource.type=k8s_container \
        resource.labels.namespace_name=events \
        resource.labels.container_name=user-container"
    

清理

删除在本教程中创建的资源,以避免重复收费。

  1. 删除 Pod:

    kubectl delete pod curl --namespace >NAMESPACE
    
  2. 删除触发器:

    gcloud beta events triggers delete TRIGGER_NAME \
        --namespace >NAMESPACE