使用 Apache Kafka 进行本地 Knative 开发 ¶
发布日期:2023-01-12, 修订日期:2024-01-17
使用 Apache Kafka 进行本地 Knative 开发¶
作者:Matthias Weßendorf,红帽首席软件工程师
在这篇博文中,您将学习如何使用 Knative Broker 和 Apache Kafka 为您的本地开发创建类似生产的环境。
Apache Kafka 的 Knative Broker 实现 是 Knative Broker API 的 Kafka 原生实现,与使用基于通道的 Knative Broker 实现相比,它提供了一些改进,例如减少网络跳跃、支持任何 Kafka 版本以及与 Apache Kafka 的更好集成,用于 Broker 和触发器模型。
选择本地开发环境¶
在每个项目的开始,一个重要的方面始终是使开发过程尽可能简单和现实。
使用 Knative Broker API 时,开发环境的第一个想法可能是使用 MTChannelBasedBroker
参考代理(由 InMemoryChannel
支持)作为主要开发工具,因为它的运行不需要额外的系统。
但是,虽然 Knative Broker 的 API 是通用的,并且当然对任何代理实现来说都是相同的,但不同的代理实现之间仍然存在一些行为差异。当然,像 Apache Kafka 这样的系统与“内存中”存储相比完全不同。
从头到尾使用 Apache Kafka¶
当目标是 Apache Kafka 时,您也应该直接在开发环境中使用它,虽然 Apache Kafka 在运行方面有一些小的开销,但好消息是,使用 Strimzi 运算符 和 3.0+ 版本的 Apache Kafka,只需使用单个节点 Kafka 集群就可以非常轻松地进行开发,并且仍然接近现实环境。
不需要 Apache Zookeeper!¶
这完全归功于 Kafka 的 KRaft
功能。它在过去几年中一直在开发,最近被宣布为 生产功能 Apache Kafka 3.3.1。
Strimzi 运算符提供了一个 功能门 来使用它,因为它的版本为 0.29。KRaft
本身是 Raft 共识算法 的实现,它直接驻留在 Apache Kafka 中,消除了对像 Zookeeper 这样的第三方工具的需求。
在 Kubernetes 上使用 Strimzi 设置 Apache Kafka¶
为了在您的开发环境(例如 kind 或 minikube)上创建 Apache Kafka 集群,您需要先安装 Strimzi 运算符。
kubectl create namespace kafka
kubectl create -f 'https://strimzi.io/install/latest?namespace=kafka' -n kafka
安装完成后,您需要 修补
运算符的 部署
以启用所需的特征门
kubectl -n kafka set env deployment/strimzi-cluster-operator STRIMZI_FEATURE_GATES=+UseStrimziPodSets,+UseKRaft
运算符的 pod 运行起来后,您可以使用以下 YAML 片段定义一个单节点 Apache Kafka 集群
cat <<-EOF | kubectl -n kafka apply -f -
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
version: 3.3.1
replicas: 1
listeners:
- name: plain
port: 9092
type: internal
tls: false
- name: tls
port: 9093
type: internal
tls: true
config:
offsets.topic.replication.factor: 1
transaction.state.log.replication.factor: 1
transaction.state.log.min.isr: 1
default.replication.factor: 1
min.insync.replicas: 1
inter.broker.protocol.version: "3.3"
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 100Gi
deleteClaim: false
# With KRaft not relevant:
zookeeper:
replicas: 1
storage:
type: persistent-claim
size: 100Gi
deleteClaim: false
EOF
注意:
Kafkas.kafka.strimzi.io
CR 目前需要您描述zookeeper
字段,但当启用UseKRaft
特征门时,它会被忽略。要详细了解UseKRaft
,您可以观看 此演示。
上面的配置将创建一个单节点 Apache Kafka,它完全不需要 Zookeeper 实例
kubectl get pods -n kafka
NAME READY STATUS RESTARTS AGE
my-cluster-kafka-0 1/1 Running 0 2h1m
strimzi-cluster-operator-6d94c67fd8-wfmvl 1/1 Running 1 (1h46m ago) 2h1m
安装 Knative Eventing 和 Apache Kafka 的 Knative Broker¶
Apache Kafka 在我们的开发实例上运行起来后,我们安装 Knative Eventing 和 Apache Kafka 的 Knative Broker 实现。
Eventing Core¶
使用 Knative Kafka 代理时,我们只需要安装 Knative Eventing 的最基本设置,即它的 eventing-core
清单,因为它提供了所有 API 以及 controller
和 webhook
pod
kubectl apply --filename https://github.com/knative/eventing/releases/download/knative-v1.8.4/eventing-core.yaml
完成之后,Knative Eventing 将运行正好两个 pod
kubectl get pods -n knative-eventing
NAME READY STATUS RESTARTS AGE
eventing-controller-7b95f495bf-dkqtl 1/1 Running 0 2h1m
eventing-webhook-8db49d6cc-4f847 1/1 Running 0 2h1m
Knative Kafka Broker 安装¶
作为下一步,我们需要安装 Knative Kafka 代理的控制平面和数据平面
kubectl apply --filename https://github.com/knative-extensions/eventing-kafka-broker/releases/download/knative-v1.8.4/eventing-kafka-controller.yaml
kubectl apply --filename https://github.com/knative-extensions/eventing-kafka-broker/releases/download/knative-v1.8.4/eventing-kafka-broker.yaml
之后,我们的 knative-eventing
命名空间中将有四个新的 pod,用于我们的 Knative Kafka Broker
kubectl get pods -n knative-eventing
NAME READY STATUS RESTARTS AGE
eventing-controller-7b95f495bf-dkqtl 1/1 Running 0 2h4m
eventing-webhook-8db49d6cc-4f847 1/1 Running 0 2h4m
kafka-broker-dispatcher-859d684d7d-frw6p 1/1 Running 0 2h4m
kafka-broker-receiver-67b7ff757-rk9b6 1/1 Running 0 2h4m
kafka-controller-7cd9bd8649-d62dh 1/1 Running 0 2h4m
kafka-webhook-eventing-f8c975b99-vc969 1/1 Running 0 2h4m
将 Kafka 代理类设置为默认¶
为了简化 Knative Kafka 代理的使用,我们将它配置为默认代理。首先,我们指定一个全局配置,指向我们的单节点 Apache Kafka 集群
cat <<-EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
name: kafka-broker-config
namespace: knative-eventing
data:
default.topic.partitions: "10"
default.topic.replication.factor: "1"
bootstrap.servers: "my-cluster-kafka-bootstrap.kafka:9092"
EOF
需要注意的是,复制因子与系统中 Kafka pod 的数量相关联。我们使用 1
,因为我们为 Apache Kafka 操作的是一个单节点集群。
最后,我们更新 Knative Eventing 的 config-br-defaults
ConfigMap,以反映 Knative Kafka 代理应该是系统中的默认代理
cat <<-EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
name: config-br-defaults
namespace: knative-eventing
data:
default-br-config: |
clusterDefault:
brokerClass: Kafka
apiVersion: v1
kind: ConfigMap
name: kafka-broker-config
namespace: knative-eventing
EOF
除了将 brokerClass
设置为 Kafka
之外,我们还引用了上面的 kafka-broker-config
配置,以便所有新的代理对象都依赖于此设置。此时,我们完成了与安装和配置相关的任务,我们可以简单地创建一个新的 Knative Broker 对象,利用我们的 Knative Kafka Broker 实现
cat <<-EOF | kubectl apply -f -
apiVersion: eventing.knative.dev/v1
kind: Broker
metadata:
name: my-demo-kafka-broker
spec: {}
EOF
在集群上创建了一个最小资源,代表一个 Knative Kafka 代理对象
kubectl get brokers.eventing.knative.dev
NAME URL AGE READY REASON
my-demo-kafka-broker http://kafka-broker-ingress.knative-eventing.svc.cluster.local/default/my-demo-kafka-broker 2h6m True
结论¶
借助 Apache Kafka 上的 KRaft
功能和 Strimzi 运算符,我们可以轻松地在 Kubernetes 上操作一个单节点 Apache Kafka 集群,使我们的本地开发流程能够尽早开始使用真正的持久化系统,而不是内存中的存储。KRaft 确实减少了 Apache Kafka 的占用空间,并允许用户在真正的(但仍很小的)Apache Kafka 集群上进行顺利的开发。
此处可以找到所述设置的安装脚本:此处。