Knative Eventing 实战

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!"
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值