写点什么

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

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

关注

评论

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

服务调用链相关基础知识

luojiahu

调用链

网络攻防学习笔记 Day15

穿过生命散发芬芳

5月日更 网络攻防

k8s POD hosts 文件怎么与主机保持同步那?

Geek_f24c45

Docker Kubernetes

20个不良用户体验

老猿Python

程序员 用户体验 程序开发

全文检索的介绍

五分钟学大数据

大数据 5月日更

Android设备实时音视频传输有效方案

小驰笔记

android 音视频 引航计划

用Python找出100以内的质数 - DAY6

Qien Z.

5月日更 ptyhon 找质数 质数

ceph-csi源码分析(7)-rbd driver-IdentityServer分析

良凯尔

Kubernetes 源码分析 Ceph CSI

花一周整理!Python全系列学习资料,全是干货

Python研究者

聊聊Spring的XML Schema扩展机制的使用方式

Hex

spring

ceph-csi源码分析(8)-cephfs driver分析

良凯尔

Kubernetes 源码分析 Ceph CSI

企业数字化转型分为三个阶段

石云升

数字化 5月日更

打破思维定式(十)

Changing Lin

把Redis当作队列来用,真的合适吗?

Kaito

数据库 redis 队列

Spark为什么会流行

大数据技术指南

大数据 5月日更

全国大学生物联网设计竞赛(华为杯)巡回技术讲座“八校联动”,HarmonyOS与校园开发者面对面

Geek_283163

鸿蒙

数据挖掘从入门到放弃(二):决策树

数据社

机器学习 5月日更

Python-XPath

若尘

Python编程 5月日更

iOS 面试策略之系统框架-UIScrollView及其子类

iOSer

ios 面试 UIScrollView UICollectionView

量化网格交易策略系统,马丁倍投策略软件源码

通过实践带你揭开TCP中CLOSE_WAIT和TIME_WAIT的神秘面纱

linux大本营

c++ Linux TCP 网络协议 epoll

区块链—重构新商业体系和全新商业生态环境

CECBC

工业互联网产业数字化,区块链如何协同发力?

CECBC

APP透露的焦虑

wgc

杂谈

消息队列系统架构设计

王硕

架构训练营

[Netty]- Reactor实现

topsion

reactor Netty io nio

腾讯iOS开发要达到咋样的水准?

一意孤行的程序员

ios 程序员 腾讯 面试 ios开发

全国大学生物联网设计竞赛(华为杯)巡回技术讲座“八校联动”,HarmonyOS与校园开发者面对面

科技汇

深入Linux C/C++ Timer定时器的实现核心原理

Linux服务器开发

Linux 后端 网络编程 定时器 Linux服务器开发

Nginx通过split_client实现客户端分流

运维研习社

nginx 灰度发布 5月日更 分流

数据科学指南#基础篇 Bokeh入门

Lev

Python 学习 数据分析 数据科学

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