跳至内容

使用 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

为了在您的开发环境(例如 kindminikube)上创建 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 以及 controllerwebhook 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 集群上进行顺利的开发。

此处可以找到所述设置的安装脚本:此处

我们使用分析和 Cookie 来了解网站流量。为此,我们会与 Google 共享您使用我们网站的信息。了解更多。