创建 SinkBinding¶
本主题介绍如何创建 SinkBinding 对象。SinkBinding 将接收器解析为 URI,在环境变量 K_SINK
中设置 URI,并将 URI 添加到主题中使用 K_SINK
。如果 URI 发生更改,SinkBinding 会更新 K_SINK
的值。
在以下示例中,接收器是一个 Knative 服务,主题是一个 CronJob。如果您拥有现有的主题和接收器,则可以使用您自己的值替换示例。
开始之前¶
在您创建 SinkBinding 对象之前
- 您必须在集群上安装 Knative Eventing。
- 可选:如果您想将
kn
命令与 SinkBinding 一起使用,请安装kn
CLI。
可选:选择 SinkBinding 命名空间选择行为¶
SinkBinding 对象以两种模式之一运行:exclusion
或 inclusion
。
默认模式为 exclusion
。在排斥模式下,SinkBinding 行为默认情况下对命名空间启用。要禁止对命名空间进行变异评估,您必须使用标签 bindings.knative.dev/exclude: true
将其排除。
在包含模式下,SinkBinding 行为不会为命名空间启用。在对命名空间进行变异评估之前,您必须使用标签 bindings.knative.dev/include: true
明确将其包含在内。
要将 SinkBinding 对象设置为包含模式
-
通过运行以下命令将
SINK_BINDING_SELECTION_MODE
的值从exclusion
更改为inclusion
kubectl -n knative-eventing set env deployments eventing-webhook --containers="eventing-webhook" SINK_BINDING_SELECTION_MODE=inclusion
-
要验证
SINK_BINDING_SELECTION_MODE
是否按预期设置,请运行kubectl -n knative-eventing set env deployments eventing-webhook --containers="eventing-webhook" --list | grep SINK_BINDING
创建命名空间¶
如果您没有现有的命名空间,请为 SinkBinding 对象创建一个命名空间
kubectl create namespace <namespace>
<namespace>
是您希望 SinkBinding 使用的命名空间。例如,sinkbinding-example
。
注意
如果您选择了包含模式,则必须将 bindings.knative.dev/include: true
标签添加到命名空间以启用 SinkBinding 行为。
创建接收器¶
接收器可以是任何可以接收事件的可寻址 Kubernetes 对象。
如果您没有现有的接收器要连接到 SinkBinding 对象,请创建一个 Knative 服务。
注意
要创建 Knative 服务,您必须在集群上安装 Knative Serving。
通过运行以下命令创建 Knative 服务
kn service create <app-name> --image <image-url>
<app-name>
是应用程序的名称。<image-url>
是镜像容器的 URL。
例如
$ kn service create event-display --image gcr.io/knative-releases/knative.dev/eventing/cmd/event_display
-
使用以下模板创建 Knative 服务的 YAML 文件
其中apiVersion: serving.knative.dev/v1 kind: Service metadata: name: <app-name> spec: template: spec: containers: - image: <image-url>
<app-name>
是应用程序的名称。例如,event-display
。<image-url>
是镜像容器的 URL。例如,gcr.io/knative-releases/knative.dev/eventing/cmd/event_display
。
-
通过运行以下命令应用 YAML 文件
其中kubectl apply -f <filename>.yaml
<filename>
是您在上一步中创建的文件的名称。
创建主题¶
主题必须是 PodSpecable 资源。您可以在集群中使用任何 PodSpecable 资源,例如
Deployment
Job
DaemonSet
StatefulSet
Service.serving.knative.dev
如果您没有要使用的现有 PodSpecable 主题,可以使用以下示例创建 CronJob 对象作为主题。以下 CronJob 生成一个针对 K_SINK
的单个云事件,并添加 CE_OVERRIDES
提供的任何额外覆盖。
-
使用以下示例创建 CronJob 的 YAML 文件
apiVersion: batch/v1 kind: CronJob metadata: name: heartbeat-cron spec: # Run every minute schedule: "*/1 * * * *" jobTemplate: metadata: labels: app: heartbeat-cron spec: template: spec: restartPolicy: Never containers: - name: single-heartbeat image: gcr.io/knative-nightly/knative.dev/eventing/cmd/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
-
通过运行以下命令应用 YAML 文件
其中kubectl apply -f <filename>.yaml
<filename>
是您在上一步中创建的文件的名称。
创建 SinkBinding 对象¶
创建一个 SinkBinding
对象,将事件从您的主题定向到接收器。
通过运行以下命令创建 SinkBinding
对象
kn source binding create <name> \
--namespace <namespace> \
--subject "<subject>" \
--sink <sink> \
--ce-override "<cloudevent-overrides>"
<name>
是您要创建的 SinkBinding 对象的名称。<namespace>
是您为 SinkBinding 创建的命名空间。<subject>
是要连接的主题。示例Job:batch/v1:app=heartbeat-cron
匹配命名空间中具有标签app=heartbeat-cron
的所有作业。Deployment:apps/v1:myapp
匹配命名空间中名为myapp
的部署。Service:serving.knative.dev/v1:hello
匹配名为hello
的服务。
<sink>
是要连接的接收器。例如http://event-display.svc.cluster.local
。- 可选:
<cloudevent-overrides>
以key=value
的形式出现。云事件覆盖控制发送到接收器的事件的输出格式和修改,并在发送事件之前应用。您可以多次提供此标志。
有关可用选项的列表,请参阅 Knative 客户端文档。
例如
$ 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"
-
使用以下模板创建
SinkBinding
对象的 YAML 文件其中apiVersion: sources.knative.dev/v1 kind: SinkBinding metadata: name: <name> spec: subject: apiVersion: <api-version> kind: <kind> selector: matchLabels: <label-key>: <label-value> sink: ref: apiVersion: serving.knative.dev/v1 kind: Service name: <sink>
<name>
是您要创建的 SinkBinding 对象的名称。例如,bind-heartbeat
。<api-version>
是主题的 API 版本。例如batch/v1
。<kind>
是主题的 Kind。例如Job
。<label-key>: <label-value>
是一个键值对映射,用于选择具有匹配标签的主题。例如,app: heartbeat-cron
选择具有标签app=heartbeat-cron
的任何主题。<sink>
是要连接的接收器。例如event-display
。
有关您可以为 SinkBinding 对象配置的字段的更多信息,请参阅 Sink Binding 参考。
-
通过运行以下命令应用 YAML 文件
其中kubectl apply -f <filename>.yaml
<filename>
是您在上一步中创建的文件的名称。
验证 SinkBinding 对象¶
-
通过查看接收器服务的日志以验证是否已将消息发送到 Knative 事件系统
其中kubectl logs -l <sink> -c <container> --since=10m
<sink>
是接收器的名称。<container>
是接收器运行所在的容器的名称。
例如
$ kubectl logs -l serving.knative.dev/service=event-display -c user-container --since=10m
-
从输出中,观察显示源发送到显示函数的事件消息的请求标头和主体。例如
☁️ cloudevents.Event Validation: valid Context Attributes, specversion: 1.0 type: dev.knative.eventing.samples.heartbeat source: https://knative.k8s.ac.cn/eventing-contrib/cmd/heartbeats/#default/heartbeat-cron-1582120020-75qrz id: 5f4122be-ac6f-4349-a94f-4bfc6eb3f687 time: 2020-02-19T13:47:10.41428688Z datacontenttype: application/json Extensions, beats: true heart: yes the: 42 Data, { "id": 1, "label": "" }
删除 SinkBinding¶
要删除 SinkBinding 对象和命名空间中的所有相关资源,请通过运行以下命令删除命名空间
kubectl delete namespace <namespace>
<namespace>
是包含 SinkBinding 对象的命名空间的名称。