GitLab-Source-2
1,事件简单测试
root@master03:~# kubectl get route -nevent-demo NAME URL READY REASON event-display http://event-display.event-demo.example.com True gitlabsource-demo-p8wf4 http://gitlabsource-demo-p8wf4.event-demo.example.com True
webhook--测试-push-event
root@master03:~# kubectl logs -f event-display-00001-deployment-57fc7d44f5-98mpw -c user-container -nevent-demo
Extensions,
comgitlabevent: Push Hook
Data,
{
"object_kind": "push",
kubectl run client777 --image=ikubernetes/admin-box:latest -it --rm --restart=Never --command -- /bin/bash
root@client777 /# apk add git
root@client777 /# git clone http://code.gitlab.svc.cluster.local/root/myproject.git
root@client777 myproject# git config --global user.name MageEdu
root@client777 myproject# git config --global user.email mage@magedu.com
root@client777 myproject# vi README.md
root@client777 myproject# git add .
root@client777 myproject# git commit -m "V0.0.1"
[main f16bb1b] V0.0.1
1 file changed, 1 insertion(+), 1 deletion(-)
root@client777 myproject# git push origin
Username for 'http://code.gitlab.svc.cluster.local': root
Password for 'http://root@code.gitlab.svc.cluster.local': #magedu.com
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 248 bytes | 248.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To http://code.gitlab.svc.cluster.local/root/myproject.git
606224e..f16bb1b main -> main
生成事件
root@master03:~# kubectl logs -f event-display-00001-deployment-57fc7d44f5-98mpw -c user-container -nevent-demo
"name": "MageEdu",
"email": "mage@magedu.com"
2,pub/sub
消息队列类型 ? Point-to-Point模型:一对一的消息分发; ? Pub/Sub模型:一对多的消息分发,消息会通过Topic发给多个消费者; Point-to-Point Channel ? 需要确保只有一个Receiver使用任何给定的消息 ? 可以有多个Receiver监听于同一个列表,但仅有一个能够接收某个特定的消息; ◆若多个Receiver尝试消息同一个消息,Channel需要确保仅有一个能成功 ◆各Receiver之间无须互相协调 ?关于Channel ? Eventing中的Channel CRD负责定义名称空间级别的消息总线 ? 它的后端要基于特定的实现,如In-Memory Channel(简称imc)、NATS Channel或Kafka Channel等 ? 每个Channel应该对应于一个特定Topic ? 通常,Channels and Subscriptions消息投递模式中才需要自行创建Channel ◆Sources to Sink模式不需要Channel ◆Brokers and Triggers无须自行配置Channel ?关于Subscription ? Eventing中的Subscription CRD负责将Sink(例如Service或KService)连接至一个Channel之上; ? 何时需要自行创建Subscription ◆Sources to Sink模式不需要Subscription,因为没有Channel可以订阅 ◆Channels and Subscriptions消息投递模式,需要创建订阅至Channel的Subscription ◆Brokers and Triggers消息投递模式,需要创建订阅至Trigger的Subscriptioncurl Source > Channels > Subscriptions > sink
?示例环境说明 ? 基于imc的channel/imc01作为消息总线 ? kservice/event-display订阅channel/imc01 ? curl命令作为event source,基于HTTP协议推送消息至channel/imc01 ?命令式命令 ① Channel ◆创建:~$ kn channel create imc01 --type messaging.knative.dev:v1:InMemoryChannel ? 该类型标识存在一个内置的别名“imc”,因而上面的类型也可简单地指定为该别名 ◆列出channel/imc01以获取其URL:~$ kn channel list imc01 ? URL的样式:http://imc01-kn-channel.default.svc.cluster.local ② Sink: kservice/event-display ◆若不存在,需要先创建:~$ kn service create event-display --image ikubernetes/event_display --port 8080 --scale-min 1 ③ Subscription ◆创建: ~$ kn subscription create sub01 --channel imc01 --sink ksvc:event-display ? subscription/sub01负责连接kservice/event-display至channel/imc01root@master03:~# kubectl get cm -nknative-eventing NAME DATA AGE config-br-default-channel 1 46h config-br-defaults 1 46h config-features 6 46h config-imc-event-dispatcher 2 46h config-kreference-mapping 1 46h config-leader-election 1 46h config-logging 3 46h config-observability 1 46h config-ping-defaults 1 46h config-tracing 1 46h default-ch-webhook 1 46h istio-ca-root-cert 1 46h kube-root-ca.crt 1 46h root@master03:~# kubectl get cm config-br-default-channel -o yaml -nknative-eventing apiVersion: v1 data: channel-template-spec: | apiVersion: messaging.knative.dev/v1 kind: InMemoryChannel
root@master03:~# kubectl get cm config-br-defaults -o yaml -nknative-eventing apiVersion: v1 data: default-br-config: | clusterDefault: brokerClass: MTChannelBasedBroker
root@master03:~# kn channel create --help
root@master03:~# kn channel create imc01 --type messaging.knative.dev:v1:InMemoryChannel
root@master03:~# kn channel list NAME TYPE URL AGE READY REASON imc01 InMemoryChannel http://imc01-kn-channel.default.svc.cluster.local 19s True
root@master03:~# kn subscription create --help
root@master03:~# kn subscription create sub01 --channel imc01 --sink ksvc:event-display #:event-demo 名称空间 Subscription 'sub01' created in namespace 'default'.
测试
同一名称空间
root@master01:/opt/knative-in-practise/eventing/sources/05-gitlabsource-to-knative-service# cat 02-kservice-event-display.yaml --- apiVersion: serving.knative.dev/v1 kind: Service metadata: name: event-display # namespace: event-demo spec: template: metadata: annotations: autoscaling.knative.dev/min-scale: "1" spec: containers: - image: ikubernetes/event_display ports: - containerPort: 8080 root@master01:/opt/knative-in-practise/eventing/sources/05-gitlabsource-to-knative-service# cat 03-secret-token.yaml apiVersion: v1 kind: Secret metadata: name: gitlabsecret # namespace: event-demo type: Opaque stringData: accessToken: 2yeDGpCLDW4_1Sp4taA8 secretToken: JQ1ambOFdXGZPFWsOov0iQ root@master01:/opt/knative-in-practise/eventing/sources/05-gitlabsource-to-knative-service# cat 04-GitLabSource-to-knative-service.yaml apiVersion: sources.knative.dev/v1alpha1 kind: GitLabSource metadata: name: gitlabsource-demo # namespace: event-demo spec: eventTypes: - push_events - issues_events - merge_requests_events - tag_push_events projectUrl: http://code.gitlab.svc.cluster.local/root/myproject sslverify: false accessToken: secretKeyRef: name: gitlabsecret key: accessToken secretToken: secretKeyRef: name: gitlabsecret key: secretToken sink: ref: apiVersion: serving.knative.dev/v1 kind: Service name: event-display
root@master03:~# kn channel list NAME TYPE URL AGE READY REASON imc01 InMemoryChannel http://imc01-kn-channel.default.svc.cluster.local 6m15s True
curl -v "http://imc01-kn-channel.default.svc.cluster.local" \ -X POST \ -H "Ce-Id: 0001" \ -H "Ce-Specversion: 1.0" \ -H "Ce-Type: com.magedu.file.image" \ -H "Ce-Source: Curl" \ -H "Content-Type: application/json" \ -d '{"msg":"An Event to ImcChnel"}'
root@master03:~# kubectl logs -f event-display-00001-deployment-5789f8f444-58sbv -c user-container ?? cloudevents.Event Context Attributes, specversion: 1.0 type: com.magedu.file.image source: Curl id: 1111 datacontenttype: application/json Data, { "msg": "An Event to ImcChnel" }
kn subscription create sub02 --channel imc01 --sink ksvc:event-display-02
一对多
root@master03:~# kubectl logs -f event-display-02-00001-deployment-6cb5c7d848-xqtbb -c user-container ?? cloudevents.Event Context Attributes, specversion: 1.0 type: com.magedu.file.image source: Curl id: 1111 datacontenttype: application/json Data, { "msg": "An Event to ImcChnel" }
删除
root@master01:/opt/knative-in-practise/eventing/sources/05-gitlabsource-to-knative-service# kn subscription list NAME CHANNEL SUBSCRIBER REPLY DEAD LETTER SINK READY REASON sub01 Channel:imc01 ksvc:event-display True sub02 Channel:imc01 ksvc:event-display-02 True root@master01:/opt/knative-in-practise/eventing/sources/05-gitlabsource-to-knative-service# kn subscription delete sub01 Subscription 'sub01' deleted in namespace 'default'. root@master01:/opt/knative-in-practise/eventing/sources/05-gitlabsource-to-knative-service# kn subscription delete sub02 Subscription 'sub02' deleted in namespace 'default'. root@master01:/opt/knative-in-practise/eventing/sources/05-gitlabsource-to-knative-service# kn channel list NAME TYPE URL AGE READY REASON imc01 InMemoryChannel http://imc01-kn-channel.default.svc.cluster.local 44m True root@master01:/opt/knative-in-practise/eventing/sources/05-gitlabsource-to-knative-service# kn channel delete imc01 Channel 'imc01' deleted in namespace 'default'.
3,GitLabSource ,Channel
root@master01:~# kubectl get channel NAME URL AGE READY REASON channel.messaging.knative.dev/imc01 http://imc01-kn-channel.default.svc.cluster.local 7m32s True NAME URL AGE READY REASON inmemorychannel.messaging.knative.dev/imc01 http://imc01-kn-channel.default.svc.cluster.local 7m32s True
root@master01:~# kubectl explain InMemoryChannel
KIND: InMemoryChannel
VERSION: messaging.knative.dev/v1 #fuzhi
root@master02:/opt/knative-in-practise/eventing/sources/05-gitlabsource-to-knative-service# cat 04-GitLabSource-to-knative-service.yaml apiVersion: sources.knative.dev/v1alpha1 kind: GitLabSource metadata: name: gitlabsource-demo-02 #xiugai # namespace: event-demo spec: eventTypes: - push_events - issues_events - merge_requests_events - tag_push_events projectUrl: http://code.gitlab.svc.cluster.local/root/myproject sslverify: false accessToken: secretKeyRef: name: gitlabsecret key: accessToken secretToken: secretKeyRef: name: gitlabsecret key: secretToken sink: ref: apiVersion: messaging.knative.dev/v1 #serving.knative.dev/v1 kind: InMemoryChannel #Service name: imc01 #event-display namespace: default #event-demo
root@master02:/opt/knative-in-practise/eventing/sources/05-gitlabsource-to-knative-service# kubectl get GitLabSource NAME READY REASON SINK AGE gitlabsource-demo-02 True http://imc01-kn-channel.default.svc.cluster.local 3m
http://gitlabsource-demo-02-87mzp.default. svc.cluster.local
logs 1 ?? cloudevents.Event Context Attributes, specversion: 1.0 type: dev.knative.sources.gitlab.push source: http://code.gitlab.svc.cluster.local/root/myproject id: 0036816d-c03f-40f7-9e3b-4eacba52acaa time: 2022-03-09T15:49:29.012466742Z datacontenttype: application/json Extensions, comgitlabevent: Push Hook logs 2 ?? cloudevents.Event Context Attributes, specversion: 1.0 type: dev.knative.sources.gitlab.push source: http://code.gitlab.svc.cluster.local/root/myproject id: 0036816d-c03f-40f7-9e3b-4eacba52acaa time: 2022-03-09T15:49:29.012466742Z datacontenttype: application/json Extensions, comgitlabevent: Push Hook
4, Knative的Broker/Trigger 消息传递框架
?Broker ? Knative Eventing提供的CRD,负责收集CloudEvents类型的事件 ? Broker对象会提供一个用于事件传入的入口端点,各生产者可以调用该入口将事件发往Broker ? 将事件投递至目的地的任务则由Trigger资源负责 ? Trigger基于属性过滤事件,并将筛选出的的事件投递给订阅该Trigger的Subscriber ? Subscriber还可生成响应事件,并将这些新生成的事件传入Broker 类型 ?Knative Eventing支持以下几种类型的Broker ? 基于Channel的多租户Broker (Multi-tenant channel-based broker,简称为MT-Channel-based Broker) ◆基于Channel进行事件路由 ◆需要部署至少一种Channel的实现 ? InMemoryChannel:可用于开发和测试目的,但不为生产环境提供适当的事件交付保证 ? KafkaChannel:提供生产环境所需的事件交付保证 ? 其它的可用的Broker类型 ◆Apache Kafka Broker ◆RabbitMQ Broker ◆GCP Broker 使用默认的Broker ?Knative Serving在名称空间级别提供了一个名为default的默认Broker,但使用前需要通过某种方式先行完成创建 ?创建默认Broker的方法 ? 命令式命令,或使用配置文件 ◆kn broker create default --namespace NS_NAME ? 在Trigger资源上使用特定的Annotation自动创建 ◆eventing.knative.dev/injection=enabled ? 在名称空间上添加特定的Label自动创建 ◆eventing.knative.dev/injection=enabled ?删除默认的Broker ? 第一种方法创建的默认Broker可直接进行删除 ? 后面两种是通过Injection的方式进行的资源创建,这类资源需要由管理员手动才能完成删除 push issueroot@master01:~# kn broker create default Broker 'default' successfully created in namespace 'default'. root@master01:~# kn broker list NAME URL 名称空间/名字 AGE CONDITIONS READY REASON default http://broker-ingress.knative-eventing.svc.cluster.local/default/default 3s 6 OK / 6 True
root@master01:~# kubectl explain broker
KIND: Broker
VERSION: eventing.knative.dev/v1
root@master02:/tmp# cat 04-GitLabSource-to-knative-service.yaml apiVersion: sources.knative.dev/v1alpha1 kind: GitLabSource metadata: name: gitlabsource-demo-broker #xiugai # namespace: event-demo spec: eventTypes: - push_events - issues_events - merge_requests_events - tag_push_events projectUrl: http://code.gitlab.svc.cluster.local/root/myproject sslverify: false accessToken: secretKeyRef: name: gitlabsecret key: accessToken secretToken: secretKeyRef: name: gitlabsecret key: secretToken sink: ref: apiVersion: eventing.knative.dev/v1 #xiugai kind: Broker name: default
root@master02:/tmp# kubectl get GitLabSource NAME READY REASON SINK AGE gitlabsource-demo-broker True http://broker-ingress.knative-eventing.svc.cluster.local/default/default 62s
trigger部署
root@master02:/tmp# kn trigger create push --broker default --filter type=dev.knative.sources.gitlab.push --sink ksvc:event-display Trigger 'push' successfully created in namespace 'default'. root@master02:/tmp# kn trigger create issue --broker default --filter type=dev.knative.sources.gitlab.issue --sink ksvc:event-display-02 Trigger 'issue' successfully created in namespace 'default'.
root@master02:/tmp# kn trigger list NAME BROKER SINK AGE CONDITIONS READY REASON issue default ksvc:event-display-02 108s 6 OK / 6 True push default ksvc:event-display 2m27s 6 OK / 6 True
http://gitlabsource-demo-broker-b78cr.default.svc.cluster.local
root@master03:~# kubectl logs -f event-display-00001-deployment-666648b745-mmnkp -c user-container ?? cloudevents.Event Context Attributes, specversion: 1.0 type: dev.knative.sources.gitlab.push
root@master03:~# kubectl logs -f event-display-02-00001-deployment-6cb5c7d848-xrcr6 -c user-container ?? cloudevents.Event Context Attributes, specversion: 1.0 type: dev.knative.sources.gitlab.issue
5,Flow
5.1 Sequence
root@master03:~# kubectl create ns flow namespace/flow created
root@master03:~# kn service apply sq-appender-01 --image ikubernetes/appender --env MESSAGE=" - Handled by SQ-01" -nflow root@master03:~# kn service apply sq-appender-02 --image ikubernetes/appender --env MESSAGE=" - Handled by SQ-02" -nflow root@master03:~# kn service apply sq-appender-03 --image ikubernetes/appender --env MESSAGE=" - Handled by SQ-03" -nflow
root@master02:/opt/knative-in-practise/eventing/sources/05-gitlabsource-to-knative-service# cat 02-kservice-event-display.yaml --- apiVersion: serving.knative.dev/v1 kind: Service metadata: name: event-display namespace: flow #event-demo spec: template: metadata: annotations: autoscaling.knative.dev/min-scale: "1" spec: containers: - image: ikubernetes/event_display ports: - containerPort: 8080
root@master01:~# kn service list -nflow NAME URL LATEST AGE CONDITIONS READY REASON event-display http://event-display.flow.example.com event-display-00001 40s 3 OK / 3 True sq-appender-01 http://sq-appender-01.flow.example.com sq-appender-01-00001 3m39s 3 OK / 3 True sq-appender-02 http://sq-appender-02.flow.example.com sq-appender-02-00001 2m43s 3 OK / 3 True sq-appender-03 http://sq-appender-03.flow.example.com sq-appender-03-00001 2m11s 3 OK / 3 True
root@master02:/opt/knative-in-practise/eventing/flow/sequence-demo# cat 04-sequence-demo.yaml apiVersion: flows.knative.dev/v1 kind: Sequence metadata: name: sq-demo namespace: flow #event-demo 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
root@master02:/opt/knative-in-practise/eventing/flow/sequence-demo# kubectl get Sequence -A NAMESPACE NAME URL AGE READY REASON flow sq-demo http://sq-demo-kn-sequence-0-kn-channel.flow.svc.cluster.local 14s True
root@client777 ~# curl -v "http://sq-demo-kn-sequence-0-kn-channel.flow.svc.cluster.local" -X POST -H "Content-Type: application/cloudevents+json" -d '{"id": "0", "specversion": "1.0", "type": "com.magedu.sayhi", "source": "Curl", "data": {"message":"Hello Knative Eventing Flow"}}'
root@master03:~# kubectl logs -f event-display-00001-deployment-f8d595c65-qrscr -nflow -c user-container ?? cloudevents.Event Context Attributes, specversion: 1.0 type: com.magedu.sayhi source: Curl id: 0 time: 2022-03-09 datacontenttype: application/json Data, { "id": 0, "message": "Hello Knative Eventing Flow - Handled by SQ-01 - Handled by SQ-02 - Handled by SQ-03" }
5.2 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"' --scale-min 1 -npara ◆kn service apply text-filter --image villardl/filter-nodejs:0.1 --env FILTER='event.type == "com.magedu.file.text"' --scale-min 1 -npara ? 两个Subscriber ◆kn service apply para-appender-image --image ikubernetes/appender --env MESSAGE=" - filetype/Image" --scale-min 1 -npara ◆kn service apply para-appender-text --image ikubernetes/appender --env MESSAGE=" - filetype/Text" --scale-min 1 -npara ? 负责最后接收事件的KService/event-display ◆~$ kn service apply event-display --image=ikubernetes/event_display --port 8080 --scale-min 1 -npara ?Parallel资源的期望状态(spec)主要包括三个字段 ? branches ◆每个分支由一个filter和一个subscriber组成 ◆filter负责定义过滤器,将符合条件的事件发给相应的subscriber ◆subscriber负责定义processor,将filter过滤的事件做相应处理 ◆结果发往reply或全局的reply ? channelTemplate ◆指定要使用的Channel CRD ◆未指定时,将使用当前namespace或者Cluster中默认的Channel CRD ? reply ◆为所有branch处理后的信息定义一个全局目的地root@master02:/opt/knative-in-practise/eventing/flow/parallel-demo# cat 05-parallel.yaml --- apiVersion: flows.knative.dev/v1 kind: Parallel metadata: name: filetype-parallel namespace: para #event-demo 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?创建并查看Parallel资源
root@master01:/opt/knative-in-practise/eventing/flow/parallel-demo# kubectl get parallels -npara NAME URL AGE READY REASON filetype-parallel http://filetype-parallel-kn-parallel-kn-channel.para.svc.cluster.local 3m51s True
curl -v "http://filetype-parallel-kn-parallel-kn-channel.para.svc.cluster.local" \ -X POST \ -H "Ce-Id: 00001" \ -H "Ce-Specversion: 1.0" \ -H "Ce-Type: com.magedu.file.image" \ -H "Ce-Source: Curl" \ -H "Content-Type: application/json" \ -d '{"message": "A event to parallel"}'
curl -v "http://filetype-parallel-kn-parallel-kn-channel.para.svc.cluster.local" \ -X POST \ -H "Ce-Id: 00002" \ # -H "Ce-Specversion: 1.0" \ -H "Ce-Type: com.magedu.file.text" \ # -H "Ce-Source: Curl" \ -H "Content-Type: application/json" \ -d '{"message": "A event to parallel"}'
root@master01:~# kubectl logs -f event-display-00001-deployment-77f856bd76-6cfph -cuser-container -npara ?? cloudevents.Event Context Attributes, specversion: 1.0 type: com.magedu.file.image source: Curl id: 00001 time: 2022 datacontenttype: application/json Data, { "id": 0, "message": "A event to parallel - filetype/Image" }
?? cloudevents.Event Context Attributes, specversion: 1.0 type: com.magedu.file.text source: Curl id: 00002 time: datacontenttype: application/json Data, { "id": 0, "message": "A event to parallel - filetype/Text" }