5.10. 自定义事件源
如果您需要从 Knative 中没有包含在 Knative 的事件制作者或发出没有 CloudEvent
格式的事件的制作者中入站事件,您可以通过创建自定义事件源来实现此目标。您可以使用以下方法之一创建自定义事件源:
-
通过创建接收器绑定,将
PodSpecable
对象用作事件源。 - 通过创建容器源,将容器用作事件源。
5.10.1. 接收器(sink)绑定
SinkBinding
对象支持将事件产品与交付寻址分离。接收器绑定用于将 事件制作者 连接到事件消费者(sink)。event producer 是一个 Kubernetes 资源,用于嵌入 PodSpec
模板并生成事件。sink 是一个可寻址的 Kubernetes 对象,可以接收事件。
SinkBinding
对象将环境变量注入到 sink 的 PodTemplateSpec
中,这意味着应用程序代码不需要直接与 Kubernetes API 交互来定位事件目的地。这些环境变量如下:
K_SINK
- 解析 sink 的 URL。
K_CE_OVERRIDES
- 指定出站事件覆盖的 JSON 对象。
5.10.1.1. 使用 YAML 创建接收器绑定
使用 YAML 文件创建 Knative 资源使用声明性 API,它允许您以可重复的方式描述事件源。要使用 YAML 创建接收器绑定,您必须创建一个 YAML 文件来定义 SinkBinding
对象,然后使用 oc apply
命令应用它。
先决条件
- 在集群中安装了 OpenShift Serverless Operator、Knative Serving 和 Knative Eventing。
-
安装 OpenShift CLI(
oc
)。 - 您已创建了一个项目,或者具有适当的角色和权限访问项目,以便在 OpenShift Container Platform 中创建应用程序和其他工作负载。
流程
要检查接收器绑定是否已正确设置,请创建一个 Knative 事件显示服务或事件接收器,在日志中转储传入的信息:
创建服务 YAML 文件:
服务 YAML 文件示例
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: event-display spec: template: spec: containers: - image: quay.io/openshift-knative/knative-eventing-sources-event-display:latest
创建服务:
$ oc apply -f <filename>
创建将事件定向到该服务的接收器绑定实例。
创建接收器绑定 YAML 文件:
服务 YAML 文件示例
apiVersion: sources.knative.dev/v1alpha1 kind: SinkBinding metadata: name: bind-heartbeat spec: subject: apiVersion: batch/v1 kind: Job 1 selector: matchLabels: app: heartbeat-cron sink: ref: apiVersion: serving.knative.dev/v1 kind: Service name: event-display
- 1
- 在本例中,任何具有标签
app: heartbeat-cron
的作业都将被绑定到事件 sink。
创建接收器绑定:
$ oc apply -f <filename>
创建
CronJob
对象。创建 cron 任务 YAML 文件:
Cron Job YAML 文件示例
apiVersion: batch/v1beta1 kind: CronJob metadata: name: heartbeat-cron spec: # Run every minute schedule: "* * * * *" jobTemplate: metadata: labels: app: heartbeat-cron bindings.knative.dev/include: "true" spec: template: spec: restartPolicy: Never containers: - name: single-heartbeat image: quay.io/openshift-knative/heartbeats:latest args: - --period=1 env: - name: ONE_SHOT value: "true" - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace
重要要使用接收器绑定,您必须手动在 Knative 资源中添加
bindings.knative.dev/include=true
标签。例如,要将此标签添加到
CronJob
资源,请将以下行添加到Job
资源 YAML 定义中:jobTemplate: metadata: labels: app: heartbeat-cron bindings.knative.dev/include: "true"
创建 cron job:
$ oc apply -f <filename>
输入以下命令并检查输出,检查是否正确映射了控制器:
$ oc get sinkbindings.sources.knative.dev bind-heartbeat -oyaml
输出示例
spec: sink: ref: apiVersion: serving.knative.dev/v1 kind: Service name: event-display namespace: default subject: apiVersion: batch/v1 kind: Job namespace: default selector: matchLabels: app: heartbeat-cron
验证
您可以通过查看消息 dumper 功能日志,来验证 Kubernetes 事件是否已发送到 Knative 事件。
输入命令:
$ oc get pods
输入命令:
$ oc logs $(oc get pod -o name | grep event-display) -c user-container
输出示例
☁️ cloudevents.Event Validation: valid Context Attributes, specversion: 1.0 type: dev.knative.eventing.samples.heartbeat source: https://knative.dev/eventing-contrib/cmd/heartbeats/#event-test/mypod id: 2b72d7bf-c38f-4a98-a433-608fbcdd2596 time: 2019-10-18T15:23:20.809775386Z contenttype: application/json Extensions, beats: true heart: yes the: 42 Data, { "id": 1, "label": "" }
5.10.1.2. 使用 Knative CLI 创建接收器绑定
您可以使用 kn source binding create
命令通过 Knative (kn
) CLI 创建接收器绑定。使用 Knative CLI 创建事件源提供了比直接修改 YAML 文件更精简且直观的用户界面。
先决条件
- 在集群中安装了 OpenShift Serverless Operator、Knative Serving 和 Knative Eventing。
- 您已创建了一个项目,或者具有适当的角色和权限访问项目,以便在 OpenShift Container Platform 中创建应用程序和其他工作负载。
-
安装 Knative(
kn
)CLI。 -
安装 OpenShift CLI(
oc
)。
以下操作过程要求您创建 YAML 文件。
如果更改了示例中使用的 YAML 文件的名称,则需要更新对应的 CLI 命令。
流程
要检查接收器绑定是否已正确设置,请创建一个 Knative 事件显示服务或事件 sink,在日志中转储传入的信息:
$ kn service create event-display --image quay.io/openshift-knative/knative-eventing-sources-event-display:latest
创建将事件定向到该服务的接收器绑定实例:
$ kn source binding create bind-heartbeat --subject Job:batch/v1:app=heartbeat-cron --sink ksvc:event-display
创建
CronJob
对象。创建 cron 任务 YAML 文件:
Cron Job YAML 文件示例
apiVersion: batch/v1beta1 kind: CronJob metadata: name: heartbeat-cron spec: # Run every minute schedule: "* * * * *" jobTemplate: metadata: labels: app: heartbeat-cron bindings.knative.dev/include: "true" spec: template: spec: restartPolicy: Never containers: - name: single-heartbeat image: quay.io/openshift-knative/heartbeats:latest args: - --period=1 env: - name: ONE_SHOT value: "true" - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace
重要要使用接收器绑定,您必须手动在 Knative CR 中添加
bindings.knative.dev/include=true
标签。例如,要将此标签添加到
CronJob
CR,请将以下行添加到Job
CR YAML 定义中:jobTemplate: metadata: labels: app: heartbeat-cron bindings.knative.dev/include: "true"
创建 cron job:
$ oc apply -f <filename>
输入以下命令并检查输出,检查是否正确映射了控制器:
$ kn source binding describe bind-heartbeat
输出示例
Name: bind-heartbeat Namespace: demo-2 Annotations: sources.knative.dev/creator=minikube-user, sources.knative.dev/lastModifier=minikub ... Age: 2m Subject: Resource: job (batch/v1) Selector: app: heartbeat-cron Sink: Name: event-display Resource: Service (serving.knative.dev/v1) Conditions: OK TYPE AGE REASON ++ Ready 2m
验证
您可以通过查看消息 dumper 功能日志,来验证 Kubernetes 事件是否已发送到 Knative 事件。
您可以输入以下命令来查看消息转储程序功能日志:
$ oc get pods
$ oc logs $(oc get pod -o name | grep event-display) -c user-container
输出示例
☁️ cloudevents.Event Validation: valid Context Attributes, specversion: 1.0 type: dev.knative.eventing.samples.heartbeat source: https://knative.dev/eventing-contrib/cmd/heartbeats/#event-test/mypod id: 2b72d7bf-c38f-4a98-a433-608fbcdd2596 time: 2019-10-18T15:23:20.809775386Z contenttype: application/json Extensions, beats: true heart: yes the: 42 Data, { "id": 1, "label": "" }
5.10.1.2.1. Knative CLI sink 标记
当使用 Knative(kn
)CLI 创建事件源时,您可以使用 --sink
标志指定事件从该资源发送到的接收器。sink 可以是任何可寻址或可调用的资源,可以从其他资源接收传入的事件。
以下示例创建使用服务 http://event-display.svc.cluster.local
的接收器绑定作为接收器:
使用 sink 标记的命令示例
$ kn source binding create bind-heartbeat \
--namespace sinkbinding-example \
--subject "Job:batch/v1:app=heartbeat-cron" \
--sink http://event-display.svc.cluster.local \ 1
--ce-override "sink=bound"
- 1
http://event-display.svc.cluster.local
中的svc
确定接收器是一个 Knative 服务。其他默认的接收器前缀包括channel
和broker
。
5.10.1.3. 使用 Web 控制台创建接收器绑定
在集群中安装 Knative Eventing 后,您可以使用 web 控制台创建接收器绑定。使用 OpenShift Container Platform Web 控制台提供了一个简化且直观的用户界面来创建事件源。
先决条件
- 已登陆到 OpenShift Container Platform Web 控制台。
- OpenShift Serverless Operator、Knative Serving 和 Knative Eventing 已在 OpenShift Container Platform 集群中安装。
- 您已创建了一个项目,或者具有适当的角色和权限访问项目,以便在 OpenShift Container Platform 中创建应用程序和其他工作负载。
流程
创建 Knative 服务以用作接收器:
-
在 Developer 视角中,导航到 +Add
YAML。 复制 YAML 示例:
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: event-display spec: template: spec: containers: - image: quay.io/openshift-knative/knative-eventing-sources-event-display:latest
- 点 Create。
-
在 Developer 视角中,导航到 +Add
创建用作事件源的
CronJob
资源,并每分钟发送一个事件。-
在 Developer 视角中,导航到 +Add
YAML。 复制 YAML 示例:
apiVersion: batch/v1 kind: CronJob metadata: name: heartbeat-cron spec: # Run every minute schedule: "*/1 * * * *" jobTemplate: metadata: labels: app: heartbeat-cron bindings.knative.dev/include: true 1 spec: template: spec: restartPolicy: Never containers: - name: single-heartbeat image: quay.io/openshift-knative/heartbeats args: - --period=1 env: - name: ONE_SHOT value: "true" - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace
- 1
- 确保包含
bindings.knative.dev/include: true
标签。OpenShift Serverless 的默认命名空间选择行为使用包含模式。
- 点 Create。
-
在 Developer 视角中,导航到 +Add
在与上一步中创建的服务相同的命名空间中创建接收器绑定,或您要将事件发送到的任何其他接收器。
-
在 Developer 视角中,导航到 +Add
Event Source。此时会显示 Event Sources 页面。 - 可选:如果您的事件源有多个供应商,请从 Providers 列表中选择所需的供应商,以过滤供应商的可用事件源。
选择 Sink Binding,然后单击 Create Event Source。此时会显示 Create Event Source 页面。
注意您可以使用 Form view 或 YAML view 配置 Sink Binding 设置,并可以在两者间切换。在不同视图间切换时数据会被保留。
-
在 apiVersion 字段中,输入
batch/v1
。 在 Kind 字段中,输入
Job
。注意OpenShift Serverless sink 绑定不支持
CronJob
kind,因此 Kind 字段必须以 cron 任务创建的Job
对象为目标,而不是 cron 作业对象本身。-
选择一个 Sink。这可以是 Resource 或一个 URI。在这个示例中,上一步中创建的
event-display
服务被用作 Resource sink。 在 Match labels 部分:
-
在 Name 字段中输入
app
。 在 Value 字段中输入
heartbeat-cron
。注意使用带有接收器绑定的 cron 任务时,需要标签选择器,而不是资源名称。这是因为,Cron Job 创建的作业没有可预测的名称,并在名称中包含随机生成的字符串。例如,
hearthbeat-cron-1cc23f
.
-
在 Name 字段中输入
- 点 Create。
-
在 Developer 视角中,导航到 +Add
验证
您可以通过查看 Topology 页面和 pod 日志来验证接收器绑定、接收器和 cron 任务是否已创建并正常工作。
- 在 Developer 视角中,导航到 Topology。
查看接收器绑定、接收器和心跳 cron 任务。
- 观察在添加了接收器绑定后 cron 任务正在注册成功的作业。这意味着接收器绑定成功重新配置由 cron 任务创建的作业。
-
浏览
event-display
服务 pod 的日志,以查看 heartbeats cron 作业生成的事件。
5.10.1.4. 接收器绑定引用
您可以通过创建接收器绑定,将 PodSpecable
对象用作事件源。您可以在创建 SinkBinding
对象时配置多个参数。
SinkBinding
对象支持以下参数:
字段 | 描述 | 必需或可选 |
---|---|---|
|
指定 API 版本,如 | 必填 |
|
将此资源对象标识为 | 必填 |
|
指定唯一标识 | 必填 |
|
指定此 | 必填 |
| 对解析为 URI 作为 sink 的对象的引用。 | 必填 |
| 提及通过绑定实施来增强运行时合同的资源。 | 必填 |
| 定义覆盖来控制发送到 sink 的事件的输出格式和修改。 | 选填 |
5.10.1.4.1. 主题参数
Subject
参数引用通过绑定实施来增强运行时合同的资源。您可以为 Subject
定义配置多个字段。
Subject
定义支持以下字段:
字段 | 描述 | 必需或可选 |
---|---|---|
| 引用的 API 版本。 | 必填 |
| 引用的类型。 | 必填 |
| 引用的命名空间。如果省略,则默认为对象的命名空间。 | 选填 |
| 引用的名称。 |
如果配置 |
| 引用的选择器。 |
如果配置 |
| 标签选择器要求列表。 |
仅使用 |
| 选择器应用到的标签键。 |
使用 |
|
代表键与一组值的关系。有效的运算符为 |
使用 |
|
字符串值数组。如果 |
使用 |
|
键值对映射. |
仅使用 |
主题参数示例
根据以下 YAML,选择 default
命名空间中名为 mysubject
的 Deployment
对象:
apiVersion: sources.knative.dev/v1 kind: SinkBinding metadata: name: bind-heartbeat spec: subject: apiVersion: apps/v1 kind: Deployment namespace: default name: mysubject ...
根据以下 YAML,可以选择在 default
命名空间中带有 working=example
标签的 Job
对象:
apiVersion: sources.knative.dev/v1 kind: SinkBinding metadata: name: bind-heartbeat spec: subject: apiVersion: batch/v1 kind: Job namespace: default selector: matchLabels: working: example ...
根据以下 YAML,可以选择在 default
命名空间中带有标签 working=example
或 working=sample
的 Pod
对象:
apiVersion: sources.knative.dev/v1 kind: SinkBinding metadata: name: bind-heartbeat spec: subject: apiVersion: v1 kind: Pod namespace: default selector: - matchExpression: key: working operator: In values: - example - sample ...
5.10.1.4.2. CloudEvent 覆盖
ceOverrides
定义提供覆盖控制发送到 sink 的 CloudEvent 输出格式和修改。您可以为 ceOverrides
定义配置多个字段。
ceOverrides
定义支持以下字段:
字段 | 描述 | 必需或可选 |
---|---|---|
|
指定在出站事件中添加或覆盖哪些属性。每个 | 选填 |
仅允许有效的 CloudEvent
属性名称作为扩展。您无法从扩展覆盖配置设置 spec 定义的属性。例如,您无法修改 type
属性。
CloudEvent Overrides 示例
apiVersion: sources.knative.dev/v1 kind: SinkBinding metadata: name: bind-heartbeat spec: ... ceOverrides: extensions: extra: this is an extra attribute additional: 42
这会在 主题
上设置 K_CE_OVERRIDES
环境变量:
输出示例
{ "extensions": { "extra": "this is an extra attribute", "additional": "42" } }
5.10.1.4.3. include 标签
要使用接收器绑定,您需要为资源或包含资源的命名空间分配 bindings.knative.dev/include: "true"
标签。如果资源定义不包括该标签,集群管理员可以通过运行以下命令将它附加到命名空间:
$ oc label namespace <namespace> bindings.knative.dev/include=true