跳至内容

创建 SinkBinding

API version v1

本主题介绍如何创建 SinkBinding 对象。SinkBinding 将接收器解析为 URI,在环境变量 K_SINK 中设置 URI,并将 URI 添加到主题中使用 K_SINK。如果 URI 发生更改,SinkBinding 会更新 K_SINK 的值。

在以下示例中,接收器是一个 Knative 服务,主题是一个 CronJob。如果您拥有现有的主题和接收器,则可以使用您自己的值替换示例。

开始之前

在您创建 SinkBinding 对象之前

  • 您必须在集群上安装 Knative Eventing。
  • 可选:如果您想将 kn 命令与 SinkBinding 一起使用,请安装 kn CLI。

可选:选择 SinkBinding 命名空间选择行为

SinkBinding 对象以两种模式之一运行:exclusioninclusion

默认模式为 exclusion。在排斥模式下,SinkBinding 行为默认情况下对命名空间启用。要禁止对命名空间进行变异评估,您必须使用标签 bindings.knative.dev/exclude: true 将其排除。

在包含模式下,SinkBinding 行为不会为命名空间启用。在对命名空间进行变异评估之前,您必须使用标签 bindings.knative.dev/include: true 明确将其包含在内。

要将 SinkBinding 对象设置为包含模式

  1. 通过运行以下命令将 SINK_BINDING_SELECTION_MODE 的值从 exclusion 更改为 inclusion

    kubectl -n knative-eventing set env deployments eventing-webhook --containers="eventing-webhook" SINK_BINDING_SELECTION_MODE=inclusion
    
  2. 要验证 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
  1. 使用以下模板创建 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
  2. 通过运行以下命令应用 YAML 文件

    kubectl apply -f <filename>.yaml
    
    其中 <filename> 是您在上一步中创建的文件的名称。

创建主题

主题必须是 PodSpecable 资源。您可以在集群中使用任何 PodSpecable 资源,例如

  • Deployment
  • Job
  • DaemonSet
  • StatefulSet
  • Service.serving.knative.dev

如果您没有要使用的现有 PodSpecable 主题,可以使用以下示例创建 CronJob 对象作为主题。以下 CronJob 生成一个针对 K_SINK 的单个云事件,并添加 CE_OVERRIDES 提供的任何额外覆盖。

  1. 使用以下示例创建 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
    
  2. 通过运行以下命令应用 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"

  1. 使用以下模板创建 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 参考

  2. 通过运行以下命令应用 YAML 文件

    kubectl apply -f <filename>.yaml
    
    其中 <filename> 是您在上一步中创建的文件的名称。

验证 SinkBinding 对象

  1. 通过查看接收器服务的日志以验证是否已将消息发送到 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
    

  2. 从输出中,观察显示源发送到显示函数的事件消息的请求标头和主体。例如

      ☁️  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 对象的命名空间的名称。

我们使用分析和 Cookie 来了解网站流量。有关您使用我们网站的信息将与 Google 共享,用于该目的。 了解更多