Knative - Pub/Sub - Channel/Subscription【十】

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

 

posted @ 2023-07-07 09:15  しみずよしだ  阅读(92)  评论(0)    收藏  举报