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


浙公网安备 33010602011771号