Skip to content

创建一个SinkBinding

API version v1

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

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

在开始之前

在创建SinkBinding对象之前:

  • 您必须在集群上安装Knative事件处理。
  • 可选:如果你想在SinkBinding中使用kn命令,请安装kn命令行。

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

SinkBinding对象以两种模式之一操作:exclusion or 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.

Note

如果选择了包含模式,则必须将bindings.knative.dev/include: true标签添加到命名空间,以启用SinkBinding行为。

创建一个接收器

接收器可以是任何可以接收事件的可寻址Kubernetes对象。

如果没有想要连接到SinkBinding对象的现有接收器,请创建Knative服务。

Note

要创建Knative服务,必须在集群上安装Knative服务。

通过运行以下命令创建Knative服务:

kn service create <app-name> --image <image-url>
Where:

  • <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>
    
    Where:

    • <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
    
    其中' '是您在上一步中创建的文件的名称。

创建一个SinkBinding对象

创建一个SinkBinding对象,将事件从主题引导到接收器。

通过运行以下命令创建一个SinkBinding对象:

kn source binding create <name> \
  --namespace <namespace> \
  --subject "<subject>" \
  --sink <sink> \
  --ce-override "<cloudevent-overrides>"
Where:

  • <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.
  • Optional: <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>
    
    Where:

    • <name> 它是您想要创建的SinkBinding对象的名称。例如, bind-heartbeat.
    • <api-version> 它是该主题的API版本。例如 batch/v1.
    • <kind> 这是你的主题。例如 Job.
    • <label-key>: <label-value> 它是键值对的映射,用于选择具有匹配标签的主题。例如, app: heartbeat-cron 它会选择任何带有app: heartbeat-cron标签的主题.
    • <sink> 它是连接的水槽。例如 event-display.

    有关可以为SinkBinding对象配置的字段的更多信息,请参见Sink Binding Reference.。

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

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

验证SinkBinding对象

  1. 通过查看您的接收器的服务日志,验证消息被发送到Knative事件系统:

    kubectl logs -l <sink> -c <container> --since=10m
    
    Where:

    • <sink> is the name of your sink.
    • <container> is the name of the container your sink is running in.

    For example:

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

Back to top

We use analytics and cookies to understand site traffic. Information about your use of our site is shared with Google for that purpose. Learn more.

× OK