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的Subscription

curl 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/imc01  
root@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  issue
root@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"
  }

相关