event source
基本使用章节,都是手工构造、发送 event 来访问应用,在生产环境,一般通过 event source 来触发
下面会结合实战来介绍下缺省的4种 event source,在此之前,先创建一个 pod 作为后续所有生成 event 的 consumer
$ cat event-display.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: event-display
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-contrib/cmd/event_display@sha256:49dac8ea142b5d00bbb4b12f6a9cacb2b7826f36037e2d34d304cdcd289233c3
---
kind: Service
apiVersion: v1
metadata:
name: event-display
spec:
selector:
app: event-display
ports:
- protocol: TCP
port: 80
targetPort: 8080
$ kubectl apply -f event-display.yamlapiserver source
apiserver source 监测 k8s 体系里的事件,生成对应的 cloudevent 事件
创建 rbac 规则
因为后续组件需要访问 k8s 事件,需要先创建相应的服务账户,绑定 event 的读能力
创建 apiserver source
使用上面的服务账户,创建 apiserver source
这里有一个 sink 字段,它定义了 event 的消费者,可以是以下几种对象:
k8s service
knative service
knative channel
knative broker
上述命令对应的完整流程是:
创建了 apiserversource
eventing-controller 依据 apiserversource 创建了一个 pod,该 pod 执行的二进制是 apiserver_receive_adapter,该二进制基本功能是监测 k8s 体系下的事件,并转成 cloudevent 事件
验证
可以看到 consumer 收到了 busybox 的创建、启动事件
container source
container source 是容器内发送 cloudevent 事件,需要用户自己实现
创建 container source
示例中 heartbeat 镜像对应源码:https://github.com/knative/eventing-contrib/blob/release-0.17/cmd/heartbeats/main.go ,配合输入参数,功能就是每秒发送一个 cloudevent 事件
上述命令对应的完整流程是:
创建了 container source
eventing-controller 依据 container source 指定的镜像创建了 pod
其中,还注入了以下环境变量,给出了 event 的接收地址
验证
可以看到 consumer 收到了每分钟一次的 event
ping source
ping source 本质上就是更早版本里的 cronjob source,可以周期性的生成 cloudevent 事件
创建 ping source
上述命令对应的完整流程是:
创建了 ping source
eventing controller 依据 pingsource 在 knative-eventing ns 下面创建了一个 pod,该 pod 执行的二进制是 mtping,该二进制的基本功能是读取 pingsource 中的时间安排 schedule 和消息 jsonData,按照时间发送包含该内容的 cloudevent 事件
验证
可以看到 consumer 收到了每分钟一次,包含指定内容的事件
sink binding
sink binding 可以用于将事件 producer 和 consumer 绑定起来
创建 producer
示例中 heartbeat 镜像对应源码:https://github.com/knative/eventing-contrib/blob/release-0.17/cmd/heartbeats/main.go ,配合输入参数,功能就是发送一个 cloudevent 事件后退出
创建 sink binding
与 containersource 场景不同,前者是创建时已经知道了 consumer,而后者则可以不知道。实际上如果仅创建上述 cronjob,则后续触发的 pod 都会失败,因为没有指定 consumer。这里通过创建 sinkbinding,将它绑定到相应的 consumer
上述命令对应的完整流程是:
创建了 sinkbinding
eventing-webhook 后续在新建 pod 的时候,会根据此 sinkbinding 内容,为相应的 pod 注入对应内容
containersource 实际上环境变量直接在生成 deploy 的时候已经注入了,而 sinkbinding 为了做到 producer、consumer 解耦,则延后到通过 webhook 在 pod 新建时才注入
验证
consumer 收到了每分钟 id 都为1的 cloudevent 事件
小结
除了上述内置 source 外,官方还支持 AWS SQS、Apache Kafka、GitHub 等事件源,第三方还支持 AWS DynamoDB、FTP / SFTP、VMware 等事件源,完整列表
Last updated
Was this helpful?