建立 SinkBinding¶
本主題描述如何建立 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 物件設定為包含模式
-
執行以下命令,將
SINK_BINDING_SELECTION_MODE
的值從exclusion
變更為inclusion
kubectl -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>
<命名空間>
是您想要 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
-
使用以下範本,為 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
。
-
執行以下命令來套用 YAML 檔案
其中kubectl apply -f <filename>.yaml
<檔案名稱>
是您在上一步中建立的檔案名稱。
建立主體¶
主體必須是 PodSpecable 資源。您可以在叢集中使用任何 PodSpecable 資源,例如
Deployment
Job
DaemonSet
StatefulSet
Service.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
<檔案名稱>
是您在上一步中建立的檔案名稱。
建立 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"
-
使用以下範本,為
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 參考。
-
執行以下命令來套用 YAML 檔案
其中kubectl apply -f <filename>.yaml
<檔案名稱>
是您在上一步中建立的檔案名稱。
驗證 SinkBinding 物件¶
-
查看接收器的服務記錄,以驗證是否已將訊息傳送至 Knative 事件系統
其中kubectl logs -l <sink> -c <container> --since=10m
<接收器>
是您接收器的名稱。<容器>
是您的接收器在其中執行的容器名稱。
例如
$ 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.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 物件的命名空間名稱。