Knative Eventing 中如何实现 Registry 事件注册机制

简介: 在最新的 Knative Eventing 0.6 版本中新增了 Registry 特性, 为什么要增加这个特性, 该特性是如何实现的。针对这些问题,希望通过本篇文章给出答案。

背景

作为事件消费者,之前是无法事先知道哪些事件可以被消费,如果能通过某种方式获得哪些 Broker 提供哪些事件,那么事件消费者就能很方便通过这些 Broker 消费事件。Registry 就是在这样的背景下被提出的,通过 Registry 机制,消费者能针对特定的 Broker 的事件通过 Trigger 进行事件订阅消费。这里需要说明一下,Registry 设计与实现目前是针对 Broker/Trigger 事件处理模型。

诉求

  • 每个Registry 对应一个 Namespace 作为资源隔离的边界
  • Registry 中包括事件类型列表,以提供事件发现机制,通过事件列表,我们可以决定对哪些 Ready 的事件进行消费
  • 由于事件最终需要通过 Trigger 进行订阅,因此事件类型信息中需要包括创建 Trigger 所需要的信息。

实现

定义 EventType CRD 资源

定义 EventType 类型的CRD资源,示例yaml:

apiVersion: eventing.knative.dev/v1alpha1
kind: EventType
metadata:
  name: com.github.pullrequest
  namespace: default
spec:
  type: com.github.pull_request
  source: github.com
  schema: //github.com/schemas/pull_request
  description: "GitHub pull request"
  broker: default
  • name: 设置时需要符合k8s命名规范
  • type:遵循CloudEvent 类型设置。
  • source: 遵循 CloudEvent source设置。
  • schema: 可以是JSON schema, protobuf schema等。可选项。
  • description: 事件描述,可选项。
  • broker: 所提供 EventType 的 Broker。

事件注册与发现

1.创建 EventType
一般我们通过以下两种方式创建 EventType 实现事件的注册。
1.1通过Event 事件源实例自动注册
基于事件源实例,通过事件源控制器创建 EventType 进行注册:

apiVersion: sources.eventing.knative.dev/v1alpha1
kind: GitHubSource
metadata:
  name: github-source-sample
  namespace: default
spec:
  eventTypes:
    - push
    - pull_request
  ownerAndRepository: my-other-user/my-other-repo
  accessToken:
    secretKeyRef:
      name: github-secret
      key: accessToken
  secretToken:
    secretKeyRef:
      name: github-secret
      key: secretToken
  sink:
    apiVersion: eventing.knative.dev/v1alpha1
    kind: Broker
    name: default

通过运行上面的yaml信息,通过GitHubSource 事件源控制器可以创建事件类型dev.knative.source.github.push以及事件类型dev.knative.source.github.pull_request这两个EventType进行注册,其中source为github.com以及名称为default的Broker。具体如下:

apiVersion: eventing.knative.dev/v1alpha1
kind: EventType
metadata:
  generateName: dev.knative.source.github.push-
  namespace: default
  owner: # Owned by github-source-sample
spec:
  type: dev.knative.source.github.push
  source: github.com
  broker: default
---
apiVersion: eventing.knative.dev/v1alpha1
kind: EventType
metadata:
  generateName: dev.knative.source.github.pullrequest-
  namespace: default
  owner: # Owned by github-source-sample
spec:
  type: dev.knative.source.github.pull_request
  source: github.com
  broker: default

这里有两点需要注意:

  • 通过自动生成默认名称,避免名称冲突。对于是否应该在代码(在本例中是GithubSource控制器)创建事件类型时生成,需要进一步讨论。
  • 我们给spec.type加上了dev.knative.source.github.前缀,这个也需要进一步讨论确定是否合理。

1.2手动注册
直接通过创建EventType CR资源实现注册,如:

apiVersion: eventing.knative.dev/v1alpha1
kind: EventType
metadata:
  name: org.bitbucket.repofork
  namespace: default
spec:
  type: org.bitbucket.repo:fork
  source: bitbucket.org
  broker: dev
  description: "BitBucket fork"

通过这种方式可以注册名称为org.bitbucket.repofork, type 为 org.bitbucket.repo:fork, source 为 bitbucket.org 以及属于dev Broker 的 EventType。

2.获取 Registry 的事件注册
事件消费者可以通过如下方式获取 Registry 的事件注册列表:
$ kubectl get eventtypes -n default

NAME                                         TYPE                                    SOURCE          SCHEMA                              BROKER     DESCRIPTION           READY   REASON
org.bitbucket.repofork                       org.bitbucket.repo:fork                 bitbucket.org                                       dev        BitBucket fork        False   BrokerIsNotReady
com.github.pullrequest                       com.github.pull_request                 github.com      //github.com/schemas/pull_request   default    GitHub pull request   True 
dev.knative.source.github.push-34cnb         dev.knative.source.github.push          github.com                                          default                          True 
dev.knative.source.github.pullrequest-86jhv  dev.knative.source.github.pull_request  github.com                                          default                          True  

3.Trigger订阅事件
最后基于事件注册列表信息,事件消费者创建对应的Trigger对Registry中的EventType进行监听消费
Trigger示例:

apiVersion: eventing.knative.dev/v1alpha1
kind: Trigger
metadata:
  name: my-service-trigger
  namespace: default
spec:
  filter:
    sourceAndType:
      type: dev.knative.source.github.push
      source: github.com
  subscriber:
    ref:
     apiVersion: serving.knative.dev/v1alpha1
     kind: Service
     name: my-service

其它

针对 Registry,一般可能涉及到有如下问题:

  1. Registry 是对 Trigger 订阅事件,是否包括 Event Source 事件源的处理?
    答:Registry 设计的初衷主要是针对事件消费者能够发现事件并进行消费,因此它的出现主要是让用户创建Trigger进行事件订阅
  2. 如果仅仅创建 Event Source 通过Sink设置 KnService 进行事件消费(没有Trigger), 是否也可以使用Registry?
    答:Registry 的设计主要是针对 Broker/Trigger 事件处理模型, 并且我们可以发现 EventType 中的Broker字段是必需设置的。如果没有发送事件到Broker, 就不会创建EventType注册到Registry。在实现方面,我们可以检查Event Source的Sink类型是否是Broker,如果是,则对其注册EventType。
  3. 是否可以通过CloudEvents subject 字段过滤资源
    答:EventType CRD资源不会包含subject字段, 因为我们认为subject是更高级别的过滤设置。不过社区后续会通过高级过滤规则 进行实现。例如:
apiVersion: eventing.knative.dev/v1alpha1
kind: Trigger
metadata:
  name: only-knative
spec:
  filter:
   cel:
      expression: ce.subject.match("/knative/*")
  subscriber:
   ref:
     apiVersion: serving.knative.dev/v1alpha1
     kind: Service
     name: knative-events-processor
相关实践学习
使用ACS算力快速搭建生成式会话应用
阿里云容器计算服务 ACS(Container Compute Service)以Kubernetes为使用界面,采用Serverless形态提供弹性的算力资源,使您轻松高效运行容器应用。本文将指导您如何通过ACS控制台及ACS集群证书在ACS集群中快速部署并公开一个容器化生成式AI会话应用,并监控应用的运行情况。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
消息中间件 NoSQL Java
面试官:谈谈你对IO多路复用的理解?
面试官:谈谈你对IO多路复用的理解?
260 0
面试官:谈谈你对IO多路复用的理解?
|
程序员
【工具使用】Intellij IDEA 自动清除无效 import 包 和 清除无效 import包 的快捷键
【工具使用】Intellij IDEA 自动清除无效 import 包 和 清除无效 import包 的快捷键
4802 0
|
人工智能 自然语言处理 机器人
对话阿里云CIO蒋林泉:AI时代,企业如何做好智能化系统建设?
10月18日, InfoQ《C 位面对面》栏目邀请到阿里云CIO及aliyun.com负责人蒋林泉(花名:雁杨),就AI时代企业CIO的角色转变、企业智能化转型路径、AI落地实践与人才培养等主题展开了讨论。
|
Kubernetes API 调度
Kubernetes详解(十五)——Pod对象创建过程
Kubernetes详解(十五)——Pod对象创建过程
329 5
|
SQL 人工智能 运维
2022云栖精选—云原生智能化DBaaS
周方圆 阿里云数据库事业部DBaaS产品部负责人 DBaaS作为阿里云数据库的“操作系统”,加速了数据库内核的商业化和服务化。云栖大会,作者分享了DBaaS如何通过云原生化和智能化解决痛点问题。本文是对该分享的总结。
1408 2
2022云栖精选—云原生智能化DBaaS
|
运维 Cloud Native 持续交付
探索云原生技术的未来发展方向
随着云计算技术的快速发展,云原生技术作为一种创新的软件开发和部署方法逐渐受到关注。本文将深入探讨云原生技术的定义、特点以及未来发展方向,为读者提供对这一新兴技术的全面了解。
192 0
|
运维 Cloud Native 架构师
展望架构的2023:Serverless 兴起,下一代微服务的雏形和标准化开始呈现
2022 年,架构领域发生了哪些值得关注的事情?一位架构师必备哪些技能?2023年哪些架构趋势需要掌握?Nacos 和 MSE 创始人、阿里云高级技术专家彦林做客 InfoQ 直播间,为我们带来 2023 年的架构师发展指南。
1913 0
|
SQL 人工智能 运维
2022云栖精选—云原生智能化DBaaS
周方圆 阿里云数据库事业部资深技术专家 DBaaS产品部负责人
2022云栖精选—云原生智能化DBaaS
|
安全 容灾 Cloud Native
前沿分享|阿里云数据库事业部资深技术专家、生态工具产品部负责人 陈长城:一站式在线数据管理平台DMS技术解读
本篇内容为2021云栖大会-企业级云原生数据库最佳实践论坛中,阿里云数据库事业部资深技术专家、生态工具产品部负责人 陈长城关于“一站式在线数据管理平台DMS技术解读”的分享。
1416 0
前沿分享|阿里云数据库事业部资深技术专家、生态工具产品部负责人 陈长城:一站式在线数据管理平台DMS技术解读
|
存储 关系型数据库 索引
Mysql-什么是聚集索引和非聚集索引?
Mysql-什么是聚集索引和非聚集索引?
Mysql-什么是聚集索引和非聚集索引?