Channel 和 Subscription
#总结
Channel/Subscription
Channel和Subscription,以及Sink要处于同一个名称空间;
当然,在语法上,我们可以在subscription中的定义引用其它名称空间中的Sink,但很有可能不会发生作用。
#关于Channel
◼ Eventing中的Channel CRD负责定义名称空间级别的消息总线
◼ 它的后端要基于特定的实现,如In-Memory Channel(简称imc)、NATS Channel或Kafka Channel等
◼ 每个Channel应该对应于一个特定Topic
◼ 通常,Channels and Subscriptions消息投递模式中才需要自行创建Channel
◆Sources to Sink模式不需要Channel
◆Brokers and Triggers无须自行配置Channel
#关于Subscription
◼ Eventing中的Subscription CRD负责将Sink(例如Service或KService)连接至一个Channel之上;
◼ 何时需要自行创建Subscription
◆Sources to Sink模式不需要Subscription,因为没有Channel可以订阅
◆Channels and Subscriptions消息投递模式,需要创建订阅至Channel的Subscription
◆Brokers and Triggers消息投递模式,需要创建订阅至Trigger的Subscription
Channel 和 Subscription 实践 (一对多)
![]()
#示例环境说明
◼ 基于imc的channel/imc01作为消息总线
◼ kservice/event-display订阅channel/imc01
◼ curl命令作为event source,基于HTTP协议推送消息至channel/imc01
#命令式命令
① Channel
◆创建:~$ kn channel create imc01 --type messaging.knative.dev:v1:InMemoryChannel
⚫ 该类型标识存在一个内置的别名“imc”,因而上面的类型也可简单地指定为该别名
◆列出channel/imc01以获取其URL:~$ kn channel list imc01
⚫ URL的样式:http://imc01-kn-channel.default.svc.cluster.local
② Sink: kservice/event-display
◆若不存在,需要先创建:~$ kn service create event-display --image ikubernetes/event_display --port 8080 --scale-min 1
③ Subscription
◆创建: ~$ kn subscription create sub01 --channel imc01 --sink ksvc:event-display
⚫ subscription/sub01负责连接kservice/event-display至channel/imc01
1.查看默认当前的 channel-template-spec : InMemoryChannel
[root@xianchaomaster1 KnativeSrc]# kubectl get cm -n knative-eventing
NAME DATA AGE
config-br-default-channel 1 17h
config-br-defaults 1 17h
config-features 6 17h
config-imc-event-dispatcher 2 17h
config-kreference-mapping 1 17h
config-leader-election 1 17h
config-logging 3 17h
config-observability 1 17h
config-ping-defaults 1 17h
config-sugar 1 17h
config-tracing 1 17h
default-ch-webhook 1 17h
istio-ca-root-cert 1 17h
kube-root-ca.crt 1 17h
#当前默认 channel-template-spec : InMemoryChannel
[root@xianchaomaster1 KnativeSrc]# kubectl get cm config-br-default-channel -o yaml -n knative-eventing
apiVersion: v1
data:
channel-template-spec: |
apiVersion: messaging.knative.dev/v1
kind: InMemoryChannel
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"channel-template-spec":"apiVersion: messaging.knative.dev/v1\nkind: InMemoryChannel\n"},"kind":"ConfigMap","metadata":{"annotations":{},"labels":{"app.kubernetes.io/name":"knative-eventing","app.kubernetes.io/version":"1.7.1","eventing.knative.dev/release":"v1.7.1"},"name":"config-br-default-channel","namespace":"knative-eventing"}}
creationTimestamp: "2023-07-06T08:50:35Z"
labels:
app.kubernetes.io/name: knative-eventing
app.kubernetes.io/version: 1.7.1
eventing.knative.dev/release: v1.7.1
name: config-br-default-channel
namespace: knative-eventing
resourceVersion: "466563"
uid: 06aa90b2-6b06-4794-bc17-6c7c24a63e12
2.创建一个Channel
[root@xianchaomaster1 KnativeSrc]# kn channel create imc01 --type messaging.knative.dev:v1:InMemoryChannel
Channel 'imc01' created in namespace 'default'.
[root@xianchaomaster1 KnativeSrc]# kn channel list
NAME TYPE URL AGE READY REASON
imc01 InMemoryChannel http://imc01-kn-channel.default.svc.cluster.local 6s True
3.创建Sink为 两个KService
[root@xianchaomaster1 KnativeSrc]# kn service create event-display-001 --image ikubernetes/event_display --port 8080 --scale-min 1
[root@xianchaomaster1 KnativeSrc]# kn service create event-display-002 --image ikubernetes/event_display --port 8080 --scale-min 1
[root@xianchaomaster1 KnativeSrc]# kn service list
NAME URL LATEST AGE CONDITIONS READY REASON
demoapp http://demoapp.default.xks.com demoapp-00001 46h 3 OK / 3 True
event-display-001 http://event-display-001.default.xks.com event-display-001-00001 18s 3 OK / 3 True
event-display-002 http://event-display-002.default.xks.com event-display-002-00001 9s 3 OK / 3 True
4.创建两个 Subscription 订阅同一个 Channel
#创建两个 Subscription 订阅同一个 Channel
[root@xianchaomaster1 KnativeSrc]# kn subscription create sub01 --channel messaging.knative.dev:v1:InMemoryChannel:imc01 --sink ksvc:event-display-001
Subscription 'sub01' created in namespace 'default'.
[root@xianchaomaster1 KnativeSrc]# kn subscription create sub02 --channel messaging.knative.dev:v1:InMemoryChannel:imc01 --sink ksvc:event-display-002
Subscription 'sub02' created in namespace 'default'.
[root@xianchaomaster1 KnativeSrc]# kn subscription list
NAME CHANNEL SUBSCRIBER REPLY DEAD LETTER SINK READY REASON
sub01 InMemoryChannel:imc01 ksvc:event-display-001 True
sub02 InMemoryChannel:imc01 ksvc:event-display-002 True
#查看 subscription sub01
[root@xianchaomaster1 KnativeSrc]# kn subscription describe sub01
Name: sub01
Namespace: default
Annotations: messaging.knative.dev/creator=kubernetes-admin, messaging.knative.dev/lastModifier= ...
Age: 2m
Channel: InMemoryChannel:imc01 (messaging.knative.dev/v1)
Subscriber:
Name: event-display-001
Resource: Service (serving.knative.dev/v1)
Conditions:
OK TYPE AGE REASON
++ Ready 2m
++ AddedToChannel 2m
++ ChannelReady 2m
++ ReferencesResolved 2m
5.Curl 测试发送消息(因为是一个Channel 所以同时都接受到信息)
[root@xianchaomaster1 KnativeSrc]# kn channel describe imc01
Name: imc01
Namespace: default
Annotations: messaging.knative.dev/creator=kubernetes-admin, messaging.knative.dev/lastModifier= ...
Age: 5m
Type: InMemoryChannel (messaging.knative.dev/v1)
URL: http://imc01-kn-channel.default.svc.cluster.local
Conditions:
OK TYPE AGE REASON
++ Ready 5m
++ Addressable 5m
++ BackingChannelReady 5m
++ DeadLetterSinkResolved 5m DeadLetterSinkNotConfigured
#替换上面的地址
[root@xianchaomaster1 KnativeSrc]# kubectl run client-$RANDOM --image=ikubernetes/admin-box:v1.2 --restart=Never -it --command -- /bin/sh
If you don't see a command prompt, try pressing enter.
#替换上面的地址
~$ curl -v "http://imc01-kn-channel.default.svc.cluster.local" -X POST \
-H "Ce-Id: say-hello" \
-H "Ce-Specversion: 1.0" \
-H "Ce-Type: com.magedu.sayhievent" \
-H "Ce-Time: 2022-10-02T15:18:56.7181741Z" \
-H "Ce-Source: sendoff" \
-H "Content-Type: application/json" \
-d '{"msg":"Hello MageEdu Knative from Channel imc01!"}'
Note: Unnecessary use of -X or --request, POST is already inferred.
* Trying 10.96.11.24:80...
* TCP_NODELAY set
* Connected to imc01-kn-channel.default.svc.cluster.local (10.96.11.24) port 80 (#0)
> POST / HTTP/1.1
> Host: imc01-kn-channel.default.svc.cluster.local
> User-Agent: curl/7.67.0
> Accept: */*
> Ce-Id: say-hello
> Ce-Specversion: 1.0
> Ce-Type: com.magedu.sayhievent
> Ce-Time: 2023-07-07T15:18:56.7181741Z
> Ce-Source: sendoff
> Content-Type: application/json
> Content-Length: 51
>
* upload completely sent off: 51 out of 51 bytes
* Mark bundle as not supporting multiuse
< HTTP/1.1 202 Accepted
< Allow: POST, OPTIONS
< Date: Fri, 07 Jul 2023 03:15:17 GMT
< Content-Length: 0
<
* Connection #0 to host imc01-kn-channel.default.svc.cluster.local left intact
#event-display-001-00001-deployment-68cdddddcb-hj8pg logs 日志情况
[root@xianchaomaster1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
client-14482 1/1 Running 0 25s
client-18554 0/1 Unknown 0 13h
event-display-001-00001-deployment-68cdddddcb-hj8pg 2/2 Running 0 28m
event-display-002-00001-deployment-8769bf8bd-nfl9q 2/2 Running 0 28m
[root@xianchaomaster1 ~]# kubectl logs -f event-display-001-00001-deployment-68cdddddcb-hj8pg
Defaulted container "user-container" out of: user-container, queue-proxy
☁️ cloudevents.Event
Context Attributes,
specversion: 1.0
type: com.magedu.sayhievent
source: sendoff
id: say-hello
time: 2023-07-07T15:18:56.7181741Z
datacontenttype: application/json
Data,
{
"msg": "Hello MageEdu Knative from Channel imc01!"
}
#event-display-002-00001-deployment-8769bf8bd-nfl9q logs 日志情况
[root@xianchaomaster1 ~]# kubectl logs -f event-display-002-00001-deployment-8769bf8bd-nfl9q
Defaulted container "user-container" out of: user-container, queue-proxy
☁️ cloudevents.Event
Context Attributes,
specversion: 1.0
type: com.magedu.sayhievent
source: sendoff
id: say-hello
time: 2023-07-07T15:18:56.7181741Z
datacontenttype: application/json
Data,
{
"msg": "Hello MageEdu Knative from Channel imc01!"
}
另外:Yaml格式
#Channel资源配置(二选一)
#直接在Kind中指明了Channel类型
apiVersion: messaging.knative.dev/v1
kind: InMemoryChannel
metadata:
name: imc01
namespace: event-demo
#在channelTemplate中指定Channel类型
apiVersion: messaging.knative.dev/v1
kind: Channel
metadata:
name: imc01
namespace: event-demo
spec:
channelTemplate:
apiVersion: messaging.knative.dev/v1
kind: InMemoryChannel
#Subscription资源配置
apiVersion: messaging.knative.dev/v1
kind: Subscription
metadata:
name: subscription1
namespace: event-demo
spec:
channel:
apiVersion: messaging.knative.dev/v1
kind: Channel
name: imc01
subscriber:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: event-display
namespace: event-demo