NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

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

关注

评论

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

音频编辑服务UI SDK接入指导及常见问题

HMS Core

HMS Core

可变二维码,玩转“码”上时代

旺链科技

区块链 区块链技术 区块链溯源

2023最新版网络安全保姆级指南,从0基础进阶网络攻防工程师

网络安全学海

运维 网络安全 信息安全 渗透测试 漏洞挖掘

营销大数据如何帮助企业深入了解客户-镭速

镭速

SR锁存器与D锁存器设计与建模

timerring

FPGA

函数计算|如何使用层解决依赖包问题?

Serverless Devs

专访三维空间雷成老师 | 原来水墨画风格的3D建筑动画可以如此惊艳……

Renderbus瑞云渲染农场

瑞云渲染 3D建筑动画 三维空间

什么是渲染农场,渲染农场一般怎么收费?

Renderbus瑞云渲染农场

云渲染农场 渲染农场

微盟全链路压测:如何帮助电商业务实现10倍性能提升?

TakinTalks稳定性社区

《流浪地球2》的现实倒影(一):从量子计算机到MOSS

脑极体

量子计算机 小苔藓 流浪地球 MOSS

新增模型服务、训练记录、源代码关联追溯,助力模型全生命周期管理|ModelWhale 版本更新

ModelWhale

人工智能 机器学习 云计算 数据分析 编程建模

低代码开发平台 打开数字化转型普惠之门

力软低代码开发平台

泰山众筹4.0sun模式开发系统技术

薇電13242772558

智能合约

高密度 ARM 服务器如何引领“数智时代”发展,打通“智变质变”正循环

蓝海大脑GPU

深度学习 并行计算 arm架构 高性能计算 ARM服务器

一体化移动办公平台,让政企工作更轻松、更便捷

WorkPlus

【知识点】如何快速开发、部署 Serverless 应用?

Serverless Devs

CrossOver2023MAC电脑切换win系统打造的虚拟机软件

茶色酒

CrossOver2023

微软提出 TinyMIM,首次用掩码预训练改进小型 ViT

Zilliz

一文读懂SCADA系统的组件功能及应用

2D3D前端可视化开发

组态软件 工业组态软件 web组态软件 SCADA

持续耕耘显卡市场,英特尔锐炫驱动重大升级

科技之家

Camtasia2023汉化中文版电脑屏幕录像和编辑的软件

茶色酒

Camtasia2023

DataEase 启动异常如何解决:Access denied for user 'root'@'xx.xx.xx.xxx' (using password YES)

搞大屏的小北

DataEase

开年直播 | 博睿数据创始人兼CTO对话InfoQ,聊聊2023年重要战略技术趋势:可观测性

博睿数据

可观测性 博睿数据 媒体声音

Spring Boot + WebSocket 实时监控异常

程序员大彬

Java springboot

泼辣修图2023官方网页版入口在哪里?

茶色酒

泼辣修图2023

英特尔锐炫DX9,DX11,DX12游戏性能持续提升,个别游戏高达87%

科技之家

《数字经济全景白皮书》后疫情时代数字化驱动增长洞察之赛道篇

易观分析

数字经济 数智化转型

AirServer2024免费的手机投屏电脑软件

茶色酒

AirServer AirServer2023

WorkPlus即时通讯软件,专注于企业信息安全可靠的企业IM

WorkPlus

CMAE 结合对比学习和掩码,提高表征辨别力

Zilliz

数据结构-Hash常见操作实践

杨充

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