建立ns
[[email protected] event]# kubectl create ns event-example
[[email protected] event]# kubectl label namespace event-example knative-eventing-injection=enabled
驗證broker
[[email protected] event]# kubectl --namespace event-example get Broker default
NAME READY REASON URL AGE
default True http://default-broker.event-example.svc.cluster.local 70s
建立knative service
[[email protected] event]# kubectl --namespace event-example apply --filename - << END
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: my-service
namespace: event-example
spec:
template:
spec:
containers:
- # This corresponds to
# https://github.com/knative/eventing-contrib/blob/v0.2.1/cmd/message_dumper/dumper.go.
image: gcr.io/knative-releases/github.com/knative/eventing-sources/cmd/[email protected]:ab5391755f11a5821e7263686564b3c3cd5348522f5b31509963afb269ddcd63
END
[[email protected] event]# kubectl get ksvc -n event-example
NAME URL LATESTCREATED LATESTREADY READY REASON
my-service http://my-service.event-example.example.com my-service-7frtw my-service-7frtw True
建立trigger
[[email protected] event]# kubectl --namespace event-example apply --filename - << END
apiVersion: eventing.knative.dev/v1alpha1
kind: Trigger
metadata:
name: my-service-trigger
namespace: event-example
spec:
filter:
attributes:
type: dev.knative.foo.bar
subscriber:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: my-service
END
測試
手動觸發
建立event-producer
[[email protected] event]# kubectl --namespace event-example apply --filename - << END
apiVersion: v1
kind: Pod
metadata:
labels:
run: curl
name: curl
namespace: event-example
spec:
containers:
# This could be any image that we can SSH into and has curl.
- image: registry.cn-hangzhou.aliyuncs.com/magina-k8s/busyboxplus:curl
imagePullPolicy: IfNotPresent
name: curl
resources: {}
stdin: true
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
tty: true
END
此時之前建立的knative service後端沒有任何pod。
[[email protected] event]# kubectl get po -n event-example
NAME READY STATUS RESTARTS AGE
curl 1/1 Running 0 17s
default-broker-filter-7774596796-jmdfn 1/1 Running 0 7m38s
default-broker-ingress-6cd9f66848-ldrrj 1/1 Running 0 7m38s
發送事件
[[email protected] event]# kubectl exec -it -n event-example curl sh
[ [email protected]:/ ]$ curl -v "http://default-broker.event-example.svc.cluster.local/" \
-X POST \
-H "X-B3-Flags: 1" \
-H "CE-SpecVersion: 0.2" \
-H "CE-Type: dev.knative.foo.bar" \
-H "CE-Time: 2018-04-05T03:56:24Z" \
-H "CE-ID: 45a8b444-3213-4758-be3f-540bf93f85ff" \
-H "CE-Source: dev.knative.example" \
-H 'Content-Type: application/json' \
-d '{ "much": "wow" }'
此時knative會動态建立my-service執行個體
[[email protected] knative]# kubectl get po -n event-example NAME READY STATUS RESTARTS AGE
curl 1/1 Running 0 53m
default-broker-filter-7774596796-fv84k 1/1 Running 0 55m
default-broker-ingress-6cd9f66848-dlrq2 1/1 Running 0 55m
my-service-6549z-deployment-688bc68c6c-656tj 2/2 Running 0 113s
[[email protected] knative]#
可以檢視日志
[[email protected] knative]# kubectl logs -n event-example my-service-6549z-deployment-688bc68c6c-656tj -c user-container
2019/12/10 03:10:23 Message Dumper received a message: POST / HTTP/1.1
Host: my-service.event-example.svc.cluster.local
Accept-Encoding: gzip
Ce-Id: 45a8b444-3213-4758-be3f-540bf93f85ff
Ce-Knativearrivaltime: 2019-12-10T03:10:19Z
Ce-Knativehistory: default-kne-trigger-kn-channel.event-example.svc.cluster.local
Ce-Source: dev.knative.example
Ce-Specversion: 0.3
Ce-Time: 2018-04-05T03:56:24Z
Ce-Traceparent: 00-a0cc623ba9f55a2da13ba08303c50252-eef423a1509d4991-00
Ce-Type: dev.knative.foo.bar
Content-Length: 17
Content-Type: application/json
Forwarded: for=192.138.200.217;proto=http, for=192.138.200.250
K-Proxy-Request: activator
User-Agent: Go-http-client/1.1
X-B3-Parentspanid: fb297a8103ef765d
X-B3-Sampled: 0
X-B3-Spanid: 17a11c9ebe255e54
X-B3-Traceid: a0cc623ba9f55a2da13ba08303c50252
X-Envoy-Decorator-Operation: my-service-6549z.event-example.svc.cluster.local:80/*
X-Envoy-Expected-Rq-Timeout-Ms: 600000
X-Envoy-External-Address: 192.138.200.217
X-Forwarded-For: 192.138.200.217, 192.138.200.250, 192.138.200.231
X-Forwarded-Proto: http
X-Request-Id: 22c65a92-96d7-9972-9fad-506893716146
{ "much": "wow" }
使用cronjob source觸發事件
在上一節基礎上,要建立一個新trigger。
apiVersion: eventing.knative.dev/v1alpha1
kind: Trigger
metadata:
name: my-service-cronjob-trigger
namespace: event-example
spec:
filter:
attributes:
type: dev.knative.cronjob.event
subscriber:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: my-service
此處的event type為
dev.knative.cronjob.event
。
使用
kn
指令行工具建立cronjob source。
kn source cronjob create --namespace event-example --schedule "* * * * */1" --data "ping" --sink svc:my-service my-cron-trigger
檢視my-service pod的日志。
2019/12/10 12:09:00 Message Dumper received a message: POST / HTTP/1.1
Host: my-service.event-example.svc.cluster.local
Accept-Encoding: gzip
Ce-Id: 3f3780b4-6aef-4fcc-9635-1a9273959433
Ce-Source: /apis/v1/namespaces/event-example/cronjobsources/my-cron-trigger
Ce-Specversion: 0.3
Ce-Time: 2019-12-10T12:09:00.000566484Z
Ce-Type: dev.knative.cronjob.event
Content-Length: 15
Forwarded: for=192.138.200.216;proto=http, for=192.138.200.207
K-Proxy-Request: activator
User-Agent: Go-http-client/1.1
X-B3-Parentspanid: 0404bc3bc0f3e098
X-B3-Sampled: 0
X-B3-Spanid: a720015b628551fc
X-B3-Traceid: b6bb1076414f6ae878fae8030562179f
X-Envoy-Decorator-Operation: my-service-6549z.event-example.svc.cluster.local:80/*
X-Envoy-Expected-Rq-Timeout-Ms: 600000
X-Envoy-External-Address: 192.138.200.216
X-Forwarded-For: 192.138.200.216, 192.138.200.207, 192.138.200.222
X-Forwarded-Proto: http
X-Request-Id: ab4bf5e6-8109-94ec-b6e5-7e93efa00798
{"body":"ping"}
本實驗需要istio支援cluster-local-gateway,安裝可參考:https://github.com/knative/docs/blob/master/docs/install/installing-istio.md#updating-your-install-to-use-cluster-local-gateway
參考
https://knative.dev/docs/eventing/broker-trigger
https://github.com/knative/docs/blob/release-0.11/docs/eventing/getting-started.md