Knative - Event Sources 和 Sinks 【八】

 Source to Sink 消息模式实践

#pingsource:周期性地生成事件
#containersource:由容器生成事件
#apiserversource:由Kubernetes集群上的某个组件的状态变动生成事件
#Gitlab Sources:GitLab触发事件

示例1:PingSource → Kubernetes Service Sink

#创建K8S 服务对象Pod
[root@xianchaomaster1 01-pingsource-to-kubernetes-service]# cat event-display.yaml
kind: Namespace
apiVersion: v1
metadata:
  name: event-demo
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: event-display
  namespace: event-demo
spec:
  replicas: 1
  selector:
    matchLabels: &labels
      app: event-display
  template:
    metadata:
      labels: *labels
    spec:
      containers:
        - name: event-display
          #image: gcr.io/knative-releases/knative.dev/eventing/cmd/event_display
          image: ikubernetes/event_display
---
kind: Service
apiVersion: v1
metadata:
  name: event-display
  namespace: event-demo
spec:
  selector:
    app: event-display
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

#使用PingSource 引用 K8S的Service event-display    
[root@xianchaomaster1 01-pingsource-to-kubernetes-service]# cat pingsource-to-event-display.yaml
apiVersion: sources.knative.dev/v1
kind: PingSource
metadata:
  name: ping-00001
  namespace: event-demo
spec:
  schedule: "* * * * *"
  contentType: "application/json"
  data: '{"message": "Hello Eventing!"}'
  sink:
    ref:
      apiVersion: v1
      kind: Service
      name: event-display

示例2:PingSource → Knative Service Sink

#创建Namespace
[root@xianchaomaster1 02-pingsource-to-knative-service]# cat 01-namespace.yaml
kind: Namespace
apiVersion: v1
metadata:
  name: event-demo
---
#创建 kservice-event-display
[root@xianchaomaster1 02-pingsource-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:
    spec:
      containers:
        - image: ikubernetes/event_display
          ports:
            - containerPort: 8080
#创建PingSource 引用kservice-event-display
[root@xianchaomaster1 02-pingsource-to-knative-service]# cat 03-pingsource-to-event-display.yaml
---
apiVersion: sources.knative.dev/v1
kind: PingSource
metadata:
  name: pingsource-00001
  namespace: event-demo
spec:
  schedule: "* * * * *"
  contentType: "application/json"
  data: '{"message": "Hello Eventing!"}'
  sink:
    ref:
      apiVersion: serving.knative.dev/v1
      kind: Service
      name: event-display
      
[root@xianchaomaster1 02-pingsource-to-knative-service]# kubectl apply -f ./
namespace/event-demo created
service.serving.knative.dev/event-display created
pingsource.sources.knative.dev/pingsource-00001 created

#查看sources资源
[root@xianchaomaster1 02-pingsource-to-knative-service]# kubectl get sources -n event-demo
NAME                                              SINK                                                SCHEDULE    AGE   READY   REASON
pingsource.sources.knative.dev/pingsource-00001   http://event-display.event-demo.svc.cluster.local   * * * * *   16s   True


#查看日志 每分钟就会进行发现消息 周期性
[root@xianchaomaster1 ~]# kubectl logs -f event-display-00001-deployment-574fdf5575-9p2dx -n event-demo
Defaulted container "user-container" out of: user-container, queue-proxy
☁️  cloudevents.Event
Context Attributes,
  specversion: 1.0
  type: dev.knative.sources.ping
  source: /apis/v1/namespaces/event-demo/pingsources/pingsource-00001
  id: e6a3f14c-5219-40d4-bb78-e01068629ce0
  time: 2023-07-06T14:24:00.061788986Z
  datacontenttype: application/json
Data,
  {
    "message": "Hello Eventing!"
  }
☁️  cloudevents.Event
Context Attributes,
  specversion: 1.0
  type: dev.knative.sources.ping
  source: /apis/v1/namespaces/event-demo/pingsources/pingsource-00001
  id: 7ce79b6f-be40-42ae-b901-8e5915a02358
  time: 2023-07-06T14:25:00.08279535Z
  datacontenttype: application/json
Data,
  {
    "message": "Hello Eventing!"
  }
☁️  cloudevents.Event
Context Attributes,
  specversion: 1.0
  type: dev.knative.sources.ping
  source: /apis/v1/namespaces/event-demo/pingsources/pingsource-00001
  id: 6b78481b-27e9-4578-a3a6-7c107e5f7fe1
  time: 2023-07-06T14:26:00.319737647Z
  datacontenttype: application/json
Data,
  {
    "message": "Hello Eventing!"
  }

示例3:ContainerSource → Knative Service Sink(在容器内基于容器不停生成事件)

这个是程序内部生成的事情

[root@xianchaomaster1 03-containersource-to-knative-service]# cat 01-namespace.yaml
kind: Namespace
apiVersion: v1
metadata:
  name: event-demo
---
[root@xianchaomaster1 03-containersource-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:
    spec:
      containers:
        - image: ikubernetes/event_display
          ports:
            - containerPort: 8080
[root@xianchaomaster1 03-containersource-to-knative-service]# cat 03-containersource-to-event-display.yaml
apiVersion: sources.knative.dev/v1
kind: ContainerSource
metadata:
  name: containersource-heartbeat
  namespace: event-demo
spec:
  template:
    spec:
      containers:
        - image: ikubernetes/containersource-heartbeats:latest
          name: heartbeats
          env:
          - name: POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
  sink:
    ref:
      apiVersion: serving.knative.dev/v1
      kind: Service
      name: event-display
      
[root@xianchaomaster1 03-containersource-to-knative-service]# kubectl apply -f ./
namespace/event-demo unchanged
service.serving.knative.dev/event-display configured
containersource.sources.knative.dev/containersource-heartbeat created

#查看sources资源  containersource 
[root@xianchaomaster1 03-containersource-to-knative-service]# kubectl get sources -n event-demo
NAME                                                            SINK                                                AGE   READY   REASON
containersource.sources.knative.dev/containersource-heartbeat   http://event-display.event-demo.svc.cluster.local   24s   True

NAME                                                                    SINK                                                AGE   READY   REASON
sinkbinding.sources.knative.dev/containersource-heartbeat-sinkbinding   http://event-display.event-demo.svc.cluster.local   24s   True

NAME                                              SINK                                                SCHEDULE    AGE   READY   REASON
pingsource.sources.knative.dev/pingsource-00001   http://event-display.event-demo.svc.cluster.local   * * * * *   13m   True


#查看日志 
☁️  cloudevents.Event
Context Attributes,
  specversion: 1.0
  type: dev.knative.eventing.samples.heartbeat
  source: https://knative.dev/eventing-contrib/cmd/heartbeats/#event-demo/containersource-heartbeat-deployment-5fffb9b77f-4lj9t
  id: e3bbc5dd-1e90-4ab4-8e4d-e38e6147818a
  time: 2023-07-06T14:38:08.193145398Z
  datacontenttype: application/json
Extensions,
  beats: true
  heart: yes
  the: 42
Data,
  {
    "id": 13,
    "label": ""
  }
☁️  cloudevents.Event
Context Attributes,
  specversion: 1.0
  type: dev.knative.eventing.samples.heartbeat
  source: https://knative.dev/eventing-contrib/cmd/heartbeats/#event-demo/containersource-heartbeat-deployment-5fffb9b77f-4lj9t
  id: 4e0977d8-9736-4027-adf5-effebf30f14a
  time: 2023-07-06T14:38:13.193080869Z
  datacontenttype: application/json
Extensions,
  beats: true
  heart: yes
  the: 42
Data,
  {
    "id": 14,
    "label": ""
  }
☁️  cloudevents.Event
Context Attributes,
  specversion: 1.0
  type: dev.knative.eventing.samples.heartbeat
  source: https://knative.dev/eventing-contrib/cmd/heartbeats/#event-demo/containersource-heartbeat-deployment-5fffb9b77f-4lj9t
  id: 781bdef7-1755-4d3d-a1fd-3df2aecde8cf
  time: 2023-07-06T14:38:18.19505355Z
  datacontenttype: application/json
Extensions,
  beats: true
  heart: yes
  the: 42
Data,
  {
    "id": 15,
    "label": ""
  }
☁️  cloudevents.Event
Context Attributes,
  specversion: 1.0
  type: dev.knative.eventing.samples.heartbeat
  source: https://knative.dev/eventing-contrib/cmd/heartbeats/#event-demo/containersource-heartbeat-deployment-5fffb9b77f-4lj9t
  id: 4fe98263-abf6-480c-b2cd-7d7732c8122d
  time: 2023-07-06T14:38:23.195027776Z
  datacontenttype: application/json
Extensions,
  beats: true
  heart: yes
  the: 42
Data,
  {
    "id": 16,
    "label": ""
  }
  
  
#删除所有sources
[root@xianchaomaster1 03-containersource-to-knative-service]# kn sources list -n event-demo
NAME                                    TYPE              RESOURCE                               SINK                 READY
containersource-heartbeat               ContainerSource   containersources.sources.knative.dev   ksvc:event-display   True
containersource-heartbeat-sinkbinding   SinkBinding       sinkbindings.sources.knative.dev       ksvc:event-display   True
pingsource-00001                        PingSource        pingsources.sources.knative.dev        ksvc:event-display   True

[root@xianchaomaster1 03-containersource-to-knative-service]# kn sources ping list -n event-demo
NAME               SCHEDULE    SINK                 AGE   CONDITIONS   READY   REASON
pingsource-00001   * * * * *   ksvc:event-display   19m   3 OK / 3     True
#删除 ping sources
[root@xianchaomaster1 03-containersource-to-knative-service]# kn sources ping delete pingsource-00001 -n event-demo
Ping source 'pingsource-00001' deleted in namespace 'event-demo'.

[root@xianchaomaster1 03-containersource-to-knative-service]# kn sources container list -n event-demo
NAME                        IMAGE                                           SINK                 AGE     CONDITIONS   READY   REASON
containersource-heartbeat   ikubernetes/containersource-heartbeats:latest   ksvc:event-display   6m49s   3 OK / 3     True
#删除 container sources
[root@xianchaomaster1 03-containersource-to-knative-service]# kn sources container delete containersource-heartbeat -n event-demo
ContainerSourcd 'containersource-heartbeat' deleted in namespace 'event-demo'.

[root@xianchaomaster1 03-containersource-to-knative-service]# kn sources list -n event-demo
No sources found.

示例4:ApiServerSource → Knative Service Sink 

#先要下载镜像
[root@xianchaonode1 ~]# crictl pull gcr.lank8s.cn/knative-releases/knative.dev/eventing/cmd/apiserver_receive_adapter@sha256:2fec45eae16a21b49086f0df62860dac0e20e999b0a1f5f8617438afd0252555

[root@xianchaomaster1 04-apiserversource-to-knative-service]# cat 01-namespace.yaml
kind: Namespace
apiVersion: v1
metadata:
  name: event-demo
---
[root@xianchaomaster1 04-apiserversource-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@xianchaomaster1 04-apiserversource-to-knative-service]# cat 03-serviceaccount-and-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: pod-watcher
  namespace: event-demo
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-reader
  namespace: event-demo
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: pod-reader
  namespace: event-demo
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: pod-reader
subjects:
- kind: ServiceAccount
  name: pod-watcher
  namespace: event-demo
  
#创建一个ApiServerSource:pod-watch 读取event-demo名称空间下的某些POD事件,指明特性的SA:pod-watch 来运行它只有特定的权限才有读事件的
#读取 apiVersion:v1 下 类型:Pod的事件
#并且没有指明特定哪个pod 就是 event-demo名称空间下 所有Pod事件发送给Kservice:event-display
#所有新增、删除 都会进行发生事件 发送到指定Kservice上
[root@xianchaomaster1 04-apiserversource-to-knative-service]# cat 04-ApiServerSource-to-knative-service.yaml
apiVersion: sources.knative.dev/v1
kind: ApiServerSource
metadata:
  name: pods-event
  namespace: event-demo
spec:
  serviceAccountName: pod-watcher
  mode: Reference
  resources:
  - apiVersion: v1
    kind: Pod
    #selector:
    #  matchLabels:
    #    app: demoapp
  sink:
    ref:
      apiVersion: serving.knative.dev/v1
      kind: Service
      name: event-display
      
 [root@xianchaomaster1 04-apiserversource-to-knative-service]# kubectl apply -f ./
namespace/event-demo unchanged
service.serving.knative.dev/event-display configured
serviceaccount/pod-watcher created
role.rbac.authorization.k8s.io/pod-reader created
rolebinding.rbac.authorization.k8s.io/pod-reader created
apiserversource.sources.knative.dev/pods-event created

[root@xianchaomaster1 04-apiserversource-to-knative-service]# kn sources list -n event-demo
NAME         TYPE              RESOURCE                               SINK                 READY
pods-event   ApiServerSource   apiserversources.sources.knative.dev   ksvc:event-display   False

#查看是否启动 
[root@xianchaomaster1 04-apiserversource-to-knative-service]# kubectl get pods -n event-demo
NAME                                                              READY   STATUS    RESTARTS   AGE
apiserversource-pods-event-338f8c33-ff9c-4d47-9900-67023367wmsg   1/1     Running   0          4m53s
event-display-00002-deployment-7bf9847747-pg8sf                   2/2     Running   0          4m39s

#查看日志 日志中接受到了 event-demo 名称空间下 所有Pod的事件信息
[root@xianchaomaster1 ~]# kubectl logs -f event-display-00002-deployment-7bf9847747-pg8sf -n event-demo
Defaulted container "user-container" out of: user-container, queue-proxy


☁️  cloudevents.Event
Context Attributes,
  specversion: 1.0
  type: dev.knative.apiserver.ref.update
  source: https://10.96.0.1:443
  subject: /apis/v1/namespaces/event-demo/pods/apiserversource-pods-event-338f8c33-ff9c-4d47-9900-67023367wmsg
  id: 793f5721-73cf-4fbd-89e7-801911b2e4f8
  time: 2023-07-06T15:00:43.039352571Z
  datacontenttype: application/json
Extensions,
  kind: Pod
  name: apiserversource-pods-event-338f8c33-ff9c-4d47-9900-67023367wmsg
  namespace: event-demo
Data,
  {
    "kind": "Pod",
    "namespace": "event-demo",
    "name": "apiserversource-pods-event-338f8c33-ff9c-4d47-9900-67023367wmsg",
    "apiVersion": "v1"
  }
☁️  cloudevents.Event
Context Attributes,
  specversion: 1.0
  type: dev.knative.apiserver.ref.update
  source: https://10.96.0.1:443
  subject: /apis/v1/namespaces/event-demo/pods/apiserversource-pods-event-338f8c33-ff9c-4d47-9900-67023367wmsg
  id: 1b06b013-4ac1-4641-a808-dfd36a525d0f
  time: 2023-07-06T15:00:43.052778055Z
  datacontenttype: application/json
Extensions,
  kind: Pod
  name: apiserversource-pods-event-338f8c33-ff9c-4d47-9900-67023367wmsg
  namespace: event-demo
Data,
  {
    "kind": "Pod",
    "namespace": "event-demo",
    "name": "apiserversource-pods-event-338f8c33-ff9c-4d47-9900-67023367wmsg",
    "apiVersion": "v1"
  }

 

posted @ 2023-07-06 23:05  しみずよしだ  阅读(66)  评论(0)    收藏  举报