- 文档
- 教程
- 云原生
【免费下载链接】docs
User documentation for Knative components.
Channel 是 Knative Eventing 中承担"事件转发与持久化"职责的核心抽象:它作为 Kubernetes 自定义资源(Custom Resource),通过 Subscription 将收到的 CloudEvent 扇出(fan-out)到多个 Sink。本文基于官方文档与仓库源码,系统讲解 Channel 的类型体系、default-ch-webhook默认配置机制、泛型 Channel 的创建原理,以及 Subscription 的完整生命周期管理(创建、查看、更新、删除),帮助你在实际集群中构建可靠的事件投递链路。
什么是 Channel:事件转发与持久化层
Knative Eventing 是一套 API 集合,用于构建事件驱动架构:事件生产者(Sources)产生事件,事件消费者(Sinks)接收事件,组件之间通过标准 HTTP POST 请求传递符合 [CloudEvents 规范]的事件(详见 about-eventing.md)。在这一体系中,Channel 扮演着中间枢纽的角色。
根据 Channels 概述文档 的定义:
Channels are Kubernetes custom resources that define a single event forwarding and persistence layer.
Channel 本质上是一个 Kubernetes 自定义资源,它定义了一个单一的事件转发与持久化层,核心能力包括:
- 事件收容:接收来自一个或多个事件源(Sources)发送的 CloudEvent;
- 扇出分发:通过 Subscription 将收到的同一批事件复制、分发到多个目的地(Sinks);
- 持久化:由具体的 Channel 实现决定事件是否落地存储(例如 Kafka 主题、内存缓存、Pub/Sub 等)。
Sink 的典型例子包括Broker和Knative Service。也就是说,一条完整的事件链路通常是:
Source → Channel → Subscription → Sink(Broker / Knative Service / 其他 Channel)上图中的工作流展示了这种"一对多"扇出语义:Source 1和Source 2产生事件后统一汇入 Channel,Channel 将事件转发给两个 Subscription,再由每个 Subscription 各自将事件送达对应的 Sink。Knative Eventing 的组件是松散耦合的——生产者可以在没有任何活跃消费者之前就产生事件,消费者也可以在没有任何生产者之前就表达对某类事件的兴趣,这为构建解耦的事件系统提供了基础。
Channel 的类型体系:泛型对象与具体实现
两种 Channel 使用方式
Knative Eventing 定义了两种 Channel 概念,理解它们的区别是正确选型的前提(详见 Channel types and defaults):
- 泛型 Channel 对象(generic Channel object):即
messaging.knative.dev/v1下的Channel资源。创建时不指定具体实现,由集群管理员配置的默认实现来落地。适合不在乎具体实现特性(如排序、持久化),希望使用管理员选定实现的场景。 - 具体 Channel 实现(Channel implementations):每个实现都有自己的 CRD,例如
InMemoryChannel、KafkaChannel。它们各自具备不同的事件投递机制和特性。
不同实现的能力差异很大,典型例子如下:
- KafkaChannel:以 Apache Kafka 主题为后端,支持有序消费投递保证(ordered consumer delivery guarantee)——实现方式是"每分区阻塞消费者":CloudEvent 订阅者(subscriber)成功响应后,才投递该分区的下一条消息,从而保证同一分区内消息按序送达。
- InMemoryChannel:纯内存实现,零配置、适合开发调试,但不适合生产环境。
- NatssChannel:以 NATS Streaming 为后端。
自定义 Channel 实现的投递机制各异,可能是内存型,也可能是 Broker 型。Broker 型实现的例子包括KafkaBroker与GCP Pub/Sub Broker。
默认实现:InMemoryChannel
Knative 默认提供InMemoryChannel作为默认 Channel 实现。对于不希望配置特定实现类型(如 Apache Kafka 或 NATSS Channels)的开发者,这一默认实现足够支撑开发和原型验证。
可用 Channel 实现一览
仓库通过 channels-crds.md 维护一份非穷尽的可用 Channel 实现清单(列在其中不代表官方背书或任何支持级别的承诺):
| Name | Status | Maintainer | Description |
|---|---|---|---|
| InMemoryChannel | Stable | Knative | In-memory channels are a best effort Channel. They should NOT be used in Production. They are useful for development. |
| KafkaChannel | Beta | Knative | Channels are backed by Apache Kafka topics. |
| NatssChannel | Alpha | Knative | Channels are backed by NATS Streaming. |
从状态列可以读出当前成熟度信号:InMemoryChannel 为 Stable,KafkaChannel 为 Beta,NatssChannel 为 Alpha。
清单的维护机制:channels.yaml 与生成器
这份清单并非手写维护,而是由数据文件 + 生成器自动产出的:
- 数据源:channels.yaml 中以结构化 YAML 记录每个实现的
name、url、status、maintainer、description; - 模板:ReadmeTemplate.gomd 是 Go
text/template模板,遍历Channels列表渲染表格; - 生成器:main.go 按
channels.yaml → 模板 → channels-crds.md的流程生成文档。
从源码看(main.go),生成器通过三个命令行参数控制输入输出,默认值分别为:-yaml指向eventing/channels/channels.yaml、-template指向模板文件、-md指向输出的channels-crds.md。生成前还会对 Channel 列表按名称做稳定的字母序排序(sortAlphabetically),保证输出表格顺序一致。在仓库根目录下可用如下命令重新生成:
go run docs/versioned/eventing/channels/generator/main.go默认 Channel 类型配置:default-ch-webhook 详解
默认 ConfigMap 长什么样
集群管理员可以通过修改knative-eventing命名空间下的default-ch-webhookConfigMap,来调整默认 Channel 实现的配置。该 ConfigMap 的默认内容如下(详见 Configure Channel defaults):
apiVersion: v1 kind: ConfigMap metadata: name: default-ch-webhook namespace: knative-eventing labels: eventing.knative.dev/release: devel app.kubernetes.io/version: devel app.kubernetes.io/part-of: knative-eventing data: default-ch-config: | clusterDefault: apiVersion: messaging.knative.dev/v1 kind: InMemoryChannel namespaceDefaults: some-namespace: apiVersion: messaging.knative.dev/v1 kind: InMemoryChannel配置的核心在data.default-ch-config字段,它包含两个子项:
clusterDefault:决定集群全局的默认 Channel 类型;namespaceDefaults:按命名空间分别指定默认 Channel 类型。
这段配置被 Channel 的自定义资源定义(CRD)消费,用于创建平台相关的具体实现。
集群级与命名空间级默认值的优先级
默认 Channel 可以配置在集群级、命名空间级,或两者同时配置。需要注意优先级规则:
!!! note 如果某个命名空间配置了默认 Channel 实现,它将覆盖集群级配置。
官方示例展示了"集群默认 InMemoryChannel,而example-namespace命名空间默认 KafkaChannel"的组合配置(来自 channel-types-defaults.md):
apiVersion: v1 kind: ConfigMap metadata: name: default-ch-webhook namespace: knative-eventing data: default-ch-config: | clusterDefault: apiVersion: messaging.knative.dev/v1 kind: InMemoryChannel namespaceDefaults: example-namespace: apiVersion: messaging.knative.dev/v1beta1 kind: KafkaChannel spec: numPartitions: 2 replicationFactor: 1注意namespaceDefaults下的条目可以附带spec,用于为具体实现传入定制参数——例如 KafkaChannel 的numPartitions(分区数)和replicationFactor(副本因子)。从 configuring-eventing-cr.md 的示例还可以看到更丰富的组合,例如把 KafkaChannel 设为集群默认、同时为my-namespace配置带投递重试策略的 InMemoryChannel:
apiVersion: operator.knative.dev/v1beta1 kind: KnativeEventing metadata: name: knative-eventing namespace: knative-eventing spec: config: default-ch-webhook: default-ch-config: | clusterDefault: apiVersion: messaging.knative.dev/v1beta1 kind: KafkaChannel spec: numPartitions: 10 replicationFactor: 1 namespaceDefaults: my-namespace: apiVersion: messaging.knative.dev/v1 kind: InMemoryChannel spec: delivery: backoffDelay: PT0.5S backoffPolicy: exponential retry: 5修改默认配置的两种途径
修改默认 Channel 实现设置有两种等价途径:
- 直接编辑 ConfigMap:用
kubectl edit修改knative-eventing命名空间下的default-ch-webhook; - 通过 Eventing Operator CR:如果集群使用 Knative Operator 管理,可以在
KnativeEventing自定义资源(operator.knative.dev/v1beta1)的spec.config.default-ch-webhook下声明同样的配置,由 Operator 渲染下发。完整说明见 Configuring the Eventing Operator custom resource。
如果使用基于 Channel 的 Broker(Channel-based Broker),还可以通过config-br-default-channelConfigMap 单独设置 Broker 的默认 Channel 类型(例如从 InMemoryChannel 切换为 KafkaChannel),具体见同一文档的 Setting the default channel for the broker。
配置生效时机与生产环境警告
两个关键注意事项:
- 默认值只在创建时生效:webhook 只会在 Channel、Sequence 等资源首次创建时应用默认配置。如果之后修改了默认配置,新默认值只会作用于新建的 Channel、Broker 或 Sequence;已有资源不会自动更新以采用新配置。
- InMemoryChannel 禁止用于生产环境:它是尽力而为(best effort)的 Channel,无持久化保障,仅适用于开发场景。
创建 Channel:泛型对象与自动注入的 channelTemplate
最小 YAML 模板与 kubectl apply
开发者可以通过创建一个Channel对象实例,来创建任意受支持实现类型的 Channel(详见 create-default-channel.md)。首先按以下模板创建 YAML 文件:
apiVersion: messaging.knative.dev/v1 kind: Channel metadata: name: <example-channel> namespace: <namespace>其中:
<example-channel>是要创建的 Channel 名称;<namespace>是目标命名空间名称。
然后应用该文件:
kubectl apply -f <filename>.yaml<filename>为上一步创建的文件名。如果在default命名空间中创建该对象,按照上一节default-ch-webhook的默认配置,它会被落地为InMemoryChannel实现。
webhook 自动注入 spec.channelTemplate
Channel对象创建后,一个**变更准入 webhook(mutating admission webhook)**会根据默认 Channel 实现自动设置spec.channelTemplate。创建后的对象等效于:
apiVersion: messaging.knative.dev/v1 kind: Channel metadata: name: <example-channel> namespace: <namespace> spec: channelTemplate: apiVersion: messaging.knative.dev/v1 kind: <channel-template-kind>其中:
<example-channel>是 Channel 名称;<namespace>是命名空间;<channel-template-kind>是根据默认 ConfigMap 解析出的实现类型,例如InMemoryChannel或KafkaChannel。
!!! notespec.channelTemplate属性创建后不可修改——因为它是由默认 Channel 机制设置的,而不是用户设置的。
底层机制:代理对象与状态复制
Channel 控制器(Channel controller)会根据spec.channelTemplate创建后端 Channel 实例。使用该机制时,集群中会产生两个对象:
- 一个泛型
Channel对象; - 一个具体实现对象(如
InMemoryChannel)。
泛型对象充当具体实现对象的代理(proxy):它把 Subscriptions 复制到具体实现对象,并把具体实现对象的状态同步回自身 status。这样用户始终面向统一的ChannelAPI 编程,具体实现细节被透明封装。
使用 Subscription 建立事件投递
理解 Subscription 对象
创建好 Channel 和 Sink 之后,需要创建Subscription来启用事件投递(详见 subscriptions.md)。
Subscription 由一个Subscription对象构成,它指定了:
- Channel:事件的来源(source);
- Sink(也称 Subscriber):事件的投递目标;
- 可选的 Sink 专属选项:例如失败处理方式(dead letter sink)、回复(reply)目标等。
使用 kn CLI 创建 Subscription
在 Channel 与 Sink 之间创建 Subscription 的命令如下:
kn subscription create <subscription-name> \ --channel <Group:Version:Kind>:<channel-name> \ --sink <sink-prefix>:<sink-name> \ --sink-reply <sink-prefix>:<sink-name> \ --sink-dead-letter <sink-prefix>:<sink-name>各参数说明:
--channel:指定待处理的 CloudEvent 来源。必须提供 Channel 名称。如果使用的不是由 Channel 资源默认支撑的 Channel,就必须用<Group:Version:Kind>前缀指定 Channel 类型,例如 Kafka 支撑的 Channel 前缀为messaging.knative.dev:v1beta1:KafkaChannel。--sink:指定事件投递的目标目的地。默认情况下<sink-name>被解释为同命名空间下同名的 Knative Service。可以通过前缀指定 Sink 类型:ksvc:Knative Service;svc:Kubernetes Service;channel:作为目的地的 Channel(此处只能引用默认 Channel 类型);broker:Eventing Broker。
--sink-reply:可选参数,指定 Sink 的回复事件(reply)发送到哪里,命名约定与--sink一致。--sink-dead-letter:可选参数,指定失败时 CloudEvent 的投递位置(死信 Sink),命名约定与--sink一致。
!!! note Sink 前缀是可选的。例如可以直接写--sink <service-name>,省略ksvc前缀。
示例:创建一个名为mysubscription的 Subscription,将mychannel的事件路由到名为myservice的 Knative Service:
kn subscription create mysubscription \ --channel mychannel \ --sink myservice使用 YAML 创建 Subscription
Subscription对象的标准 YAML 模板如下:
apiVersion: messaging.knative.dev/v1 kind: Subscription metadata: name: <subscription-name> # Name of the Subscription. namespace: default spec: channel: apiVersion: messaging.knative.dev/v1 kind: Channel name: <channel-name> # Name of the Channel that the Subscription connects to. delivery: # Optional delivery configuration settings for events. deadLetterSink: # When this is configured, events that failed to be consumed are sent to the deadLetterSink. # The event is dropped, no re-delivery of the event is attempted, and an error is logged in the system. # The deadLetterSink value must be a Destination. ref: apiVersion: serving.knative.dev/v1 kind: Service name: <service-name> reply: # Optional configuration settings for the reply event. # This is the event Sink that events replied from the subscriber are delivered to. ref: apiVersion: messaging.knative.dev/v1 kind: InMemoryChannel name: <service-name> subscriber: # Required configuration settings for the Subscriber. This is the event Sink that events are delivered to from the Channel. ref: apiVersion: serving.knative.dev/v1 kind: Service name: <service-name>关键字段语义:
spec.channel:Subscription 连接的 Channel 引用;spec.subscriber(必填):订阅者(Subscriber),即从 Channel 接收事件的事件 Sink;spec.reply(可选):订阅者回复事件的投递目标;spec.delivery.deadLetterSink(可选):消费失败事件的处理目标——配置后,消费失败的事件会被发送到死信 Sink,事件被丢弃、不再重投,并记录系统错误日志;其值必须是 Destination 类型。
应用方式与 Channel 相同:
kubectl apply -f <filename>.yaml管理 Subscription 的日常操作
列出 Subscription
使用knCLI 可以列出全部现有 Subscription:
# 列出所有 Subscription kn subscription list# 以 YAML 格式列出 kn subscription list -o yaml描述 Subscription
查看单个 Subscription 的详细信息:
kn subscription describe <subscription-name>示例:
kn subscription describe mysubscription预期输出:
Name: mysubscription Namespace: default Annotations: messaging.knative.dev/creator=user@example.com messaging.knative.dev/lastModifier=user@example.com Age: 1h Channel: Channel:mychannel (messaging.knative.dev/v1) Subscriber: URI: http://myservice.default.svc.cluster.local Reply: Name: myreply Kind: InMemoryChannel API Version: messaging.knative.dev/v1 DeadLetterSink: Name: mydlq Kind: Service API Version: serving.knative.dev/v1 Conditions: OK TYPE AGE REASON ++ Ready 1h ++ AddedToChannel 1h ++ ChannelReady 1h输出中的 Conditions 是排障的关键依据:Ready表示整体就绪,AddedToChannel表示 Subscription 已被加入 Channel,ChannelReady表示底层 Channel 已就绪。
更新 Subscription
更新方式有两种:使用knCLI,或应用更新后的 YAML 文件。
方式一:kn CLI
kn subscription update mysubscription \ --sink ksvc:myservice \ --sink-dead-letter ksvc:error-handler \ --sink-reply channel:reply-channel可按需更新单个参数:
--sink:更换订阅者(事件投递目标);--sink-dead-letter:新增或更新失败投递的死信 Sink;--sink-reply:更新回复事件的发送目标。
!!! note 更新 Subscription 时,必须提供所有想要保留的配置参数。更新命令中未指定的参数将使用默认值。
方式二:kubectl
# 1. 导出当前 Subscription 配置 kubectl get subscription <subscription-name> -o yaml > subscription.yaml# 2. 编辑 YAML 文件,修改 spec 部分 # 3. 应用更新后的文件 kubectl apply -f subscription.yaml删除 Subscription
删除方式同样有两种:
# 使用 kn CLI kn subscription delete <subscription-name># 使用 kubectl kubectl delete subscription <subscription-name>进阶:Channel 在事件流(Flows)中的角色
除了直连 Sink,Channel 还是 Knative Eventing事件流(Flows)的基石。仓库在 flows 目录 中定义了基于 CRD 的组合原语:
- Sequence:定义一组有序执行的函数列表,前一个函数的输出作为下一个的输入,适合流水线式处理(示例见 sequence.yaml);
- Parallel:定义一组分支,每个分支接收同一个 CloudEvent,适合并行分发场景(详见 parallel.md)。
在这些组合原语的实现中,Channel 同样承担事件中转与扇出职责——例如 Sequence 内部会创建 Channel 将上游事件依次传导。这意味着你掌握的本篇能力(默认 Channel 配置、Subscription 管理)可以直接复用到事件流编排中。
小结与延伸阅读
Channel 是 Knative Eventing 中"事件转发与持久化层"的统一抽象:泛型Channel对象配合default-ch-webhook默认机制与变更准入 webhook,让开发者无需关心具体实现即可创建事件枢纽;Subscription 则负责把 Channel 与 Sink 连接起来,并通过 reply、dead letter sink 等选项精细控制投递语义。配置默认类型、创建 Channel、管理 Subscription 这三步构成了事件投递链路的完整闭环。
继续深入可阅读:
- Channel types and defaults:默认类型与
default-ch-webhook配置的完整示例; - Creating a Channel using cluster or namespace defaults:泛型 Channel 创建与
channelTemplate注入机制; - Subscriptions:Subscription 完整操作手册;
- Available Channels list:当前可用 Channel 实现清单;
- Configure Channel defaults:
default-ch-webhook默认配置的权威说明; - Configuring the Eventing Operator custom resource:通过 Operator CR 配置默认 Channel;
- Knative Eventing 概述:Eventing 整体架构与安装入口(安装文档)。
- 文档
- 教程
- 云原生
【免费下载链接】docs
User documentation for Knative components.
相关推荐
Knative Eventing 中 Apache Kafka Channel 的安装、配置与实战指南
Knative Eventing 中 Apache Kafka Channel 的安装、配置与实战指南 本篇技术指南以 code samples/eventin
文档教程云原生react-native-exception-handler源码解析:如何优雅拦截React Native崩溃
react native exception handler源码解析:如何优雅拦截React Native崩溃 react native exception h
TypeGraphQL 订阅(Subscription)实战指南:@Subscription 装饰器、PubSub 事件触发与自定义订阅源
TypeGraphQL 订阅(Subscription)实战指南:@Subscription 装饰器、PubSub 事件触发与自定义订阅源 GraphQL 的
后端GraphQLAPI设计
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考