2.6. 自定义事件源
如果您需要从 Knative 中没有包含在 Knative 的事件制作者或发出没有 CloudEvent
格式的事件的制作者中入站事件,您可以通过创建自定义事件源来实现此目标。您可以使用以下方法之一创建自定义事件源:
-
通过创建接收器绑定,将
PodSpecable
对象用作事件源。 - 通过创建容器源,将容器用作事件源。
2.6.1. 接收器(sink)绑定 复制链接链接已复制到粘贴板!
SinkBinding
对象支持将事件产品与交付寻址分离。接收器绑定用于将 事件制作者 连接到事件消费者(sink) 。event producer 是一个 Kubernetes 资源,用于嵌入 PodSpec
模板并生成事件。sink 是一个可寻址的 Kubernetes 对象,可以接收事件。
SinkBinding
对象将环境变量注入到 sink 的 PodTemplateSpec
中,这意味着应用程序代码不需要直接与 Kubernetes API 交互来定位事件目的地。这些环境变量如下:
K_SINK
- 解析 sink 的 URL。
K_CE_OVERRIDES
- 指定出站事件覆盖的 JSON 对象。
SinkBinding
对象目前不支持服务的自定义修订名称。
2.6.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 文件示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建服务:
oc apply -f <filename>
$ oc apply -f <filename>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建将事件定向到该服务的接收器绑定实例。
创建接收器绑定 YAML 文件:
服务 YAML 文件示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 在本例中,任何具有标签
app: heartbeat-cron
的作业都将被绑定到事件 sink。
创建接收器绑定:
oc apply -f <filename>
$ oc apply -f <filename>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建
CronJob
对象。创建 cron 任务 YAML 文件:
Cron Job YAML 文件示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要要使用接收器绑定,您必须手动在 Knative 资源中添加
bindings.knative.dev/include=true
标签。例如,要将此标签添加到
CronJob
资源,请将以下行添加到Job
资源 YAML 定义中:jobTemplate: metadata: labels: app: heartbeat-cron bindings.knative.dev/include: "true"
jobTemplate: metadata: labels: app: heartbeat-cron bindings.knative.dev/include: "true"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建 cron job:
oc apply -f <filename>
$ oc apply -f <filename>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
输入以下命令并检查输出,检查是否正确映射了控制器:
oc get sinkbindings.sources.knative.dev bind-heartbeat -oyaml
$ oc get sinkbindings.sources.knative.dev bind-heartbeat -oyaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
您可以通过查看消息 dumper 功能日志,来验证 Kubernetes 事件是否已发送到 Knative 事件。
输入命令:
oc get pods
$ oc get pods
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入命令:
oc logs $(oc get pod -o name | grep event-display) -c user-container
$ oc logs $(oc get pod -o name | grep event-display) -c user-container
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.6.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/showcase
$ kn service create event-display --image quay.io/openshift-knative/showcase
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建将事件定向到该服务的接收器绑定实例:
kn source binding create bind-heartbeat --subject Job:batch/v1:app=heartbeat-cron --sink ksvc:event-display
$ kn source binding create bind-heartbeat --subject Job:batch/v1:app=heartbeat-cron --sink ksvc:event-display
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建
CronJob
对象。创建 cron 任务 YAML 文件:
Cron Job YAML 文件示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要要使用接收器绑定,您必须手动在 Knative CR 中添加
bindings.knative.dev/include=true
标签。例如,要将此标签添加到
CronJob
CR,请将以下行添加到Job
CR YAML 定义中:jobTemplate: metadata: labels: app: heartbeat-cron bindings.knative.dev/include: "true"
jobTemplate: metadata: labels: app: heartbeat-cron bindings.knative.dev/include: "true"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建 cron job:
oc apply -f <filename>
$ oc apply -f <filename>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
输入以下命令并检查输出,检查是否正确映射了控制器:
kn source binding describe bind-heartbeat
$ kn source binding describe bind-heartbeat
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
您可以通过查看消息 dumper 功能日志,来验证 Kubernetes 事件是否已发送到 Knative 事件。
您可以输入以下命令来查看消息转储程序功能日志:
oc get pods
$ oc get pods
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc logs $(oc get pod -o name | grep event-display) -c user-container
$ oc logs $(oc get pod -o name | grep event-display) -c user-container
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.6.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 \ --ce-override "sink=bound"
$ kn source binding create bind-heartbeat \
--namespace sinkbinding-example \
--subject "Job:batch/v1:app=heartbeat-cron" \
--sink http://event-display.svc.cluster.local \
--ce-override "sink=bound"
- 1
http://event-display.svc.cluster.local
中的svc
确定接收器是一个 Knative 服务。其他默认的接收器前缀包括channel
和broker
。
2.6.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 示例:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 点 Create。
-
在 Developer 视角中,导航到 +Add
创建用作事件源的
CronJob
资源,并每分钟发送一个事件。-
在 Developer 视角中,导航到 +Add
YAML。 复制 YAML 示例:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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 作业对象本身。在 Target 部分中,选择您的事件 sink。这可以是 Resource 或一个 URI :
-
选择 Resource 来使用频道、代理或服务作为事件源的事件 sink。在本例中,上一步中创建的
event-display
服务用作目标 资源。 - 选择 URI 来指定事件路由到的 Uniform Resource Identifier (URI)。
-
选择 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
服务,以查看 heartbeats cron 作业生成的事件。
2.6.1.4. 接收器绑定引用 复制链接链接已复制到粘贴板!
您可以通过创建接收器绑定,将 PodSpecable
对象用作事件源。您可以在创建 SinkBinding
对象时配置多个参数。
SinkBinding
对象支持以下参数:
字段 | 描述 | 必需或可选 |
---|---|---|
|
指定 API 版本,如 | 必需 |
|
将此资源对象标识为 | 必需 |
|
指定唯一标识 | 必需 |
|
指定此 | 必需 |
| 对解析为 URI 作为 sink 的对象的引用。 | 必需 |
| 提及通过绑定实施来增强运行时合同的资源。 | 必需 |
| 定义覆盖来控制发送到 sink 的事件的输出格式和修改。 | 选填 |
2.6.1.4.1. 主题参数 复制链接链接已复制到粘贴板!
Subject
参数引用通过绑定实施来增强运行时合同的资源。您可以为 Subject
定义配置多个字段。
Subject
定义支持以下字段:
字段 | 描述 | 必需或可选 |
---|---|---|
| 引用的 API 版本。 | 必需 |
| 引用的类型。 | 必需 |
| 引用的命名空间。如果省略,则默认为对象的命名空间。 | 选填 |
| 引用的名称。 |
如果配置 |
| 引用的选择器。 |
如果配置 |
| 标签选择器要求列表。 |
仅使用 |
| 选择器应用到的标签键。 |
使用 |
|
代表键与一组值的关系。有效的运算符为 |
使用 |
|
字符串值数组。如果 |
使用 |
|
键值对映射. |
仅使用 |
主题参数示例
根据以下 YAML,选择 default
命名空间中名为 mysubject
的 Deployment
对象:
根据以下 YAML,可以选择在 default
命名空间中带有 working=example
标签的 Job
对象:
根据以下 YAML,可以选择在 default
命名空间中带有标签 working=example
或 working=sample
的 Pod
对象:
2.6.1.4.2. CloudEvent 覆盖 复制链接链接已复制到粘贴板!
ceOverrides
定义提供覆盖控制发送到 sink 的 CloudEvent 输出格式和修改。您可以为 ceOverrides
定义配置多个字段。
ceOverrides
定义支持以下字段:
字段 | 描述 | 必需或可选 |
---|---|---|
|
指定在出站事件中添加或覆盖哪些属性。每个 | 选填 |
仅允许有效的 CloudEvent
属性名称作为扩展。您无法从扩展覆盖配置设置 spec 定义的属性。例如,您无法修改 type
属性。
CloudEvent Overrides 示例
这会在 主题
上设置 K_CE_OVERRIDES
环境变量:
输出示例
{ "extensions": { "extra": "this is an extra attribute", "additional": "42" } }
{ "extensions": { "extra": "this is an extra attribute", "additional": "42" } }
2.6.1.4.3. include 标签 复制链接链接已复制到粘贴板!
要使用接收器绑定,您需要为资源或包含资源的命名空间分配 bindings.knative.dev/include: "true"
标签。如果资源定义不包括该标签,集群管理员可以通过运行以下命令将它附加到命名空间:
oc label namespace <namespace> bindings.knative.dev/include=true
$ oc label namespace <namespace> bindings.knative.dev/include=true
2.6.1.5. 将 Service Mesh 与 SinkBinding 集成 复制链接链接已复制到粘贴板!
先决条件
- 您已将 Service Mesh 与 OpenShift Serverless 集成。
流程
在作为
Service
MeshMemberRollCopy to Clipboard Copied! Toggle word wrap Toggle overflow 应用
Service
资源。oc apply -f <filename>
$ oc apply -f <filename>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建
SinkBinding
。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 应用
SinkBinding
资源。oc apply -f <filename>
$ oc apply -f <filename>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建
CronJob
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 应用
CronJob
资源。oc apply -f <filename>
$ oc apply -f <filename>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
要验证事件是否已发送到 Knative 事件 sink,请查看消息转储程序功能日志。
输入以下命令:
oc get pods
$ oc get pods
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令:
oc logs $(oc get pod -o name | grep event-display) -c user-container
$ oc logs $(oc get pod -o name | grep event-display) -c user-container
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.6.2. 容器源 复制链接链接已复制到粘贴板!
容器源创建容器镜像来生成事件并将事件发送到 sink。您可以通过创建容器镜像和使用您的镜像 URI 的 ContainerSource
对象,使用容器源创建自定义事件源。
2.6.2.1. 创建容器镜像的指南 复制链接链接已复制到粘贴板!
两个环境变量由容器源控制器注入:K_SINK
和 K_CE_OVERRIDES
。这些变量分别从 sink
和 andceOverrides
spec 解析。事件发送到 K_SINK
环境变量中指定的 sink URI。该消息必须使用 CloudEvent
HTTP 格式作为 POST
发送。
容器镜像示例
以下是心跳容器镜像的示例:
以下是引用先前心跳容器镜像的容器源示例:
2.6.2.2. 使用 Knative CLI 创建和管理容器源 复制链接链接已复制到粘贴板!
您可以使用 kn source container
命令来使用 Knative (kn
) 创建和管理容器源。使用 Knative CLI 创建事件源提供了比直接修改 YAML 文件更精简且直观的用户界面。
创建容器源
kn source container create <container_source_name> --image <image_uri> --sink <sink>
$ kn source container create <container_source_name> --image <image_uri> --sink <sink>
删除容器源
kn source container delete <container_source_name>
$ kn source container delete <container_source_name>
描述容器源
kn source container describe <container_source_name>
$ kn source container describe <container_source_name>
列出现有容器源
kn source container list
$ kn source container list
以 YAML 格式列出现有容器源
kn source container list -o yaml
$ kn source container list -o yaml
更新容器源
此命令为现有容器源更新镜像 URI:
kn source container update <container_source_name> --image <image_uri>
$ kn source container update <container_source_name> --image <image_uri>
2.6.2.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 中创建应用程序和其他工作负载。
流程
-
在 Developer 视角中,导航到 +Add
Event Source。此时会显示 Event Sources 页面。 - 选择 Container Source,然后点 Create Event Source。此时会显示 Create Event Source 页面。
使用 Form view 或 YAML 视图配置 Container Source 设置:
注意您可以在 Form view 和 YAML view 间进行切换。在不同视图间切换时数据会被保留。
- 在 Image 字段中,输入您要在由容器源创建的容器中运行的镜像的 URI。
- 在 Name 字段中输入镜像的名称。
- 可选:在 Arguments 参数字段中,输入要传递给容器的任何参数。
- 可选:在 Environment variables 字段中,添加容器中要设置的任何环境变量。
在 Target 部分中,选择您的事件 sink。这可以是 Resource 或一个 URI :
- 选择 Resource 来使用频道、代理或服务作为事件源的事件 sink。
- 选择 URI 来指定事件路由到的 Uniform Resource Identifier (URI)。
- 配置完容器源后,点 Create。
2.6.2.4. 容器源参考 复制链接链接已复制到粘贴板!
您可以通过创建 ContainerSource
对象来使用容器作为事件源。您可以在创建 ContainerSource
对象时配置多个参数。
ContainerSource
对象支持以下字段:
字段 | 描述 | 必需或可选 |
---|---|---|
|
指定 API 版本,如 | 必需 |
|
将此资源对象标识为 | 必需 |
|
指定唯一标识 | 必需 |
|
指定此 | 必需 |
| 对解析为 URI 作为 sink 的对象的引用。 | 必需 |
|
| 必需 |
| 定义覆盖来控制发送到 sink 的事件的输出格式和修改。 | 选填 |
模板参数示例
2.6.2.4.1. CloudEvent 覆盖 复制链接链接已复制到粘贴板!
ceOverrides
定义提供覆盖控制发送到 sink 的 CloudEvent 输出格式和修改。您可以为 ceOverrides
定义配置多个字段。
ceOverrides
定义支持以下字段:
字段 | 描述 | 必需或可选 |
---|---|---|
|
指定在出站事件中添加或覆盖哪些属性。每个 | 选填 |
仅允许有效的 CloudEvent
属性名称作为扩展。您无法从扩展覆盖配置设置 spec 定义的属性。例如,您无法修改 type
属性。
CloudEvent Overrides 示例
这会在 主题
上设置 K_CE_OVERRIDES
环境变量:
输出示例
{ "extensions": { "extra": "this is an extra attribute", "additional": "42" } }
{ "extensions": { "extra": "this is an extra attribute", "additional": "42" } }
2.6.2.5. 将 Service Mesh 与 ContainerSource 集成 复制链接链接已复制到粘贴板!
先决条件
- 您已将 Service Mesh 与 OpenShift Serverless 集成。
流程
在作为
Service
MeshMemberRollCopy to Clipboard Copied! Toggle word wrap Toggle overflow 应用
Service
资源。oc apply -f <filename>
$ oc apply -f <filename>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在作为
ServiceMeshMemberRoll
的成员的命名空间中创建一个ContainerSource
,将 sink 设置为event-display
。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 应用
ContainerSource
资源。oc apply -f <filename>
$ oc apply -f <filename>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
要验证事件是否已发送到 Knative 事件 sink,请查看消息转储程序功能日志。
输入以下命令:
oc get pods
$ oc get pods
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令:
oc logs $(oc get pod -o name | grep event-display) -c user-container
$ oc logs $(oc get pod -o name | grep event-display) -c user-container
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow