Knative Eventing
之前我们详细解释了 Ksvc 底层实现 serverless 逻辑以及实现方式,但这并不是生产形态,为了让 serverless 更贴合生产而不是理论,我们需要再触发层面更具灵活和可回朔性,Event 则是不二的选择。
Knative 提供了一个抽象层使消费事件变得更容易。Knative 直接提供了一个“事件”,而不需要你写特定的代码来选择消息代理。当事件发生时应用程序根本无需关心它来自哪里或发到哪去,就只需要知道事件发生了这么简单。
broker
该资源允许将事件路由到不同的事件接收器或消费者,该资源可被复用。
apiVersion: eventing.knative.dev/v1
kind: broker
metadata:
name: default
这会显示 broker 的信息。如果代理工作正常,它会显示以下 READY 状态 True。
kubectl get broker
NAME URL AGE READY REASON
default http://broker-ingress.knative-eventing.svc.cluster.local/default/default 26m True
事件订阅方
之后创建一个事件使用者 hello-display
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-display
spec:
replicas: 1
selector:
matchLabels: &labels
app: hello-display
template:
metadata:
labels: *labels
spec:
containers:
- name: event-display
image: registry.cn-shanghai.aliyuncs.com/eventing/hello:latest
imagePullPolicy: IfNotPresent
---
kind: Service
apiVersion: v1
metadata:
name: hello-display
spec:
selector:
app: hello-display
ports:
- protocol: TCP
port: 80
targetPort: 8080
该镜像的源码附录
package main import ( "context" "fmt" "log" cloudevents "github.com/cloudevents/sdk-go/v2" ) func display(event cloudevents.Event) { fmt.Printf("☁️ cloudevents.Event\n%s", event.String()) } func main() { c, err := cloudevents.NewClientHTTP() if err != nil { log.Fatal("Failed to create client, ", err) } log.Fatal(c.StartReceiver(context.Background(), display)) }
事件触发
Trigger 定义了每个事件消费者接收的事件。经 broker 使用触发器将事件转发给正确的消费者。
apiVersion: eventing.knative.dev/v1
kind: Trigger
metadata:
name: hello-display
spec:
broker: default
filter:
attributes:
type: greeting
subscriber:
ref:
apiVersion: v1
kind: Service
name: hello-display
如果触发器配置正确,它们将准备就绪并指向正确的代理 SUBSCRIBER_URI
kubectl get trigger
NAME BROKER SUBSCRIBER_URI AGE READY REASON
hello-display default http://hello-display.default.svc.cluster.local/ 40m True
创建一个 Pod 作为事件生产者
使用curl命令将单个事件作为 HTTP 请求手动发送到代理,并演示正确的事件使用者如何接收这些事件。
apiVersion: v1
kind: Pod
metadata:
labels:
run: curl
name: curl
spec:
containers:
- image: radial/busyboxplus:curl
imagePullPolicy: IfNotPresent
name: curl
resources: {}
stdin: true
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
tty: true
在 pod 中向代理发送事件,手动 curl 执行
curl -v "http://broker-ingress.knative-eventing.svc.cluster.local/default/default" \
-X POST \
-H "Ce-Id: say-hello" \
-H "Ce-Specversion: 1.0" \
-H "Ce-Type: greeting" \
-H "Ce-Source: not-sendoff" \
-H "Content-Type: application/json" \
-d '{"msg":"Hello Knative!"}'
发送事件后,验证事件是否由正确的订阅者接收, hello-display
通过输入以下命令查看事件使用者的日志
kubectl -n event-example logs -l app=hello-display --tail=100
将返回送到的事件
☁️ cloudevents.Event
Context Attributes,
specversion: 1.0
type: greeting
source: not-sendoff
id: say-hello
datacontenttype: application/json
Extensions,
knativearrivaltime: 2021-06-19T07:23:09.249303336Z
knativehistory: default-kne-trigger-kn-channel.default.svc.cluster.local
Data,
{
"msg": "Hello Knative!"
}