写点什么

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

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

关注

评论

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

基础架构部如何推动新一代云原生架构变革

星汉未来

开源 云原生 开源社区 云计算,

你知道,java项目中是如何获取文件地址的吗?

华为云开发者联盟

Java 路径 ClassLoader 文件地址 绝对地址

跨平台应用开发进阶(二) :uni-app 实战

No Silver Bullet

uni-app 跨平台 规范 2月月更

[Python公开课]零基础玩转Python基础篇----第六节:Python中的函数

是Dream呀

2月月更

博云信创云管平台入选工信部推荐解决方案名单,头部券商信创案例获应用示范单项!

BoCloud博云

云服务 信创 云平台

开源算力引擎 BridgX 发布 0.6.0 版本:新增三种权限管理功能

星汉未来

开源 运维 云原生 云计算, 开源生态

一文看懂业界在离线混部技术

星汉未来

开源 云原生 服务治理 云计算, 混部

YoloV5实战:手把手教物体检测

华为云开发者联盟

物体检测 模型 yolo YOLOv5 Labelme

Flutter 屏幕采集实战分享

ZEGO即构

flutter 音视频开发 屏幕采集编码

当 TiDB 遇上 Flink:TiDB 高效入湖“新玩法” | TiLaker 团队访谈

PingCAP

Ti-Click:通过浏览器快速搭建 TiDB 在线实验室 | Ti-可立刻团队访谈

PingCAP

【思特奇杯·云上蓝桥-算法集训营】第2周----真题汇总+思路分享

是Dream呀

2月月更

Hive 数据倾斜问题定位排查及解决

编程江湖

使用s3fs在centos上挂载bucket

阿呆

S3

9期视频告诉你如何更正确更高效的使用Git

阿里云云效

git 阿里云 云原生 代码 研发

CTF题目中遇到的PHP考点总结(一)

H

php CTF WEB安全

[Python公开课]零基础玩转Python进阶篇----第一节:Python中的文件操作

是Dream呀

2月月更

[Python公开课]零基础玩转Python进阶篇----第二节:Python的异常分析及解决

是Dream呀

2月月更

NodeJS搭建本地服务指南

编程江湖

node,js

【Python训练营】Python每日一练----第2天:门牌制作

是Dream呀

2月月更

智能运维引擎 CudgX 更新 V0.2.0 版本,新增根据 MetricQPS 进行自动扩缩容!

星汉未来

云原生 算力 智能运维 扩缩容

如何找寻职业方向感

万事ONES

ONES

详解CNN实现中文文本分类过程

华为云开发者联盟

机器学习 CNN 深度神经网络 文本分类 Word2Vec

Serverless 与工具链建设

刘宇

Serverless 工具链

爬虫requests模块 入门到入狱 :基础知识+实战分析

是Dream呀

2月月更

产品更新 | 数据物流引擎 DTExpress 新增算力市场及跨云传输

星汉未来

数据迁移 云算力 云 原生云 CTO

一行代码:开启 eBPF,代替 iptables,加速 Istio

Daocloud 道客

istio 开源项目 网络加速 服务网格 ebpf

金融行业研发管理平台选型

帅气IT小哥

[Python公开课]零基础玩转Python基础篇----第七节:Python中的高级函数

是Dream呀

2月月更

刚出炉的《Java开发手册黄山版》,我帮你们圈出了改动点!

捉虫大师

Python格式字符串的三种方法你都掌握了吗,%s%d%f+format()+f-string,深度测评YYDS实至名归

是Dream呀

2月月更

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