Knative - Flow - Parallel 【十二】

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"
  }

 

posted @ 2023-07-07 15:00  しみずよしだ  阅读(30)  评论(0)    收藏  举报