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

时间:2016-11-17 21:45:28

标签: ssl apache-kafka load-balancing

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

所以连接看起来像:

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

这可能吗,或者Kafka是否需要直接在Kafka服务器上设置SSL?

谢谢!

2 个答案:

答案 0 :(得分:1)

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

不要这样做。

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

或者:

  1. 弄清楚如何让客户端和代理之间的SSL工作(官方Kafka用户邮件列表优秀帮助我实现这一目标);或
  2. 不要求/支持SSL连接;或
  3. 在Kafka面前放置一项网络服务

答案 1 :(得分:0)

是的,您完全可以做到这一点,而我将以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集群只能与PLAINTEXT一起使用。此外,公开的Kafka客户端需要连接ELB_DNS。

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

最后,如果您使用的是架构注册表,请确保记住将权限从http更改为https。