当前位置: 首页 > 知识库问答 >
问题:

使用负载平衡器终止Kafka/SSL连接

戈华茂
2023-03-14

我们有两个Kafka节点,出于本问题范围之外的原因,我们希望设置一个负载平衡器来终止生产者(客户端)的SSL。负载平衡器托管的SSL证书将由客户端本机应信任的受信任/根CA签名。

所以连接看起来像:

Kafka Producers <---SSL/Port 9094--> Load Balancer <---TCP/Port 9092 ---> Kafka Node

这是否可行,或者Kafka是否以某种方式要求直接在Kafka服务器上设置SSL?

谢谢

共有2个答案

夔修伟
2023-03-14

是的,你完全可以做到这一点,我将使用AWS的ELB作为我设置它的示例。

我们有一个Kafka集群,集群中的生产者/消费者使用“私有”侦听器,我们还有公共生产者/消费者使用“公共”侦听器。因此,我们必须使用SSL保护公共生产者/消费者流量。Kafka集群位于ELB的后面,在接收到来自公共生产者/消费者的流量后,SSL在ELB终止。

要为代理设置的关键道具是(请注意,这些是docker容器的env vars):

      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://${BROKER_NODE_PRIVATE_HOST}:9092,CLIENT://${ELB_DNS}:9093
      - KAFKA_LISTENERS=PLAINTEXT://${BROKER_NODE_PRIVATE_HOST}:9092,CLIENT://${BROKER_NODE_PRIVATE_HOST}:9093
      - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CLIENT:PLAINTEXT

现在,对于公共生产者/消费者来说,关键的支柱是

props.put("security.protocol", "SSL");

请注意,尽管公共Kafka客户端使用SSL,但在到达代理之前,SSL会在ELB中终止,因此Kafka集群只能使用明文操作。此外,公共Kafka客户端需要连接ELB\U DNS。

我不会详细介绍ELB和证书是如何设置的,但您只需要让ELB侦听器启用TLS并应用相关证书。在我们的例子中,我们让侦听器将流量转发到9093和8081(模式注册表)的Kafka代理实例。

最后,如果您使用的是架构注册表,请务必记住将权限从超文本传输协议更改为https。

诸葛茂勋
2023-03-14

事实证明,Kafka有自己的内部负载平衡协议,在Kafka客户端及其代理之间添加任何第三方平衡器都会干扰该协议并导致非常奇怪的行为。

不要这样做。

我想这样做的动机是因为我未能让SSL在客户端和代理之间正常工作,我认为在负载均衡器处终止SSL,然后允许均衡器和代理之间的明文通信会解决我的问题。它没有。不要这样做。

要么:

  1. 弄清楚如何让SSL在客户端和经纪人之间工作(官方的Kafka用户邮件列表非常适合帮助我实现这一点);或者
  2. 不需要/支持SSL连接;或者
  3. 将Web服务放在您的Kafka前面
 类似资料:
  • 我有一个java应用程序在两个ec2实例中运行,客户可以使用AWS应用程序负载均衡器访问它们。现在ALB可以作为SSL终止点工作。所有请求都通过端口443上的ALB。工作正常。问题是java应用程序有时需要重定向到不同的路径。由于java应用程序不知道它在SSL ALB后面运行,因此重定向路径包括超文本传输协议://而不是https:// 有什么方法可以在我的应用程序之外将协议修改为https?

  • 目标:将弹性/静态IP分配给负载平衡器(LB),以服务于处理DNS(端口53)、HTTPS(端口443)、HTTP(端口80)的EC2实例。 需要静态IP来正确配置DNS记录(即A记录)。需要在后端/服务器上终止TLS,以提供无限制的 经典的负载平衡器允许自定义安全规则,并允许在EC2实例上终止SSL。问题是静态IP不能分配给经典LB,只能分配给其中的单个实例,这无法平衡负载。 要分配静态IP,我

  • 过去,我在Ubuntu上为使用了以下配置文件。它做以下工作: SSL终止 负载均衡器 插入自定义标头 记录调用 我想用部署为OpenShift集群中的pod的复制相同的内容。我可以在OpenShift集群的目录中看到。当我尝试启动一个时,它显示了一个GitHub存储库的字段,其中包含一个示例存储库--https://GitHub.com/sclorg/nginx-ex.git

  • 我们有一个在ec2实例上运行的web应用程序。我们添加了AWS ELB,以将所有请求路由到负载平衡器的应用程序。SSL证书已应用于ELB。 我担心ELB和ec2实例之间的HTTP通信是否安全?或者我应该在ELB和ec2实例之间使用HTTPS通信吗? AWS是否保证ELB和ec2实例之间HTTP通信的安全性?

  • 我正在使用AWS应用程序负载平衡器来设置我的环境。 应用程序负载平衡器在端口443接收来自Internet的请求,并将其转发到端口80 Apache服务器在EC2服务器上运行,docker位于负载平衡器后面的端口80上<我的网站是用CakePHP开发的<我打电话的时候https://www.example.com,我的网页已加载 然而,在PHP中,当我使用以下代码获取当前url时,得到的url是h

  • 是否可以将9093用作loadbalncer类型的侦听器端口,或者它将仅与9094一起用于strimzi kafka? 谢谢,sgv