跳到内容

创建 SinkBinding

API version v1

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

在以下示例中,接收器是 Knative Service,主体是 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 对象设置为包含模式

  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 行为。

创建接收器 (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
  1. 使用以下模板创建 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
  2. 通过运行命令应用 YAML 文件

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

创建主体 (subject)

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

  • 部署
  • 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 的 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"

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

我们使用分析和 cookie 来了解网站流量。有关您使用我们网站的信息会与 Google 共享以达到此目的。了解更多。