README
¶
In-Memory Channels
In-memory channels are a best effort channel. They have the following characteristics:
- No Persistence.
- When a Pod goes down, messages go with it.
- No Ordering Guarantee.
- There is nothing enforcing an ordering, so two messages that arrive at the same time may go to subscribers in any order.
- Different downstream subscribers may see different orders.
- No Redelivery Attempts.
- When a subscriber rejects a message, there is no attempts to retry sending it.
- Dead Letter Sink.
- When a subscriber rejects a message, this message is sent to the dead letter sink, if present, otherwise it is dropped.
Deployment steps:
-
Apply the
InMemoryChannel
CRD, Controller, and cluster-scoped Dispatcher.ko apply -Rf config/channels/in-memory-channel/
-
Create InMemoryChannels
kubectl apply --filename - << EOF apiVersion: messaging.knative.dev/v1 kind: InMemoryChannel metadata: name: foo EOF
Components
The major components are:
- InMemoryChannel Controller
- InMemoryChannel Dispatcher
kubectl get deployment -n knative-eventing imc-controller
The InMemoryChannel Dispatcher receives and distributes all events. There is a single Dispatcher for all in-memory Channels.
kubectl get deployment -n knative-eventing imc-dispatcher
Namespace Dispatchers
By default, events will be received and dispatched by a single cluster-scoped
dispatcher components. You can also specify whether events should be received
and dispatched by the dispatcher in the same namespace as the channel definition
by adding the eventing.knative.dev/scope: namespace
annotation. For instance:
kubectl apply --filename - << EOF
apiVersion: messaging.knative.dev/v1
kind: InMemoryChannel
metadata:
name: foo-ns
namespace: default
annotations:
eventing.knative.dev/scope: namespace
EOF
Demo
InMemoryChannel should work without core eventing installed.
Warning:
Subscriptions
are provided with Eventing Core.
-
Install a channel.
kubectl apply --filename - << EOF apiVersion: messaging.knative.dev/v1 kind: InMemoryChannel metadata: name: demo EOF
-
Install event display:
ko apply -f - << EOF apiVersion: apps/v1 kind: Deployment metadata: name: event-display spec: replicas: 1 selector: matchLabels: &labels app: event-display template: metadata: labels: *labels spec: containers: - name: display image: ko://knative.dev/eventing/cmd/event_display --- kind: Service apiVersion: v1 metadata: name: event-display spec: selector: app: event-display ports: - protocol: TCP port: 80 targetPort: 8080 EOF
-
Add event-display as a subscriber of the channel.
kubectl patch InMemoryChannel demo --type merge --patch '{"spec":{"subscribers":[{"subscriberUri":"http://event-display.default.svc.cluster.local","uid":"abc-123"}]}}'
-
Create a heartbeats pod:
ko apply --filename - << EOF apiVersion: v1 kind: Pod metadata: name: heartbeats spec: containers: - name: heartbeats image: ko://knative.dev/eventing/cmd/heartbeats env: - name: "K_SINK" value: "http://demo-kn-channel.default.svc.cluster.local" - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name EOF
Results
The demo
channel should end up looking like this:
$ kubectl get channel demo -oyaml
apiVersion: messaging.knative.dev/v1
kind: InMemoryChannel
metadata:
messaging.knative.dev/creator: kubernetes-admin
messaging.knative.dev/lastModifier: kubernetes-admin
messaging.knative.dev/subscribable: v1
creationTimestamp: "2021-05-05T18:45:25Z"
generation: 2
name: demo
namespace: default
resourceVersion: "20083"
uid: a3c67f17-ebe6-4906-ba8d-7d8497346629
spec:
subscribers:
- subscriberUri: http://event-display.default.svc.cluster.local
uid: abc-123
status:
address:
url: http://demo-kn-channel.default.svc.cluster.local
conditions:
- lastTransitionTime: "2021-05-05T18:45:26Z"
status: "True"
type: Addressable
- lastTransitionTime: "2021-05-05T18:45:26Z"
status: "True"
type: ChannelServiceReady
- lastTransitionTime: "2021-05-05T18:45:26Z"
status: "True"
type: DispatcherReady
- lastTransitionTime: "2021-05-05T18:45:26Z"
status: "True"
type: EndpointsReady
- lastTransitionTime: "2021-05-05T18:45:26Z"
status: "True"
type: Ready
- lastTransitionTime: "2021-05-05T18:45:26Z"
status: "True"
type: ServiceReady
observedGeneration: 2
subscribers:
- ready: "True"
uid: abc-123
And a stern
output would look like this:
$ stern ".*"
heartbeats heartbeats 2021/05/05 19:26:15 sending cloudevent to http://demo-kn-channel.default.svc.cluster.local
event-display-5d859f98d7-b79d7 display ☁️ cloudevents.Event
event-display-5d859f98d7-b79d7 display Validation: valid
event-display-5d859f98d7-b79d7 display Context Attributes,
event-display-5d859f98d7-b79d7 display specversion: 1.0
event-display-5d859f98d7-b79d7 display type: dev.knative.eventing.samples.heartbeat
event-display-5d859f98d7-b79d7 display source: https://knative.dev/eventing-contrib/cmd/heartbeats/#default/heartbeats
event-display-5d859f98d7-b79d7 display id: a6a36488-028f-4fd0-9c2c-31afc389ef73
event-display-5d859f98d7-b79d7 display time: 2021-05-05T19:26:15.452991106Z
event-display-5d859f98d7-b79d7 display datacontenttype: application/json
event-display-5d859f98d7-b79d7 display Extensions,
event-display-5d859f98d7-b79d7 display beats: true
event-display-5d859f98d7-b79d7 display heart: yes
event-display-5d859f98d7-b79d7 display the: 42
event-display-5d859f98d7-b79d7 display Data,
event-display-5d859f98d7-b79d7 display {
event-display-5d859f98d7-b79d7 display "id": 11,
event-display-5d859f98d7-b79d7 display "label": ""
event-display-5d859f98d7-b79d7 display }
Documentation
¶
Overview ¶
Package channel is a placeholder that allows us to pull in config files via go mod vendor.
Directories
¶
Path | Synopsis |
---|---|
Package configmaps is a placeholder that allows us to pull in config files via go mod vendor.
|
Package configmaps is a placeholder that allows us to pull in config files via go mod vendor. |
Package deployments is a placeholder that allows us to pull in config files via go mod vendor.
|
Package deployments is a placeholder that allows us to pull in config files via go mod vendor. |
Package resources is a placeholder that allows us to pull in config files via go mod vendor.
|
Package resources is a placeholder that allows us to pull in config files via go mod vendor. |
Package roles is a placeholder that allows us to pull in config files via go mod vendor.
|
Package roles is a placeholder that allows us to pull in config files via go mod vendor. |
Package webhooks is a placeholder that allows us to pull in config files via go mod vendor.
|
Package webhooks is a placeholder that allows us to pull in config files via go mod vendor. |