Knative是一款基于Kubernetes的 Serverless 框架。其目标是制定云原生、跨平台的 Serverless 容器编排标准。Knative通过整合容器构建(或者函数)、工作负载管理(动态扩缩)以及事件驱动这三者来实现的这一Serverless标准。
那么如何给 Knative 提供生产级别的事件驱动能力?这里我们可以通过事件总线 EventBridge 来实现.
事件总线EventBridge是阿里云提供的一款无服务器事件总线服务,支持阿里云服务、自定义应用、SaaS应用以标准化、中心化的方式接入,并能够以标准化的CloudEvents 1.0协议在这些应用之间路由事件,帮助您轻松构建松耦合、分布式的事件驱动架构。
本文以上传文件到对象存储 oss 事件为例, 介绍如何通过 EventBridge 事件触发 Knative 服务。
技术架构
当前 EventBridge 支持多种数据源接入,通过配置事件总线、事件规则、事件目标,经过事件过滤、转换,直接触发 Knative 服务。通过 EventBridge 事件驱动实现了资源的按需使用。技术架构如图:
前提条件
-
您已 部署 Knative
操作步骤
步骤一:创建 Knative 服务
首先需要创建Knative Service,以下使用的是event-display示例,该示例会直接打印接收到的事件内容
-
创建service.yaml。
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
-
执行以下命令,创建Knative Service。
kubectl apply -f service.yaml
-
验证服务
$ kubectl get ksvc
NAME URL LATESTCREATED LATESTREADY READY REASON
event-display http://event-display.default.example.com event-display-00009 event-display-00009 True
步骤二:创建连接配置
-
在顶部菜单栏,选择地域,然后单击 连接配置 页签。
-
在 连接配置 页签,单击 创建 ,然后在 创建连接配置 面板,设置以下参数,完成后单击 确定 。
-
连接名称 :设置连接名称。
-
连接描述 :设置连接描述。
-
鉴权配置 :选择无需配置。
-
网络选择 :默认选择 公网 。
步骤三:创建API端点
-
连接配置 创建完成后,单击 API端点 页签,然后单击 创建 。
-
在 创建API端点 面板,设置以下参数,然后单击 确定 。
-
在 基础信息 区域,将 创建方式 设置为 自定义创建 ,然后设置API目标的名称和描述。
-
在 API配置 区域,将 URL 设置为 Knative 网关访问地址(如果是使用ALB网关设置ALB dns域名,如果是使用Kourier则设置slb ip地址),本示例中使用 http://alb-1ag1spsdeze7m1eysm.cn-hangzhou.alb.aliyuncs.com 来访问Knative 服务,将 HTTP Method 设置为 POST 。
-
在 连接配置 区域,点击 选择已有 ,然后选择上文创建Connection中的Connection。
步骤四:创建事件规则
-
在左侧导航栏,单击 事件总线 ,由于我们使用oss事件源,这里直接选择 defaut 总线。
-
在 defaut 总线面板,设置以下参数,然后单击 创建 。
-
在事件 规则 页签,设置 规则名称 和 描述 ,单击 下一步 。
-
配置事件模式,选择阿里云官方事件源
-
事件源:acs.oss
-
事件类型: oss:ObjectCreated:PutObject 。
-
-
配置事件目标,设置以下参数。
-
服务类型 :选择 API触发 。
-
创建方式 :选择 使用已有 。
-
HTTP参数 :设置事件推送给Knative 服务时传递的参数及参数内容。
-
-
Header: key为固定值Host,Value为Knative 服务域名地址( event-dispaly.default.example.com )
-
Body:为事件内容,这里key设置data, Value为事件$.data。详见 https://help.aliyun.com/document_detail/181428.html
-
验证结果
通过 oss 上传文件,即可触发事件,这里我们上传一个 demo.data 文件
ossutil cp demo.data oss://knative
登录事件总线EventBridge控制台,可以在事件追踪中,查看事件轨迹,可以看到事件已经投递成功
我们在 kubectl 查看 Knative 服务,可以看到自动触发创建了一个新的Pod
$ kubectl get po
NAME READY STATUS RESTARTS AGE
event-display-00009-deployment-56cc79666d-z2vhv 2/2 Running 0 7s
已经打印事件内容
$ kubectl logs event-display-00009-deployment-56cc79666d-z2vhv user-container
{"data":{"eventVersion":"1.0","responseElements":{"requestId":"63E21F5FEE852133319101AD"},"eventSource":"acs:oss","eventTime":"2023-02-07T09:52:31.000Z","requestParameters":{"sourceIPAddress":"106.11.167.116"},"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"}}}}
小结
我们可以看到 EventBridge 事件驱动可以与 Knative 无缝对接,让 Knative 可以轻松做到基于事件触发自动弹性。接下来也期望与EventBridge做进一步集成,降低使用配置门槛。