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.yaml

apiserver 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?