Parallel Flow 示例
![]()
#示例环境说明
◼ Curl命令负责生成event
◼ Parallel中有两个Branch
◆使用kservice/image-filter作为Filter,筛选类型为“com.magedu.file.image”的事件,相应的Subscriber为ksvc/para-appender-image,负责将该类事件信息标识为Image;
◆使用kservice/text-filter作为Filter, 筛选类型为“com.magedu.file.image”的事件,相应的Subscriber为ksvc/para-appender-text ,负责将该类事件信息标识为Text;
◼ 所有分支的最终结果均发往ksvc/event-display,内容格式化Cloud Event存储入日志
![]()
#准备实践环境
◼ 两个Filter
◆kn service apply image-filter --image villardl/filter-nodejs:0.1 --env FILTER='event.type == "com.magedu.file.image"' -n eventdemo
◆kn service apply text-filter --image villardl/filter-nodejs:0.1 --env FILTER='event.type == "com.magedu.file.text"' -n event-demo
◼ 两个Subscriber
◆kn service apply para-appender-image --image ikubernetes/appender --env MESSAGE=" - filetype/Image" -n event-demo
◆kn service apply para-appender-text --image ikubernetes/appender --env MESSAGE=" - filetype/Text" -n event-demo
◼ 负责最后接收事件的KService/event-display
◆~$ kn service apply event-display --image=ikubernetes/event_display --port 8080 --scale-min 1 -n event-demo
#Parallel资源的期望状态(spec)主要包括三个字段
◼ branches
◆每个分支由一个filter和一个subscriber组成
◆filter负责定义过滤器,将符合条件的事件发给相应的subscriber
◆subscriber负责定义processor,将filter过滤的事件做相应处理
◆结果发往reply或全局的reply
◼ channelTemplate
◆指定要使用的Channel CRD
◆未指定时,将使用当前namespace或者Cluster中默认的Channel CRD
◼ reply
◆为所有branch处理后的信息定义一个全局目的地
#创建并查看Parallel资源
◼ ~$ kubectl get parallels -n event-demo
#1.下载镜像
[root@xianchaonode1 ~]# crictl pull villardl/filter-nodejs:0.1
#2.创建2个filter
#【命令行创建】
kn service create image-filter --image villardl/filter-nodejs:0.1 --env FILTER='event.type == "com.magedu.file.image"' --scale-min=1
kn service create text-filter --image villardl/filter-nodejs:0.1 --env FILTER='event.type == "com.magedu.file.text"' --scale-min=1
#或者【yaml文件创建】
[root@xianchaomaster1 parallel-demo]# cat 03-filters.yaml
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: image-filter
namespace: event-demo
spec:
template:
spec:
containers:
- image: villardl/filter-nodejs:0.1
env:
- name: FILTER
value: |
event.type == "com.magedu.file.image"
---
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: text-filter
namespace: event-demo
spec:
template:
spec:
containers:
- image: villardl/filter-nodejs:0.1
env:
- name: FILTER
value: |
event.type == "com.magedu.file.text"
---
[root@xianchaomaster1 sequence-demo]# kn service list | grep filter
image-filter http://image-filter.default.xks.com image-filter-00001 36s 3 OK / 3 True
text-filter http://text-filter.default.xks.com text-filter-00001 30s 3 OK / 3 True
#3.创建2个Subscriber
[root@xianchaonode1 ~]# crictl pull ikubernetes/appender
#【命令行创建】
kn service create para-appender-image --image ikubernetes/appender --env MESSAGE=" - filetype/Image" --scale-min=1
kn service create para-appender-text --image ikubernetes/appender --env MESSAGE=" - filetype/Text" --scale-min=1
#或者【yaml文件创建】
[root@xianchaomaster1 parallel-demo]# cat 04-subscribers.yaml
# Maintainer: MageEdu <mage@magedu.com>
# Vesion: v1.0
---
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: para-appender-image
spec:
template:
spec:
containers:
- image: ikubernetes/appender
env:
- name: MESSAGE
value: " - filetype/Image"
---
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: para-appender-text
spec:
template:
spec:
containers:
- image: ikubernetes/appender
env:
- name: MESSAGE
value: " - filetype/Text"
---
[root@xianchaomaster1 sequence-demo]# kn service list | grep appender
para-appender-image http://para-appender-image.default.xks.com para-appender-image-00001 24s 3 OK / 3 True
para-appender-text http://para-appender-text.default.xks.com para-appender-text-00001 15s 3 OK / 3 True
#4.编写Parallel
[root@xianchaomaster1 parallel-demo]# kn service list
NAME URL LATEST AGE CONDITIONS READY REASON
demoapp http://demoapp.default.xks.com demoapp-00001 2d2h 3 OK / 3 True
event-display-001 http://event-display-001.default.xks.com event-display-001-00001 4h4m 3 OK / 3 True
event-display-002 http://event-display-002.default.xks.com event-display-002-00001 4h4m 3 OK / 3 True
#default名称空间下 并且 输出到 event-display-001
[root@xianchaomaster1 parallel-demo]# cat 05-parallel.yaml
---
apiVersion: flows.knative.dev/v1
kind: Parallel
metadata:
name: filetype-parallel
namespace: default
spec:
channelTemplate:
apiVersion: messaging.knative.dev/v1
kind: InMemoryChannel
branches:
- filter:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: image-filter
subscriber:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: para-appender-image
- filter:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: text-filter
subscriber:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: para-appender-text
reply:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: event-display-001
[root@xianchaomaster1 parallel-demo]# kubectl apply -f 05-parallel.yaml
parallel.flows.knative.dev/filetype-parallel created
[root@xianchaomaster1 parallel-demo]# kubectl get parallels
NAME URL AGE READY REASON
filetype-parallel http://filetype-parallel-kn-parallel-kn-channel.default.svc.cluster.local 11s True
#测试日志 输出到 event-display-001
kubectl run client-$RANDOM --image=ikubernetes/admin-box:v1.2 --restart=Never -it --command -- /bin/sh
curl -v "http://filetype-parallel-kn-parallel-kn-channel.default.svc.cluster.local" -X POST -H "Content-Type: application/cloudevents+json" \
-d '{"id": "say-bye", "specversion": "1.0", "type": "com.magedu.file.image", "source": "sendoff", "data": {"message":"Hello Knative Parallel Flow Image"}}'
curl -v "http://filetype-parallel-kn-parallel-kn-channel.default.svc.cluster.local" -X POST -H "Content-Type: application/cloudevents+json" \
-d '{"id": "say-bye", "specversion": "1.0", "type": "com.magedu.file.text", "source": "sendoff", "data": {"message":"Hello Knative Parallel Flow Text"}}'
#查看日志
[root@xianchaomaster1 parallel-demo]# kubectl get pods
NAME READY STATUS RESTARTS AGE
event-display-001-00001-deployment-68cdddddcb-hj8pg 2/2 Running 0 4h8m
event-display-002-00001-deployment-8769bf8bd-nfl9q 2/2 Running 0 4h8m
image-filter-00001-deployment-7978c9d47d-bsgnm 2/2 Running 0 12m
para-appender-image-00001-deployment-6c54678f89-pqxhf 2/2 Running 0 9m28s
para-appender-text-00001-deployment-69d9cbcf5c-wck8x 2/2 Running 0 9m19s
text-filter-00001-deployment-854d5f79c6-8gcps 2/2 Running 0 12m
[root@xianchaomaster1 parallel-demo]# kubectl logs -f event-display-001-00001-deployment-68cdddddcb-hj8pg
☁️ cloudevents.Event
Context Attributes,
specversion: 1.0
type: com.magedu.file.image
source: sendoff
id: say-bye
time: 2023-07-07T06:55:10.032643651Z
datacontenttype: application/json
Data,
{
"id": 0,
"message": " - filetype/Image"
}
☁️ cloudevents.Event
Context Attributes,
specversion: 1.0
type: com.magedu.file.text
source: sendoff
id: say-bye
time: 2023-07-07T06:56:40.026014968Z
datacontenttype: application/json
Data,
{
"id": 0,
"message": " - filetype/Text"
}