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

  1. 可执行以下命令创建名为default的Broker。
$ kn broker create default -n knative-tutorial
  1. 执行命令查看生成的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

  1. 执行命令创建两个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

  1. 执行命令创建名为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

  1. 执行命令创建两个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验证

  1. 由于名为my-ping-source的PingSource会定时向Broker发请求,而且此时2个Trigger都没有Filter,因此2个Knative Service服务可同时接收到定时请求。
    在这里插入图片描述
  2. 然后执行以下命令,更新这2个Trigger对象,分别过滤aloha和bonjour。
$ kn trigger update helloaloha --filter type=aloha -n knative-tutorial
$ kn trigger update hellobonjour --filter type=bonjour -n knative-tutorial
  1. 然后确认作为Sink的2个Knative Service对象都接收不到消息了。
    在这里插入图片描述

手动发请求验证

  1. 执行以下命令查看名为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
  1. 执行以下命令查看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
  1. 为了能通过内部地址访问broker,先创建curler.yaml文件,其内容如下。其中可以使用任意包含 curl 命令的镜像。
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: curler
  name: curler
spec:
  containers:
  - name: curler
    image: fedora:latest
    tty: true
  1. 根据curler.yaml文件创建curler容器。
$ oc apply -f curler.yaml -n knative-tutorial
  1. 等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