在 strimzi 上部署 kafka

kafka deployment on strimzi

我正在尝试使用 strimzi 部署 kafka,问题是,它将 kafka 代理公开为负载平衡器并为它们分配外部 IP。我希望 kafka 代理在内部可用并仅通过负载均衡器公开。下面是我的部署文件。

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    version: 3.1.0
    replicas: 2
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: false
      - name: external
        port: 9094
        type: loadbalancer
        tls: false
    config:
      offsets.topic.replication.factor: 2
      transaction.state.log.replication.factor: 2
      transaction.state.log.min.isr: 2
      default.replication.factor: 2
      min.insync.replicas: 2
      inter.broker.protocol.version: "3.1"
    storage:
      type: ephemeral
  zookeeper:
    replicas: 2
    storage:
      type: ephemeral

下面集群的截图

如您所见,有 3 个分配了外部 IP 的负载均衡器,而我希望它是一个具有外部 IP 和 2 个 kafka 代理的负载均衡器。

这是因为 Kafka 的设计方式。客户端需要直接访问集群中的每个代理。因此,负载均衡器 - 虽然公开集群很方便 - 但实际上并没有 load-balance 任何东西。它只是路由连接。例如,您可以在此博客 post 系列中找到有关它如何以及为何如此工作的更多详细信息:https://strimzi.io/blog/2019/04/17/accessing-kafka-part-1/

是的,基于 Kafka 发现协议,此行为是正确的。那么先来了解一下吧-

  1. 经过身份验证的 Kafka 客户端在期间连接到任何代理 第一个连接(这是使用 Kubernetes 完成的 服务)
  2. 代理 returns one/more 个主题的元数据。
  3. 在获得所需领导分区的详细信息后,客户端打开到该特定代理的新连接。即使客户端需要连接到第一个代理,它也会终止现有连接 (#1) 并启动与该代理的新连接。

现在我们知道 Kafka 客户端直接连接到代理以获取 sending/receiving 记录,负载均衡器仅在初始连接时出现,并将客户端重定向到可用的任何一个经纪人。 现在假设,如果我们也将负载均衡器用于后续连接,将会发生什么——负载均衡器会将客户端连接到任何可用的代理,这些代理可能有也可能没有客户端想要连接的分区领导者。所以 Kafka 使用上面描述的发现协议来处理这个东西。