Knative Event Driven Flow
Flow:
事件从生产者传递给消息费之间的路径上,需要由一到多个Processor(KSVC/SVC)进行预处理;
预处理时需要经由路径拓扑,可以经由Knative Eventing Flow进行定义,主要由两个CRD负责完成:
Sequence:串联一到多个Processor,主要由一到多个Step和一个channelTemplate组成;
Parallel:条件式并联一到多个Processor,主要由一到多个Branch和一个channelTemplate组成;
Sequence和Parallel均是Callable或Addressable类型的资源
消息传递路径:
sources --> Sequence --> Channel <-- Subscription --> Sink
sources --> Parallel --> Channel <-- Subscription --> Sink
#Importer
◼ 连接至期望使用的第3方消息系统
◼ 基于HTTP协议POST CloudEvents到Channel、Broker、Sequence/Parallel或Service/KService
#Channel
◼ 支持多路订阅
◼ 为订阅者“持久化”消息数据
#Service
◼ 接收CloudEvents
◼ (可选)回复处理后的数据
![]()
#Sequence
◼ Kubernetes CRD资源类型
◼ 串联多个Processor
◼ 由多个有序的Step组件成,每个Step定义一个Subscriber
◼ Step间的Channel,由ChannelTemplate定义
![]()
#Parallel:根据不同的过滤条件对事件进行选择处理
◼ Kubernetes CRD资源类型
◼ 由多个条件式的并行Branch组成,每个Branch由一对Filter及Subscriber组成
◆每个Filter即为一个Processor
◼ Channel由由ChannelTemplate定义
![]()
Sequence Flow 示例
![]()
#示例环境说明
◼ Curl命令负责生成event
◼ Event由Sequence中的各Step顺次处理
◆各Step都运行一个appender应用
◆分别向收到的数据尾部附加自定义的专有数据项
◼ 最终结果发往ksvc/event-display
#准备实践环境
◼ Sequence里,三个Step中的Knative Service
◆~$ kn service apply sq-appender-01 --image ikubernetes/appender --env MESSAGE=" - Handled by SQ-01" -n event-demo
◆~$ kn service apply sq-appender-02 --image ikubernetes/appender --env MESSAGE=" - Handled by SQ-02" -n event-demo
◆~$ kn service apply sq-appender-03 --image ikubernetes/appender --env MESSAGE=" - Handled by SQ-03" -n event-demo
◼ 负责最后接收事件的KService/event-display
◆~$ kn service apply event-display --image=ikubernetes/event_display --port 8080 --scale-min 1 -n event-demo
#1.拉取镜像
[root@xianchaonode1 ~]# crictl pull ikubernetes/appender
#2.这里创建在default名称空间下 使用命令行创建Sequence
[root@xianchaomaster1 ~]# kn service apply sq-appender-01 --image ikubernetes/appender --env MESSAGE=" - Handled by SQ-01"
[root@xianchaomaster1 ~]# kn service apply sq-appender-02 --image ikubernetes/appender --env MESSAGE=" - Handled by SQ-02"
[root@xianchaomaster1 ~]# kn service apply sq-appender-03 --image ikubernetes/appender --env MESSAGE=" - Handled by SQ-03"
#或者使用Yaml创建 Sequence
[root@xianchaomaster1 sequence-demo]# cat 03-steps-appenders.yaml
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: sq-appender-01
namespace: event-demo
spec:
template:
spec:
containers:
- image: gcr.io/knative-releases/knative.dev/eventing/cmd/appender
env:
- name: MESSAGE
value: " - Handled by SQ-01"
---
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: sq-appender-02
namespace: event-demo
spec:
template:
spec:
containers:
- image: gcr.io/knative-releases/knative.dev/eventing/cmd/appender
env:
- name: MESSAGE
value: " - Handled by SQ-02"
---
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: sq-appender-03
namespace: event-demo
spec:
template:
spec:
containers:
- image: gcr.io/knative-releases/knative.dev/eventing/cmd/appender
env:
- name: MESSAGE
value: " - Handled by SQ-03"
---
#3.查看kservice 选择 event-display-001
[root@xianchaomaster1 sequence-demo]# kn service list
NAME URL LATEST AGE CONDITIONS READY REASON
demoapp http://demoapp.default.xks.com demoapp-00001 2d1h 3 OK / 3 True
event-display-001 http://event-display-001.default.xks.com event-display-001-00001 3h30m 3 OK / 3 True
event-display-002 http://event-display-002.default.xks.com event-display-002-00001 3h30m 3 OK / 3 True
sq-appender-01 http://sq-appender-01.default.xks.com sq-appender-01-00001 6m28s 3 OK / 3 True
sq-appender-02 http://sq-appender-02.default.xks.com sq-appender-02-00001 6m20s 3 OK / 3 True
sq-appender-03 http://sq-appender-03.default.xks.com sq-appender-03-00001 6m13s 3 OK / 3 True
#4.编写Sequence ,在default名称空间下 输出到 event-display-001
[root@xianchaomaster1 sequence-demo]# cat 04-sequence-demo.yaml
apiVersion: flows.knative.dev/v1
kind: Sequence
metadata:
name: sq-demo
namespace: default
spec:
channelTemplate:
apiVersion: messaging.knative.dev/v1
kind: InMemoryChannel
steps:
- ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: sq-appender-01
- ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: sq-appender-02
- ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: sq-appender-03
reply:
ref:
kind: Service
apiVersion: serving.knative.dev/v1
name: event-display-001
[root@xianchaomaster1 sequence-demo]# kubectl apply -f 04-sequence-demo.yaml
sequence.flows.knative.dev/sq-demo configured
[root@xianchaomaster1 sequence-demo]# kubectl get sequence
NAME URL AGE READY REASON
sq-demo http://sq-demo-kn-sequence-0-kn-channel.default.svc.cluster.local 102s True
#5.测试流程是否 接收到日志
kubectl run client-$RANDOM --image=ikubernetes/admin-box:v1.2 --restart=Never -it --command -- /bin/sh
curl -v "http://sq-demo-kn-sequence-0-kn-channel.default.svc.cluster.local" -X POST -H "Content-Type: application/cloudevents+json" \
-d '{"id": "say-bye", "specversion": "1.0", "type": "com.magedu.saybye", "source": "sendoff", "data": {"message":"Hello Knative Sequence Flow"}}'
#查看event-display-001-00001-deployment-68cdddddcb-hj8pg 日志是否接收到
[root@xianchaomaster1 sequence-demo]# kubectl get pods
NAME READY STATUS RESTARTS AGE
event-display-001-00001-deployment-68cdddddcb-hj8pg 2/2 Running 0 3h36m
event-display-002-00001-deployment-8769bf8bd-nfl9q 2/2 Running 0 3h36m
sq-appender-01-00001-deployment-545b8cb9d-6fs7v 2/2 Running 0 33s
sq-appender-02-00001-deployment-7647865588-p6g2f 2/2 Running 0 32s
sq-appender-03-00001-deployment-7b65766d8c-5cqv4 2/2 Running 0 31s
[root@xianchaomaster1 sequence-demo]# kubectl logs -f event-display-001-00001-deployment-68cdddddcb-hj8pg
☁️ cloudevents.Event
Context Attributes,
specversion: 1.0
type: com.magedu.saybye
source: sendoff
id: say-bye
time: 2023-07-07T06:22:39.041980497Z
datacontenttype: application/json
Data,
{
"id": 0,
"message": "Hello Knative Sequence Flow - Handled by SQ-01 - Handled by SQ-02 - Handled by SQ-03"
}
#测试第二次
kubectl run client-$RANDOM --image=ikubernetes/admin-box:v1.2 --restart=Never -it --command -- /bin/sh
curl -v "http://sq-demo-kn-sequence-0-kn-channel.default.svc.cluster.local" -X POST \
-H "Ce-Id: say-hello-flow" \
-H "Ce-Specversion: 1.0" \
-H "Ce-Type: com.magedu.flow.sayhievent" \
-H "Ce-Time: 2022-10-02T15:18:56.7181741Z" \
-H "Ce-Source: sendoff" \
-H "Content-Type: application/json" \
-d '{"message":"Hello Knative Sequence Flow-2"}'
[root@xianchaomaster1 sequence-demo]# kubectl logs -f event-display-001-00001-deployment-68cdddddcb-hj8pg
☁️ cloudevents.Event
Context Attributes,
specversion: 1.0
type: com.magedu.flow.sayhievent
source: sendoff
id: say-hello-flow
time: 2022-10-02T15:18:56.7181741Z
datacontenttype: application/json
Data,
{
"id": 0,
"message": "Hello Knative Sequence Flow-2 - Handled by SQ-01 - Handled by SQ-02 - Handled by SQ-03"
}