概念
Knative Eventing中的Channel和Subscription類似JMS消息體系中的Topic/Subscribe機制。Event Source是消息的發佈者(類似JMS的Publisher),Channle是傳送消息的通道(類似JMS的Topic),而Subscription通過訂閱Channel獲取到相關的Event,並且使用Knative Serving的服務處理消息。
操作
- 創建如下內容的channel.yaml文件,其中定義了名爲eventinghello-ch的Channel類型的對象。
apiVersion: messaging.knative.dev/v1alpha1
kind: Channel
metadata:
name: eventinghello-ch
- 執行命令生成Channel對象,然後查看eventinghello-ch狀態爲READY=true。
$ oc -n knativetutorial apply -f channel.yaml
$ oc -n knativetutorial get channel
NAME READY REASON URL AGE
eventinghello-ch True http://eventinghello-ch-kn-channel.knativetutorial.svc.cluster.local 34s
$ oc -n knativetutorial get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
eventinghello-ch-kn-channel ExternalName <none> imc-dispatcher.knative-eventing.svc.cluster.local <none> 40s
- 創建如下內容的event-source.yaml文件,其中定義了名爲my-cjs的CronJobSource類型的對象,它每2秒產生一次事件。事件發送目標Sink爲eventinghello-ch的Channel。
apiVersion: sources.eventing.knative.dev/v1alpha1
kind: CronJobSource
metadata:
name: my-cjs
spec:
schedule: "*/2 * * * *"
data: '{"message": "From CronJob Source"}'
sink:
ref:
apiVersion: messaging.knative.dev/v1alpha1
kind: Channel
name: eventinghello-ch
- 執行命令生成CronJobSource對象,然後查看my-cjs狀態爲READY=true。說明:如果接收事件的目標Sink沒有Ready,那麼my-cjs的狀態也不會Ready。
$ oc -n knativetutorial apply -f event-source.yaml
cronjobsource.sources.eventing.knative.dev/event-greeter-cronjob-source created
$ oc -n knativetutorial get cronjobsources
NAME READY AGE
my-cjs True 76s
$ oc -n knativetutorial get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
cronjobsource-my-cjs-bf3f1b8f-fc05-46d0-ae5c-a5bd9c7377b0 1/1 1 1 44m
- 分別創建eventing-helloa-sink.yaml和eventing-hellob-sink.yaml文件,內容如下。它們分別定義了名爲eventinghelloa和eventinghellob的Service。
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: eventinghelloa
spec:
template:
metadata:
name: eventinghelloa-v1
annotations:
autoscaling.knative.dev/target: "1"
spec:
containers:
- image: quay.io/burrsutter/eventinghello:0.0.1
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: eventinghellob
spec:
template:
metadata:
name: eventinghellob-v1
annotations:
autoscaling.knative.dev/target: "1"
spec:
containers:
- image: quay.io/burrsutter/eventinghello:0.0.1
- 執行命令,創建eventinghelloa和eventinghellob服務。然後查看和eventinghelloa和eventinghellob相關的Deployment和Serivce。
$ oc apply -n knativetutorial -f eventing-helloa-sink.yaml
$ oc apply -n knativetutorial -f eventing-hellob-sink.yaml
$ oc -n knativetutorial get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
cronjobsource-my-cjs-bf3f1b8f-fc05-46d0-ae5c-a5bd9c7377b0 1/1 1 1 44m
eventinghelloa-v1-deployment 0/0 0 0 24m
eventinghellob-v1-deployment 0/0 0 0 24m
$ oc -n knativetutorial get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
eventinghello-ch-kn-channel ExternalName <none> imc-dispatcher.knative-eventing.svc.cluster.local <none> 53m
eventinghelloa ExternalName <none> kourier-internal.knative-serving-ingress.svc.cluster.local <none> 12s
eventinghelloa-v1 ClusterIP 172.30.177.109 <none> 80/TCP 22s
eventinghelloa-v1-private ClusterIP 172.30.210.190 <none> 80/TCP,9090/TCP,9091/TCP,8022/TCP 22s
eventinghellob ExternalName <none> kourier-internal.knative-serving-ingress.svc.cluster.local <none> 11s
eventinghellob-v1 ClusterIP 172.30.116.241 <none> 80/TCP 21s
eventinghellob-v1-private ClusterIP 172.30.45.121 <none> 80/TCP,9090/TCP,9091/TCP,8022/TCP 21s
- 創建eventing-helloa-sub.yaml和eventing-hellob-sub.yaml文件,內容分別如下。他們分別定義了名爲eventinghelloa-sub和eventinghellob-sub的Subscription。這兩個Subscription都是從名爲eventinghello-ch的Channel獲取消息,只不過一個用名爲eventinghelloa的Service處理,另一個用名爲eventinghellob的Service處理。
apiVersion: messaging.knative.dev/v1alpha1
kind: Subscription
metadata:
name: eventinghelloa-sub
spec:
channel:
apiVersion: messaging.knative.dev/v1alpha1
kind: Channel
name: eventinghello-ch
subscriber:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: eventinghelloa
apiVersion: messaging.knative.dev/v1alpha1
kind: Subscription
metadata:
name: eventinghellob-sub
spec:
channel:
apiVersion: messaging.knative.dev/v1alpha1
kind: Channel
name: eventinghello-ch
subscriber:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: eventinghellob
- 執行命令,分別創建名爲eventinghelloa-sub和eventinghellob-sub的Subscription,然後查看它們的狀態變爲READY=True。
$ oc -n knativetutorial apply -f eventing-helloa-sub.yaml
$ oc -n knativetutorial apply -f eventing-hellob-sub.yaml
$ oc -n knativetutorial get subscriptions.messaging.knative.dev
NAME READY REASON AGE
eventinghelloa-sub True 7m11s
eventinghellob-sub True 7m11s
- 在控制檯查看運行情況。可以看到eventinghelloa和eventinghellob的實例數會在0和1之間變化。
- 執行命令,清理環境。
oc -n knativetutorial delete -f channel.yaml
oc -n knativetutorial delete -f event-source.yaml
oc -n knativetutorial delete -f eventing-helloa-sink.yaml
oc -n knativetutorial delete -f eventing-hellob-sink.yaml
oc -n knativetutorial delete -f eventing-helloa-sub.yaml
oc -n knativetutorial delete -f eventing-hellob-sub.yaml
參考
- https://github.com/RedHatWorkshops/knative-on-ocp4/blob/master/6.AddingChannelsAndSubscriptions.md