跳到内容

事件注册表

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

对于消费者而言,最重要的字段是 specstatus。因为这些字段提供了创建 Trigger 所需的信息,即事件的来源和类型以及是否存在用于接收事件的引用。

下表提供了有关 EventType 对象的 specstatus 字段的更多信息

字段 描述 必需或可选
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 文件

  1. 创建一个 EventType YAML 文件。有关所需字段的信息,请参阅 关于 EventType 对象

  2. 运行以下命令应用 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,它们根据前面提到的注册表输出,使用对 typesource 进行精确匹配来订阅事件

  • 订阅来自任何来源的 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/eventingknative/serving GitHub 存储库这两个来源。如果将来有新的 GitHub 推送来源被注册,此 Trigger 仍可以消费它们。

  • 订阅来自 knative/eventing GitHub 存储库的 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。

我们使用分析和 cookie 来了解网站流量。有关您使用我们网站的信息会与 Google 共享以达到此目的。了解更多。