在Knative中使用EventBridge事件驱动

Knative Eventing提供了一个完整的事件模型,方便接入各个外部系统的事件。您可以通过在ACK集群中部署Knative Eventing组件并创建触发器,以启用事件驱动能力。事件接入后将通过CloudEvent标准在系统内部流转。本文介绍如何使用事件总线EventBridge为Knative提供生产级别的事件驱动能力。

前提条件

  • 已确保Knative Serving版本为1.12.7及以上。

  • 已安装ossutil并创建存储空间(Bucket),请参见安装ossutil创建存储空间

  • 已开通事件总线EventBridge并授权

    事件总线EventBridge是阿里云提供的一款无服务器事件总线服务,支持阿里云服务、自定义应用、SaaS应用以标准化、中心化的方式接入,并能够以标准化的CloudEvents 1.0协议在这些应用之间路由事件,帮助您轻松构建松耦合、分布式的事件驱动架构。

功能介绍

当前EventBridge支持多种数据源接入,通过配置事件总线、事件规则、事件目标,经过事件过滤、转换,可以触发EventBridge事件驱动Knative服务消费事件,实现资源的按需使用。技术架构图如下所示。

说明

对象存储OSS支持作为事件源接入到EventBridge。关于对象存储OSS作为事件源发布到事件总线EventBridge的事件类型,请参见对象存储OSS事件

image

步骤一:部署Eventing和EventBridge组件

Knative提供EventBridge事件驱动能力,支持接入阿里云官方事件源以及事件转发。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Knative

  3. 组件管理页签下,部署Eventing和EventBridge组件。

    1. 组件管理页签下,单击Eventing组件操作列的部署

    2. Eventing部署成功后,再单击EventBridge组件操作列的部署,在弹出的对话框,输入AccessKey和SecretKey后单击确定

      关于如何获取AccessKey和SecretKey,请参见创建AccessKey

      重要

      为了确保您的账号安全,建议您尽快对以下操作项进行处理:

      • RAM用户默认首次登录需要修改登录密码,请您按照界面指引修改登录密码。

      • 在控制台登录时除使用用户名和密码验证外,建议您绑定MFA设备,用于二次身份验证。具体操作方式,请参考为RAM用户绑定MFA设备

    组件状态显示为已部署时,表明部署成功。

步骤二:创建Knative服务

本文以event-display作为Knative服务,该服务会直接记录接收到的事件内容。以下介绍控制台和kubectl两种操作方式。

控制台

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Knative

  3. 单击服务管理页签,然后单击使用模板创建,创建一个Knative服务。

    示例代码如下所示。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: event-display
      namespace: default
    spec:
      template:
        spec:
          containers:
          - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/event-display:20230207194118_3874dbd

    服务管理页签下,服务状态显示为成功,表明服务已创建成功。

kubectl

  1. 参见下方示例保存event-display.yaml并部署到集群中,创建一个Knative Service。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: event-display
      namespace: default
    spec:
      template:
        spec:
          containers:
          - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/event-display:20230207194118_3874dbd
    kubectl apply -f event-display.yaml
  2. 执行以下命令,查看Knative Service是否创建成功。

    kubectl get ksvc

    预期输出:

    NAME            URL                                        LATESTCREATED         LATESTREADY           READY   REASON
    event-display   http://event-display.default.example.com   event-display-00001   event-display-00001   True    

步骤三:创建触发器

控制台

  1. Knative页面的服务管理页签下,单击目标服务名称,然后单击触发器页签。

  2. 单击创建触发器,在配置页面设置如下配置项,按照页面提示完成触发器的创建。

    配置项

    说明

    示例值

    名称

    自定义。

    my-service-trigger

    Broker

    支持选择EventBridge其他

    EventBridge

    事件源

    支持多种事件源。

    OSS

    事件类型

    支持多种事件类型。

    oss:ActionTrail:ConsoleOperation

    创建完成之后,可在触发器页签下查看。

    image

kubectl

  1. 参见下方示例创建my-service-trigger.yaml并部署到集群中,创建一个触发器。

    apiVersion: eventing.knative.dev/v1
    kind: Trigger
    metadata:
      name: my-service-trigger
    spec:
      broker: eventbridge-default-broker
      filter:
        attributes:
          source: acs.oss
          type: 'oss:ActionTrail:ConsoleOperation'
      subscriber:
        ref:
          apiVersion: serving.knative.dev/v1
          kind: Service
          name: helloworld-go
          namespace: default
    • broker:名称为eventbridge-default-broker,对应EventBridge中默认的事件总线(default)。

    • source:EventBridge支持的事件源。

    • type:事件源对应的事件类型,多个事件类型以英文半角逗号,分割。

    • subscriber:对应所订阅的服务。

    kubectl apply -f my-service-trigger.yaml
  2. 执行以下命令,查看触发器是否创建成功。

     kubectl get triggers

    预期输出:

    NAME                         BROKER                       SUBSCRIBER_URI                                   AGE   READY   REASON
    my-service-trigger           eventbridge-default-broker   http://helloworld-go.default.svc.cluster.local   42h   True   

步骤四:验证通过EventBridge触发Knative服务消费事件是否成功

在执行以下操作前,请确认您已安装ossutil。

  1. 执行以下命令,上传文件到OSS。

    说明

    OSS Bucket需要与Eventbridge处于同一个地域。

    ossutil cp <文件名称> oss://<Bucket名称>

    上传文件到OSS后,EventBridge将触发Knative服务消费事件。

  2. 查看事件轨迹。

    1. 登录事件总线EventBridge控制台,在左侧导航栏,单击事件总线
    2. 在右侧页面单击default事件操作列下的事件追踪,然后在按时间范围查询页签,设置时间范围,单击查询

    3. 选择事件源对象存储OSS事件类型上传文件的事件,单击该事件操作列的事件轨迹

      image.png

      事件轨迹页面,可以查看事件投递是否成功。

  3. 验证Knative服务是否消费事件成功。

    1. 执行以下命令,查看Knative服务是否成功消费事件。

      kubectl get  pod

      预期输出:

      NAME                                              READY   STATUS    RESTARTS         AGE
      event-display-00001-deployment-56cc79****-z2vhv   2/2     Running   0                7s
    2. 执行以下命令,查看Knative服务是否记录事件。

      kubectl logs event-display-00001-deployment-56cc79****-z2vhv user-container

      预期输出:

      {"data":{"eventVersion":"1.0","responseElements":{"requestId":"63E21F5FEE852133319101AD"},"eventSource":"acs:oss","eventTime":"2023-02-07T09:52:31.000Z","requestParameters":{"sourceIPAddress":"XX.XXX.XX.XXX"},"eventName":"ObjectCreated:PutObject","userIdentity":{"principalId":"1118324452360952"},"region":"cn-hangzhou","oss":{"bucket":{"name":"knative","arn":"acs:oss:cn-hangzhou:1581204543170042:knative","virtualBucket":"","ownerIdentity":"1581204543170042"},"ossSchemaVersion":"1.0","object":{"size":225496,"objectMeta":{"mimeType":"application/octet-stream"},"deltaSize":0,"eTag":"B350C082843DAC7E9E634193437EBA30","key":"demo.data"}}}}

    预期输出表明,Knative服务消费事件成功,并且记录了上传文件到OSS的事件,即通过EventBridge触发Knative服务消费事件成功。

相关文档

关于如何结合其他事件源实现事件驱动,请参见在Knative中使用GitHub事件源