跳到內容

建立 SinkBinding

API version v1

本主題描述如何建立 SinkBinding 物件。SinkBinding 會將接收器解析為 URI,並在環境變數 K_SINK 中設定 URI,並使用 K_SINK 將 URI 新增至主體。如果 URI 變更,SinkBinding 會更新 K_SINK 的值。

在下列範例中,接收器是一個 Knative 服務,而主體是一個 CronJob。如果您有現有的主體和接收器,可以使用您自己的值取代範例。

開始之前

在您可以建立 SinkBinding 物件之前

  • 您必須在叢集上安裝 Knative Eventing。
  • 選用:如果您想要搭配 SinkBinding 使用 kn 命令,請安裝 kn CLI。

選用:選擇 SinkBinding 命名空間選取行為

SinkBinding 物件以兩種模式之一運作:排除包含

預設模式為排除。在排除模式中,預設會為命名空間啟用 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>
其中 <命名空間> 是您想要 SinkBinding 使用的命名空間。例如,sinkbinding-example

注意

如果您已選取包含模式,您必須將 bindings.knative.dev/include: true 標籤新增至命名空間,以啟用 SinkBinding 行為。

建立接收器

接收器可以是任何可以接收事件的可定址 Kubernetes 物件。

如果您沒有想要連線到 SinkBinding 物件的現有接收器,請建立 Knative 服務。

注意

若要建立 Knative 服務,您必須在叢集上安裝 Knative Serving。

執行以下命令來建立 Knative 服務

kn service create <app-name> --image <image-url>
其中

  • <應用程式名稱> 是應用程式的名稱。
  • <映像 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>
    
    其中

    • <應用程式名稱> 是應用程式的名稱。例如,event-display
    • <映像 URL> 是映像容器的 URL。例如,gcr.io/knative-releases/knative.dev/eventing/cmd/event_display
  2. 執行以下命令來套用 YAML 檔案

    kubectl apply -f <filename>.yaml
    
    其中 <檔案名稱> 是您在上一步中建立的檔案名稱。

建立主體

主體必須是 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>"
其中

  • <名稱> 是您想要建立的 SinkBinding 物件的名稱。
  • <命名空間> 是您為 SinkBinding 建立使用的命名空間。
  • <主體> 是要連線的主體。範例
    • Job:batch/v1:app=heartbeat-cron 符合命名空間中所有標籤為 app=heartbeat-cron 的工作。
    • Deployment:apps/v1:myapp 符合命名空間中名為 myapp 的部署。
    • Service:serving.knative.dev/v1:hello 符合名為 hello 的服務。
  • <接收器> 是要連線的接收器。例如 http://event-display.svc.cluster.local
  • 選用:<cloudevent-overrides> 的格式為 key=value。Cloud Event 覆寫會控制傳送至接收器的事件的輸出格式和修改,並在傳送事件之前套用。您可以多次提供此旗標。

如需可用選項的清單,請參閱 Knative client 文件

例如

$ 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>
    
    其中

    • <名稱> 是您想要建立的 SinkBinding 物件的名稱。例如,bind-heartbeat
    • <api-version> 是主體的 API 版本。例如,batch/v1
    • <種類> 是您主體的種類。例如,Job
    • <標籤金鑰>: <標籤值> 是一組索引鍵值對應,用於選取具有相符標籤的主體。例如,app: heartbeat-cron 會選取任何具有標籤 app=heartbeat-cron 的主體。
    • <接收器> 是要連線的接收器。例如,event-display

    如需有關您可以為 SinkBinding 物件設定的欄位的詳細資訊,請參閱 SinkBinding 參考

  2. 執行以下命令來套用 YAML 檔案

    kubectl apply -f <filename>.yaml
    
    其中 <檔案名稱> 是您在上一步中建立的檔案名稱。

驗證 SinkBinding 物件

  1. 查看接收器的服務記錄,以驗證是否已將訊息傳送至 Knative 事件系統

    kubectl logs -l <sink> -c <container> --since=10m
    
    其中

    • <接收器> 是您接收器的名稱。
    • <容器> 是您的接收器在其中執行的容器名稱。

    例如

    $ 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.org.tw/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>
其中 <命名空間> 是包含 SinkBinding 物件的命名空間名稱。

我們使用分析工具和 Cookie 來了解網站流量。您使用我們網站的資訊會與 Google 分享,以達到此目的。了解詳情。