HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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:006703
用户头像
阿里云容器平台 ACK,企业云原生转型最佳搭档

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

关注

评论

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

文心一言 VS 讯飞星火 VS chatgpt (86)-- 算法导论8.2 3题

福大大架构师每日一题

福大大架构师每日一题

引领未来,挑战与机遇并存

百度开发者中心

人工智能 图像识别 文心大模型

细数2019-2023年CWE TOP 25 数据,看软件缺陷的防护

华为云开发者联盟

安全 后端 华为云 华为云开发者联盟 企业号9月PK榜

重新定义内容创作和教育的新范式

百度开发者中心

人工智能 文心一言 文心大模型‘

腾讯专有云TCE高分通过信通院“一云多芯”标准测试

Geek_2d6073

聚焦用户隐私安全,华为助力APP开发者守护个人信息安全

最新动态

夏天不开车?沃尔沃XC40纯电版为你带来清凉与健康

新消费日报

荣耀开发者沙龙 · 北京站 活动精彩回顾

荣耀开发者服务平台

开发者 互联网技术 互联网生态 安卓 ios honor

Autodesk AutoCAD 2021 for mac(cad2021) v2021.1.2永久激活版

mac

苹果mac Windows软件 CAD设计软件 AutoCAD 2021

业务不想停机,就得这么实现MongoDB迁移

NineData

mongodb 数据迁移 NineData MongoDB迁移 全量数据迁移

龙智携手Atlassian和JFrog举办线下研讨会,探讨如何提升企业级开发效率与质量

龙智—DevSecOps解决方案

Atlassian JFrog

如何避免财务共享流程设计不够落地导致实施初期重新设计的问题

用友BIP

智能财务 财务共享

影响LED显示屏价格的因素

Dylan

软件 硬件 价格 LED显示屏 led显示屏厂家

你应该知道的几个大数据平台相关术语

行云管家

数据中台 数据安全 大数据平台

时尚行业的前沿与挑战

百度开发者中心

人工智能 ChatGPT 生成式AI 文心一言

ClickHouse在腾讯游戏营销效果分析中的探索实践

腾讯云大数据

Clickhouse

AI应用如何进行测试?

互联网工科生

人工智能 AI

D&R IP-SoC China 2023 Day演讲预告 | 龙智Perforce专家解析芯片开发中的数字资产管理

龙智—DevSecOps解决方案

芯片 半导体

数仓资源管控理论已掌握,是时候实战了

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号9月PK榜

NFTScan | 08.28~09.03 NFT 市场热点汇总

NFT Research

NFT\

做等保测评的公司有多少家?哪里可以查到?

行云管家

网络安全 等级保护 等保测评 等保测评机构 行云堡垒

OpenHarmony使用ArkUI Inspector分析布局

OpenHarmony开发者

OpenHarmony

开箱即用!3个视频教你玩转华为云CodeArts Board!

华为云PaaS服务小智

云计算 软件开发 华为云

入坑ThreadLocal,这一篇文章就够了

树上有只程序猿

Java ThreadLocal

公众期待开放的自然语言处理神器

百度开发者中心

人工智能 ChatGPT 文心一言

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