OpenShift 4 - Knative教程 (7) Eventing之Broker和Trigger
《OpenShift 4.x HOL教程汇总》
说明:本文已经在OpenShift 4.10环境中验证
概念
Knative Eventing的Broker和Trigger对象可实现对事件进行过滤,事件的消费方可以利用这种机制只获取自己感兴趣的事件,而不是接收所有 Channel 中的事件信息。本文将向Broker发送两种不同的测试包文(报文头有区别),通过在两个Tigger中设置不同的Filter获取对应类型的Event,然后分别发给后台对应的Knative Serving的服务处理。

操作说明
部署Broker
- 可执行以下命令创建名为default的Broker。
$ kn broker create default -n knative-tutorial
- 执行命令查看生成的Broker和Service。可以看到名为default的Broker的访问地址是一个内部地址。
$ oc get all -n knative-tutorial
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/default-kne-trigger-kn-channel ExternalName <none> imc-dispatcher.knative-eventing.svc.cluster.local <none> 2m45s
NAME URL AGE READY REASON
broker.eventing.knative.dev/default http://broker-ingress.knative-eventing.svc.cluster.local/knative-tutorial/default 2m45s True
NAME URL AGE READY REASON
inmemorychannel.messaging.knative.dev/default-kne-trigger http://default-kne-trigger-kn-channel.knative-tutorial.svc.cluster.local 2m45s True
部署Service作为Sink
- 执行命令创建两个Knative的Service对象:eventingaloha和eventingbonjour ,然后查看这两个Service的的黄台都是READY=True。
$ kn service create eventingaloha --concurrency-target=1 --revision-name=eventingaloha-v1 --image=quay.io/rhdevelopers/eventinghello:0.0.2 -n knative-tutorial
$ kn service create eventingbonjour --concurrency-target=1 --revision-name=eventingbonjour-v1 --image=quay.io/rhdevelopers/eventinghello:0.0.2 -n knative-tutorial
$ kn service list -n knative-tutorial
NAME URL LATEST AGE CONDITIONS READY REASON
eventingaloha http://eventingaloha-knative-tutorial.apps.cluster-pek-e4bf.pek-e4bf.sandbox1216.opentlc.com eventingaloha-v1 2m35s 3 OK / 3 True
eventingbonjour http://eventingbonjour-knative-tutorial.apps.cluster-pek-e4bf.pek-e4bf.sandbox1216.opentlc.com eventingbonjour-v1 2m22s 3 OK / 3 True
部署Event Source
- 执行命令创建名为my-ping-source的PingSource,它将消息发给名为default的Broker。然后查看生成的PingSource资源。
$ kn source ping create my-ping-source --schedule "*/2 * * * *" --sink broker:default -n knative-tutorial
$ kn source ping list -n knative-tutorial
NAME SCHEDULE SINK AGE CONDITIONS READY REASON
my-ping-source */2 * * * * Broker:default 2m19s 3 OK / 3 True
部署Trigger
- 执行命令创建两个Trigger,然后查看生成的Trigger资源。
$ kn trigger create helloaloha --broker=default --sink=ksvc:eventingaloha -n knative-tutorial
$ kn trigger create hellobonjour --broker=default --sink=ksvc:eventingbonjour -n knative-tutorial
$ kn trigger list -n knative-tutorial
NAME BROKER SINK AGE CONDITIONS READY REASON
helloaloha default ksvc:eventingaloha 23s 6 OK / 6 True
hellobonjour default ksvc:eventingbonjour 14s 6 OK / 6 True
测试验证
利用Event Source验证
- 由于名为my-ping-source的PingSource会定时向Broker发请求,而且此时2个Trigger都没有Filter,因此2个Knative Service服务可同时接收到定时请求。

- 然后执行以下命令,更新这2个Trigger对象,分别过滤aloha和bonjour。
$ kn trigger update helloaloha --filter type=aloha -n knative-tutorial
$ kn trigger update hellobonjour --filter type=bonjour -n knative-tutorial
- 然后确认作为Sink的2个Knative Service对象都接收不到消息了。

手动发请求验证
- 执行以下命令查看名为default的Borker对象,确认访问地址是内部地址。
$ kn broker list default -n knative-tutorial
NAME URL AGE CONDITIONS READY REASON
default http://broker-ingress.knative-eventing.svc.cluster.local/knative-tutorial/default 126m 5 OK / 5 True
- 执行以下命令查看2个Knative Trigger对象的SUBSCRIBER_URI,确认访问地址是内部地址。
$ oc get trigger -n knative-tutorial
NAME BROKER SUBSCRIBER_URI AGE READY REASON
helloaloha default http://eventingaloha.knative-tutorial.svc.cluster.local 84m True
hellobonjour default http://eventingbonjour.knative-tutorial.svc.cluster.local 84m True
- 为了能通过内部地址访问broker,先创建curler.yaml文件,其内容如下。其中可以使用任意包含 curl 命令的镜像。
apiVersion: v1
kind: Pod
metadata:
labels:
run: curler
name: curler
spec:
containers:
- name: curler
image: fedora:latest
tty: true
- 根据curler.yaml文件创建curler容器。
$ oc apply -f curler.yaml -n knative-tutorial
- 等eventingaloha和eventingalohb的Knative Service都变为“0”后执行命令分别向2个Trigger的订阅地址发送Header带有"Ce-Type: aloha"和"Ce-Type: bonjour"的请求,然后确认对应的后台Knative Service会分别运行起来。
$ oc -n knative-tutorial exec -it curler -- curl $(oc get trigger helloaloha -o jsonpath={.status.subscriberUri} -n knative-tutorial) \
-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"}'
{"hello":"world"}
$ oc -n knative-tutorial exec -it curler -- curl $(oc get trigger hellobonjour -o jsonpath={.status.subscriberUri} -n knative-tutorial) \
-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"}'
{"hello":"world"}

6. 执行命令清除环境。
$ oc delete pod curler -n knative-tutorial
$ kn source ping delete my-ping-source -n knative-tutorial
$ kn service delete eventingaloha -n knative-tutorial
$ kn service delete eventingbonjour -n knative-tutorial
$ kn trigger delete helloaloha -n knative-tutorial
$ kn trigger delete hellobonjour -n knative-tutorial
$ kn broker delete default -n knative-tutorial
参考
- https://redhat-developer-demos.github.io/knative-tutorial/knative-tutorial/eventing/eventing-trigger-broker.html