事件注册表¶
Knative Eventing 定义了一个 EventType 对象,以便使用者更容易发现可以从 Broker 或 Channel 消费的事件类型。
事件注册表维护了一个目录,其中包含每个 Broker 或 Channel 可以消费的事件类型。注册表中存储的事件类型包含消费者创建 Trigger 所需的所有信息,而无需诉诸其他带外机制。
本主题提供有关如何填充事件注册表、如何使用注册表发现事件以及如何利用该信息订阅感兴趣的事件的信息。
注意
在使用事件注册表之前,建议您对 Broker、Trigger、事件源以及 CloudEvents 规范(特别是 上下文属性部分)有基本的了解。
关于 EventType 对象¶
EventType 对象代表可以从 Broker 或 Channel 消费的事件类型,例如 Apache Kafka 消息或 GitHub 拉取请求。EventType 对象用于填充事件注册表并将事件类型信息持久化到集群数据存储中。
以下是一个省略了不相关字段的 EventType YAML 示例
apiVersion: eventing.knative.dev/v1beta2
kind: EventType
metadata:
name: dev.knative.source.github.push-34cnb
namespace: default
labels:
eventing.knative.dev/sourceName: github-sample
spec:
type: dev.knative.source.github.push
source: https://github.com/knative/eventing
schema:
description:
reference:
apiVersion: eventing.knative.dev/v1
kind: Broker
name: default
status:
conditions:
- status: "True"
type: ReferenceExists
- status: "True"
type: Ready
有关 EventType 对象的完整规范,请参阅 EventType API 参考。
metadata.name 字段是建议性的,即不具有权威性。它通常使用 generateName 生成,以避免命名冲突。创建 Trigger 时不需要 metadata.name。
对于消费者而言,最重要的字段是 spec 和 status。因为这些字段提供了创建 Trigger 所需的信息,即事件的来源和类型以及是否存在用于接收事件的引用。
下表提供了有关 EventType 对象的 spec 和 status 字段的更多信息
| 字段 | 描述 | 必需或可选 |
|---|---|---|
spec.type |
指的是进入 事件网格 时的 CloudEvent 类型。事件消费者可以根据此属性创建过滤的 Trigger。此字段具有权威性。 | 必需 |
spec.source |
指的是进入 事件网格 时的 CloudEvent 来源。事件消费者可以根据此属性创建过滤的 Trigger。 | 必需 |
spec.schema |
一个有效的 EventType 模式的 URI,例如 JSON 模式或 protobuf 模式。 | 可选 |
spec.description |
一个描述 EventType 内容的字符串。 | 可选 |
spec.reference |
指的是可以提供 EventType 的 KResource。 | 必需 |
status |
告知消费者或集群操作员 EventType 是否已准备好被消费。就绪状态取决于 KReference 是否存在。 | 可选 |
用事件填充注册表¶
您可以通过手动或自动方式用 EventType 对象填充注册表。自动注册可能是更简单的方法,但它只支持事件源的子集。
手动注册¶
对于手动注册,集群配置器像应用任何其他 Kubernetes 资源一样应用 EventTypes YAML 文件。
手动应用 EventTypes YAML 文件
-
创建一个 EventType YAML 文件。有关所需字段的信息,请参阅 关于 EventType 对象。
-
运行以下命令应用 YAML
kubectl apply -f <event-type.yaml>
自动注册¶
由于手动注册可能很繁琐且容易出错,Knative 也支持自动注册 EventTypes。当事件源实例化时,会自动创建 EventTypes。
对自动注册的支持¶
Knative 支持对以下事件源自动注册 EventTypes
- PingSource
- ApiServerSource
- GithubSource
- GcpPubSubSource
- KafkaSource
- AwsSqsSource
Knative 支持对符合 Sources Duck 类型的源自动创建 EventTypes。
自动注册过程¶
-
要自动注册 EventTypes,请通过运行以下命令应用您的事件源 YAML 文件
kubectl apply -f <event-source.yaml>
事件源实例化后,EventType 会被添加到注册表中。
示例:使用 KafkaSource 进行自动注册¶
给定以下 KafkaSource 示例用于填充注册表
apiVersion: sources.knative.dev/v1
kind: KafkaSource
metadata:
name: kafka-sample
namespace: default
spec:
bootstrapServers:
- my-cluster-kafka-bootstrap.kafka:9092
topics:
- knative-demo
- news
sink:
apiVersion: eventing.knative.dev/v1
kind: Broker
name: default
上述示例中的 topics 字段用于生成 EventType 的 source 字段。
运行上述 YAML 的 kubectl apply 后,KafkaSource kafka-source-sample 被实例化,并且由于有两个 topic,因此向注册表中添加了两个 EventTypes。
使用注册表发现事件¶
使用注册表,您可以发现 Broker 事件网格 可以消费的不同类型的事件。
注意
通过 EventType 自动创建功能,您可以在注册表中看到更多事件类型。了解 此处 如何启用此功能。
查看可订阅的所有事件类型¶
-
要查看注册表中可供订阅的事件类型列表,请运行以下命令
kubectl get eventtypes -n <namespace>在测试集群中使用
default命名空间的示例输出NAME TYPE SOURCE SCHEMA BROKER DESCRIPTION READY REASON dev.knative.source.github.push-34cnb dev.knative.source.github.push https://github.com/knative/eventing default True dev.knative.source.github.push-44svn dev.knative.source.github.push https://github.com/knative/serving default True dev.knative.source.github.pullrequest-86jhv dev.knative.source.github.pull_request https://github.com/knative/eventing default True dev.knative.source.github.pullrequest-97shf dev.knative.source.github.pull_request https://github.com/knative/serving default True dev.knative.kafka.event-cjvcr dev.knative.kafka.event /apis/v1/namespaces/default/kafkasources/kafka-sample#news default True dev.knative.kafka.event-tdt48 dev.knative.kafka.event /apis/v1/namespaces/default/kafkasources/kafka-sample#knative-demo default True google.pubsub.topic.publish-hrxhh google.pubsub.topic.publish //pubsub.googleapis.com/knative/topics/testing dev False BrokerIsNotReady此示例输出显示了
default命名空间注册表中的七个不同的 EventType 对象。它假设发出事件的事件源将其 Sink 引用到 Broker。
查看 EventType 对象的 YAML¶
-
要查看 EventType 对象的 YAML,请运行以下命令
其中kubectl get eventtype <name> -o yaml<name>是一个 EventType 对象的名称,可以在注册表输出的NAME列中找到。例如,dev.knative.source.github.push-34cnb。
有关 EventType YAML 的示例,请参阅本页前面的 关于 EventType 对象。
关于订阅事件¶
在您知道可以从 Broker 的 事件网格 消费哪些事件后,您可以创建 Trigger 来订阅特定事件。
下面是一些示例 Trigger,它们根据前面提到的注册表输出,使用对 type 或 source 进行精确匹配来订阅事件
-
订阅来自任何来源的 GitHub 推送事件
apiVersion: eventing.knative.dev/v1 kind: Trigger metadata: name: push-trigger namespace: default spec: broker: default filter: attributes: type: dev.knative.source.github.push subscriber: ref: apiVersion: serving.knative.dev/v1 kind: Service name: push-service注意
如示例注册表输出所述,对于该特定类型的事件,只存在
knative/eventing和knative/servingGitHub 存储库这两个来源。如果将来有新的 GitHub 推送来源被注册,此 Trigger 仍可以消费它们。 -
订阅来自
knative/eventingGitHub 存储库的 GitHub 拉取请求apiVersion: eventing.knative.dev/v1 kind: Trigger metadata: name: gh-knative-eventing-pull-trigger namespace: default spec: broker: default filter: attributes: type: dev.knative.source.github.pull_request source: https://github.com/knative/eventing subscriber: ref: apiVersion: serving.knative.dev/v1 kind: Service name: gh-knative-eventing-pull-service -
订阅发送到 knative-demo topic 的 Kafka 消息
apiVersion: eventing.knative.dev/v1 kind: Trigger metadata: name: kafka-knative-demo-trigger namespace: default spec: broker: default filter: attributes: type: dev.knative.kafka.event source: /apis/v1/namespaces/default/kafkasources/kafka-sample#knative-demo subscriber: ref: apiVersion: serving.knative.dev/v1 kind: Service name: kafka-knative-demo-service -
订阅来自 GCP knative 项目发送到 testing topic 的 PubSub 消息
apiVersion: eventing.knative.dev/v1 kind: Trigger metadata: name: gcp-pubsub-knative-testing-trigger namespace: default spec: broker: dev filter: attributes: source: //pubsub.googleapis.com/knative/topics/testing subscriber: ref: apiVersion: serving.knative.dev/v1 kind: Service name: gcp-pubsub-knative-testing-service注意
前面提到的示例注册表输出将此 Broker 的就绪状态列为
false。此 Trigger 的订阅者在 Broker 变为就绪状态之前无法消费事件。
后续步骤¶
Knative 代码示例 是更好地理解某些事件源的有用资源。请记住,如果您希望自动在注册表中注册 EventTypes,必须将源指向 Broker。