创建 SinkBinding¶
本主题介绍如何创建 SinkBinding 对象。SinkBinding 将接收器解析为 URI,将 URI 设置到环境变量 K_SINK 中,并使用 K_SINK 将 URI 添加到主体中。如果 URI 更改,SinkBinding 会更新 K_SINK 的值。
在以下示例中,接收器是 Knative Service,主体是 CronJob。如果您已有主体和接收器,可以用您自己的值替换示例。
准备工作¶
在创建 SinkBinding 对象之前
- 您的集群上必须安装了 Knative Eventing。
- 可选:如果您想将
kn命令与 SinkBinding 一起使用,请安装knCLI。
可选:选择 SinkBinding 命名空间选择行为¶
SinkBinding 对象以两种模式之一运行:exclusion (排除) 或 inclusion (包含)。
默认模式是 exclusion。在排除模式下,SinkBinding 行为默认对命名空间启用。要禁止对某个命名空间进行评估以进行突变,您必须使用标签 bindings.knative.dev/exclude: true 将其排除。
在包含模式下,SinkBinding 行为对命名空间不启用。在对命名空间进行评估以进行突变之前,您必须使用标签 bindings.knative.dev/include: true 显式包含它。
将 SinkBinding 对象设置为包含模式
-
通过运行以下命令,将
SINK_BINDING_SELECTION_MODE的值从exclusion更改为inclusionkubectl -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 行为。
创建接收器 (sink)¶
接收器可以是任何可以接收事件的可寻址 Kubernetes 对象。
如果您没有要连接到 SinkBinding 对象的现有接收器,请创建一个 Knative service。
注意
要创建 Knative 服务,您必须在集群上安装 Knative Serving。
通过运行以下命令创建 Knative service
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 service 的 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>是您在上一步中创建的文件的名称。
创建主体 (subject)¶
主体必须是 PodSpecable 资源。您可以使用集群中的任何 PodSpecable 资源,例如
部署JobDaemonSetStatefulSetService.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的 job。Deployment:apps/v1:myapp匹配命名空间中名为myapp的部署。Service:serving.knative.dev/v1:hello匹配名为hello的 service。
<sink>是要连接的接收器。例如http://event-display.svc.cluster.local。- 可选:
<cloudevent-overrides>格式为key=value。Cloud Event 覆盖控制发送到接收器的事件的输出格式和修改,并在发送事件之前应用。您可以多次提供此标志。
有关可用选项的列表,请参阅 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.com.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 对象的命名空间名称。