阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

Knative 初体验:Eventing Hello World

  • 2019-06-17
  • 本文字数:3657 字

    阅读完需:约 12 分钟

Knative 初体验:Eventing Hello World

基于事件驱动是 Serveless 的核心功能之一,通过事件驱动服务,满足了用户按需付费(Pay-as-you-go)的需求。在之前的文章中我们介绍过 Knative Eventing 由事件源、事件处理模型和事件消费 3 个主要部分构成,那么事件如何通过这 3 个组件产生、处理以及消费呢?


本文通过 Kubernetes Event Source 示例介绍一下 Knative Eventing 中如何获取事件,并且将事件传递给 Serving 进行消费。其中事件处理基于 Broker/Trigger 模型。

背景知识

先了解一下 Broker/Trigger 事件处理模型。从 v0.5 开始,Knative Eventing 定义 Broker 和 Trigger 对象,从而能方便的对事件进行过滤。


  • Broker 提供一个事件集,可以通过属性选择该事件集。它负责接收事件并将其转发给由一个或多个匹配 Trigger 定义的订阅者。

  • Trigger 描述基于事件属性的过滤器。同时可以根据需要创建多个 Trigger。


Broker/Tiggger 模型流程处理如图所示:


前置准备

  • Knative 版本 >= 0.5

  • 安装完成 Knative Serving

  • 安装完成 Knative Eventing

操作步骤

先看一下 Kubernetes Event Source 示例处理流程,如图所示:



接下来介绍一下各个阶段如何进行操作处理。

创建 Service Account

ApiServerSource 创建 Service Account, 用于授权 ApiServerSource 获取 Kubernetes Events 。


serviceaccount.yaml 如下:


apiVersion: v1kind: ServiceAccountmetadata:  name: events-sa  namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: name: event-watcherrules:- apiGroups: - "" resources: - events verbs: - get - list - watch
---
apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: k8s-ra-event-watcherroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: event-watchersubjects:- kind: ServiceAccount name: events-sa namespace: default
复制代码


执行如下操作:


kubectl apply --filename serviceaccount.yaml
复制代码

创建 Event Source

Knative Eventing 中 通过 Event Source 对接第三方系统产生统一的事件类型。当前支持 ApiServerSource,GitHub 等多种数据源。这里我们创建一个 ApiServerSource 事件源用于接收 Kubernetes Events 事件并进行转发。k8s-events.yaml 如下:


apiVersion: sources.eventing.knative.dev/v1alpha1kind: ApiServerSourcemetadata:  name: testevents  namespace: defaultspec:  serviceAccountName: events-sa  mode: Resource  resources:  - apiVersion: v1    kind: Event  sink:    apiVersion: eventing.knative.dev/v1alpha1    kind: Broker    name: default
复制代码


这里通过 sink 参数指定事件接收方,支持 Broker 和 k8s service。


执行命令:


kubectl apply --filename k8s-events.yaml
复制代码

创建 Knative Service

首先构建你的事件处理服务,可以参考 knative-sample/event-display 开源项目。


这里的 Service 服务仅把接收到的事件打印出来,处理逻辑如下:


package mainimport (    "context"    "fmt"    "log"    cloudevents "github.com/cloudevents/sdk-go"    "github.com/knative-sample/event-display/pkg/kncloudevents")/*Example Output:
☁ cloudevents.Event:Validation: validContext Attributes, SpecVersion: 0.2 Type: dev.knative.eventing.samples.heartbeat Source: https://github.com/knative/eventing-sources/cmd/heartbeats/#local/demo ID: 3d2b5a1f-10ca-437b-a374-9c49e43c02fb Time: 2019-03-14T21:21:29.366002Z ContentType: application/json Extensions: the: 42 beats: true heart: yesTransport Context, URI: / Host: localhost:8080 Method: POSTData { "id":162, "label":"" }*/
func display(event cloudevents.Event) { fmt.Printf("Hello World: \n") fmt.Printf("cloudevents.Event\n%s", event.String())}
func main() { c, err := kncloudevents.NewDefaultClient() if err != nil { log.Fatal("Failed to create client, ", err) } log.Fatal(c.StartReceiver(context.Background(), display))}
复制代码


通过上面的代码,可以轻松构建你自己的镜像。镜像构建完成之后,接下来可以创建一个简单的 Knative Service, 用于消费 ApiServerSource 产生的事件。


service.yaml 示例如下:


apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata:  name: event-display  namespace: defaultspec:  template:    spec:      containers:      -  image: {yourrepo}/{yournamespace}/event-display:latest
复制代码


执行命令:


kubectl apply --filename service.yaml
复制代码

创建 Broker

在所选命名空间下,创建 default Broker。假如选择 default 命名空间, 执行操作如下。


kubectl label namespace default knative-eventing-injection=enabled
复制代码


这里 Eventing Controller 会根据设置knative-eventing-injection=enabled 标签的 namepace, 自动创建 Broker。并且使用在 webhook 中默认配置的 ClusterChannelProvisioner(in-memory)。

创建 Trigger

Trigger 可以理解为 Broker 和 Service 之间的过滤器,可以设置一些事件的过滤规则。这里为默认的 Broker 创建一个最简单的 Trigger,并且使用 Service 进行订阅。trigger.yaml 示例如下:


apiVersion: eventing.knative.dev/v1alpha1kind: Triggermetadata:  name: testevents-trigger  namespace: defaultspec:  subscriber:    ref:      apiVersion: serving.knative.dev/v1alpha1      kind: Service      name: event-display
复制代码


执行命令:


kubectl apply --filename trigger.yaml
复制代码


注意:如果没有使用默认的 Broker, 在 Trigger 中可以通过 spec.broker 指定 Broker 名称。

验证

执行如下命令,生成 k8s events。


kubectl run busybox --image=busybox --restart=Never -- lskubectl delete pod busybox
复制代码


可以通过下述方式查看 Knative Service 是否接收到事件。


kubectl get podskubectl logs -l serving.knative.dev/service=event-display -c user-container
复制代码


日志输出类似下面,说明已经成功接收事件。


Hello World:  ☁️  CloudEvent: valid ✅Context Attributes,  SpecVersion: 0.2  Type: dev.knative.apiserver.resource.add  Source: https://10.39.240.1:443  ID: 716d4536-3b92-4fbb-98d9-14bfcf94683f  Time: 2019-05-10T23:27:06.695575294Z  ContentType: application/json  Extensions:    knativehistory: default-broker-b7k2p-channel-z7mqq.default.svc.cluster.local    subject: /apis/v1/namespaces/default/events/busybox.159d7608e3a3572cTransport Context,  URI: /  Host: auto-event-display.default.svc.cluster.local  Method: POSTData,  {    "apiVersion": "v1",    "count": 1,    "eventTime": null,    "firstTimestamp": "2019-05-10T23:27:06Z",    "involvedObject": {      "apiVersion": "v1",      "fieldPath": "spec.containers{busybox}",      "kind": "Pod",      "name": "busybox",      "namespace": "default",      "resourceVersion": "28987493",      "uid": "1efb342a-737b-11e9-a6c5-42010a8a00ed"    },    "kind": "Event",    "lastTimestamp": "2019-05-10T23:27:06Z",    "message": "Started container",    "metadata": {      "creationTimestamp": "2019-05-10T23:27:06Z",      "name": "busybox.159d7608e3a3572c",      "namespace": "default",      "resourceVersion": "506088",      "selfLink": "/api/v1/namespaces/default/events/busybox.159d7608e3a3572c",      "uid": "2005af47-737b-11e9-a6c5-42010a8a00ed"    },    "reason": "Started",    "reportingComponent": "",    "reportingInstance": "",    "source": {      "component": "kubelet",      "host": "gke-knative-auto-cluster-default-pool-23c23c4f-xdj0"    },    "type": "Normal"  }
复制代码

总结

相信通过上面的例子你已经了解了 Knative Eventing 如何产生事件、处理事件以及消费事件。对 Eventing 中的事件处理模型也有了初步的了解。当然你可以自己定义一个事件消费服务,来处理事件。

Next

你是否已对 Knative Eventing 产生了兴趣,是否有点意犹未尽的样子? 别急,接下来我们会继续深入分析 Knative Eventing。包括:


  • 如何自定义数据源 Event Source?

  • 如何使用第三方消息服务?

  • 在遇到系统告警时,是否可以通过邮件、钉钉等发送消息?


让我们后续一起探索 Knative Eventing,欢迎持续关注。

作者介绍

元毅,阿里云智能事业群高级开发工程师


本文转载自公众号阿里巴巴云原生(ID:Alicloudnative)


原文链接


https://mp.weixin.qq.com/s?__biz=MzUzNzYxNjAzMg==&mid=2247485306&idx=1&sn=db92ddb8d367d63e3e93bc85aecc2d87&chksm=fae50cb5cd9285a3480bccbb904b62a52ee893b9c36a9b4c406101c6540eef8ee7a0cf21f506&token=776355447&lang=zh_CN#rd


2019-06-17 08:006552
用户头像
阿里云容器平台 ACK,企业云原生转型最佳搭档

发布了 43 篇内容, 共 22.5 次阅读, 收获喜欢 80 次。

关注

评论

发布
暂无评论
发现更多内容

Kotlin 学习笔记(二)—— 数据类、密闭类、循环写法以及常用集合操作符

修之竹

android kotlin

压缩解压工具:Keka中文版

真大的脸盆

Mac Mac 软件 压缩工具 解压缩软件 解压软件

QQ截图图片不够清晰解决方法

源字节1号

微信小程序 开源 软件开发

照片肖像美容软件:ON1 Portrait AI 2023.1 激活版

真大的脸盆

Mac Mac 软件 照片处理工具 肖像美容软件

adb的常用命令

测吧(北京)科技有限公司

测试

Flink CDC

数新网络官方账号

CDC工具之Debezium

数新网络官方账号

机器学习算法(五):基于企鹅数据集的决策树分类预测

汀丶人工智能

数据挖掘 机器学习 决策树

软件测试/测试开发丨app自动化测试之Andriod WebView如何测试

测试人

软件测试 自动化测试 测试开发

关于GPT-4的产品化狂想

脑极体

AI

面试高频问题之C++编译过程

小万哥

c++ 程序员 后端 编译 开发

往往排查很久的问题,最后发现都非常简单。。。

艾小仙

Java kafka spring

架构蓝图--软件架构的“4+1”视图模型

涛哥 数字产品和业务架构

软件架构 模型

Elasticsearch简介以及索引原理

数新网络官方账号

代码覆盖率最佳实践

数新网络官方账号

华为云ECS/HECS:中小企业上云第一步

IT科技苏辞

Kubernetes 简介及其调度原理

数新网络官方账号

Handler消息传递机制浅析

智趣匠

Activity Handler runOnUiThread

【Redis源码分析】Server启动过程

零点999

redis Redis 协议 Redis 核心技术与实战 Redis 数据结构 redis 底层原理

前缀和算法练习集

timerring

前缀和

解决 Font '宋体' is not available to the JVM

源字节1号

微信小程序 开源 软件开发

如何编写测试用例?

测吧(北京)科技有限公司

测试

pdf编辑工具:PDF Expert 中文激活版

真大的脸盆

Mac PDF Mac 软件 PDF编辑 pdf编辑工具

隐式等待、显示等待和强制等待

测吧(北京)科技有限公司

测试

Web3社交网络的另一种思路 - Oi! Network解析

股市老人

mybatis xml文件热加载实现

越长大越悲伤

mybatis springboot java

为什么大家都喜欢“人天”作为估算单位?

Bruce Talk

Scrum 敏捷开发 Agile

关于chatGPT是否会干掉程序员的一次专业评估

深清秋

ChatGPT 程序员发展

浅谈数据仓库工具——Hive

数新网络官方账号

赠票 | 在北京,见证边缘的力量

俞凡

零代码零距离,明道云开放日北京站圆满结束

明道云

Knative 初体验:Eventing Hello World_服务革新_阿里云容器平台_InfoQ精选文章