概念
Knative Eventing的Broker和Trigger對象可實現對事件進行過濾,事件的消費方可以利用這種機制只獲取自己感興趣的事件,而不是接收所有 Channel 中的事件信息。本文將向Broker發送兩種不同的測試包文(報文頭有區別),通過在兩個Tigger中設置不同的Filter獲取對應類型的Event,然後分別發給後臺對應的Knative Serving的服務處理。
操作說明
部署Broker
在Knative中當對一個項目打knative-eventing-injection=enabled標籤,Knative Eventing就會爲項目提供一個名爲default的Broker。
- 執行命令爲knativetutorial 項目打標籤。
$ oc label namespace knativetutorial knative-eventing-injection=enabled
- 執行命令,查看生成的Broker、Pod和Service。可以看到名爲default的Broker的訪問地址是一個內部地址。
$ oc -nknativetutorial get broker
NAME READY REASON URL AGE
default True http://default-broker.knativetutorial.svc.cluster.local 65m
$ oc -nknativetutorial get pod
NAME READY STATUS RESTARTS AGE
default-broker-filter-b944cfc76-fn4tp 1/1 Running 0 89m
default-broker-ingress-6f668f8b94-cfjm9 1/1 Running 0 89m
$ oc -nknativetutorial get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default-broker ClusterIP 172.30.106.246 <none> 80/TCP,9090/TCP 89m
default-broker-filter ClusterIP 172.30.177.241 <none> 80/TCP,9090/TCP 89m
default-kne-trigger-kn-channel ExternalName <none> imc-dispatcher.knative-eventing.svc.cluster.local <none> 89m
部署Service
- 創建eventing-aloha-sink.yaml和eventing-bonjour-sink.yaml文件,分別是以下內容:
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: eventingaloha
spec:
template:
metadata:
name: eventingaloha-v1
annotations:
autoscaling.knative.dev/target: "1"
spec:
containers:
- image: quay.io/burrsutter/eventinghello:0.0.1
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: eventingbonjour
spec:
template:
metadata:
name: eventingbonjour-v1
annotations:
autoscaling.knative.dev/target: "1"
spec:
containers:
- image: quay.io/burrsutter/eventinghello:0.0.1
- 執行命令,生成兩個Service,然後查看多出來的和這兩個Service相關的資源。
$ oc -n knativetutorial apply -f eventing-aloha-sink.yaml
$ oc -n knativetutorial apply -f eventing-bonjour-sink.yaml
$ oc --namespace knativetutorial get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
eventingaloha ExternalName <none> kourier-internal.knative-serving-ingress.svc.cluster.local <none> 55m
eventingaloha-v1 ClusterIP 172.30.179.201 <none> 80/TCP 55m
eventingaloha-v1-private ClusterIP 172.30.165.146 <none> 80/TCP,9090/TCP,9091/TCP,8022/TCP 55m
eventingbonjour ExternalName <none> kourier-internal.knative-serving-ingress.svc.cluster.local <none> 54m
eventingbonjour-v1 ClusterIP 172.30.11.132 <none> 80/TCP 55m
eventingbonjour-v1-private ClusterIP 172.30.64.59 <none> 80/TCP,9090/TCP,9091/TCP,8022/TCP 55m
部署Event Source
- 創建event-source-broker.yaml文件,內容如下。它定義了名爲my-cjs的CronJobSource,將消息發給名爲default的Broker。
apiVersion: sources.eventing.knative.dev/v1alpha1
kind: CronJobSource
metadata:
name: my-cjs
spec:
schedule: "*/2 * * * *"
data: '{"message": "From CronJob Source"}'
sink:
ref:
apiVersion: eventing.knative.dev/v1alpha1
kind: Broker
name: default
- 執行命令,生成名爲my-cjs的CronJobSource,然後查看生成的CronJobSource資源。
$ oc -n knativetutorial apply -f event-source-broker.yaml
$ oc -n knativetutorial get cronjobsources
NAME READY AGE
my-cjs True 90s
部署Trigger
- 創建trigger-helloaloha.yaml和trigger-hellobonjour.yaml文件,文件內容分別如下。兩個文件主要差別是Trigger的filter不同,分別可以接收"Ce-Type: aloha"和"Ce-Type: bonjour"的Header請求。
apiVersion: eventing.knative.dev/v1alpha1
kind: Trigger
metadata:
name: helloaloha
spec:
broker: default
#filter:
# attributes:
# type: aloha
subscriber:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: eventingaloha
apiVersion: eventing.knative.dev/v1alpha1
kind: Trigger
metadata:
name: hellobonjour
spec:
broker: default
#filter:
# attributes:
# type: bonjour
subscriber:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: eventingbonjour
- 執行命令,生成兩個Trigger,然後查看生成的資源Trigger資源。
$ oc -n knativetutorial apply -f trigger-helloaloha.yaml
$ oc -n knativetutorial apply -f trigger-hellobonjour.yaml
$ oc -n knativetutorial get trigger
NAME READY REASON BROKER SUBSCRIBER_URI AGE
helloaloha True default http://eventingaloha.knativetutorial.svc.cluster.local 66m
hellobonjour True default http://eventingbonjour.knativetutorial.svc.cluster.local 66m
測試驗證
利用Event Source驗證
由於名爲my-cjs的CronJobSource會定時向Broker發請求,而且此時2個Trigger都沒有Filter,因此2個Knative Serving的服務可同時接收到定時請求。
手動發請求驗證
- 編輯eventing-aloha-sink.yaml和eventing-bonjour-sink.yaml文件,去掉文件中的註釋,以便給Trigger增加Filter。
- 然後執行以下命令,更新這2個Trigger對象。
$ oc -n knativetutorial apply -f trigger-helloaloha.yaml
$ oc -n knativetutorial apply -f trigger-hellobonjour.yaml
- 爲了能通過內部地址訪問broker,先創建curler.yaml文件,其內容如下。
apiVersion: v1
kind: Pod
metadata:
labels:
run: curler
name: curler
spec:
containers:
-- name: curler
image: fedora:29
tty: true
- 根據curler.yaml文件創建curler容器,然後進入該容器。
$ oc -n knativetutorial apply -f curler.yaml
$ oc -n knativetutorial exec -it curler -- /bin/bash
- 等eventingaloha和eventingalohb的Knative Serving都變爲0後,在curler 容器中執行命令,向broker發送Header帶有"Ce-Type: aloha"的請求,然後確認和aloha相關的服務運行起來。
curl -v "http://default-broker.knativetutorial.svc.cluster.local" \
-X POST \
-H "Ce-Id: say-hello" \
-H "Ce-Specversion: 1.0" \
-H "Ce-Type: aloha" \
-H "Ce-Source: mycurl" \
-H "Content-Type: application/json" \
-d '{"key":"from a curl"}'
4.等eventingaloha和eventingalohb的Knative Serving都變爲0後,在curler 容器中執行命令,向broker發送Header帶有"Ce-Type: bonjour"的請求,然後確認和bonjour相關的服務運行起來。
curl -v "http://default-broker.knativetutorial.svc.cluster.local" \
-X POST \
-H "Ce-Id: say-hello" \
-H "Ce-Specversion: 1.0" \
-H "Ce-Type: bonjour" \
-H "Ce-Source: mycurl" \
-H "Content-Type: application/json" \
-d '{"key":"from a curl"}'
參考
- https://github.com/RedHatWorkshops/knative-on-ocp4/blob/master/7.UsingBrokersAndTriggers.md