使用负载平衡器终止 Kafka/SSL 个连接
Using load balancer to terminate Kafka/SSL connections
我们有两个 Kafka 节点,出于本问题范围之外的原因,我们想设置一个负载均衡器来终止与生产者(客户端)的 SSL。负载均衡器托管的 SSL 证书将由 trusted/root 客户端应本机信任的 CA 签名。
所以连接看起来像:
Kafka Producers <---SSL/Port 9094--> Load Balancer <---TCP/Port 9092 ---> Kafka Node
这是否可行,或者 Kafka 是否需要直接在 Kafka 服务器本身上设置 SSL?
谢谢!
原来 Kafka 有自己的内部负载平衡协议,在 Kafka 客户端和他们的代理之间添加任何第 3 方平衡器会干扰该协议并导致非常奇怪的行为。
不要这样做。
我想要这样做的动机是因为我未能让 SSL 在客户端和代理之间正常工作,我认为在负载平衡器处终止 SSL,然后允许平衡器和代理之间的明文通信可以解决我的问题. 没有。不要这样做。
或者:
- 弄清楚如何让 SSL 在客户端和代理之间工作(Kafka 官方用户邮件列表 非常好 帮助我实现了这一点);或
- 不要require/support SSL 连接;或
- 在你的 Kafka 前面放一个网络服务
是的,你完全可以做到这一点,我将使用 AWS 的 ELB 作为我设置它的示例。
我们有一个 Kafka 集群,集群中的 producers/consumers 使用了一个“私有”侦听器,我们在 public 中也有 producers/consumers 使用了“public “听众。因此,我们必须使用 SSL 保护 public producer/consumer 流量。 Kafka 集群位于 ELB 后面,在从 public producers/consumers.
接收流量后,ELB 发生 SSL 终止
为代理设置的关键道具是(注意这些是 docker 容器的环境变量):
- 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
现在,对于public producers/consumers,要设置的关键道具是
props.put("security.protocol", "SSL");
请注意,即使 public Kafka 客户端使用 SSL,在它到达代理之前,SSL 在 ELB 内终止,因此 Kafka 集群只能使用 PLAINTEXT 运行。此外,public Kafka 客户端需要连接 ELB_DNS.
我不会详细介绍如何设置 ELB 和证书,但您只需要让 ELB 侦听器启用 TLS 并应用相关证书。在我们的例子中,我们让侦听器将流量转发到 9093 和 8081(架构注册表)的 Kafka 代理实例。
最后,如果您使用的是架构注册表,请务必记住将权限从 http 更改为 https。
我们有两个 Kafka 节点,出于本问题范围之外的原因,我们想设置一个负载均衡器来终止与生产者(客户端)的 SSL。负载均衡器托管的 SSL 证书将由 trusted/root 客户端应本机信任的 CA 签名。
所以连接看起来像:
Kafka Producers <---SSL/Port 9094--> Load Balancer <---TCP/Port 9092 ---> Kafka Node
这是否可行,或者 Kafka 是否需要直接在 Kafka 服务器本身上设置 SSL?
谢谢!
原来 Kafka 有自己的内部负载平衡协议,在 Kafka 客户端和他们的代理之间添加任何第 3 方平衡器会干扰该协议并导致非常奇怪的行为。
不要这样做。
我想要这样做的动机是因为我未能让 SSL 在客户端和代理之间正常工作,我认为在负载平衡器处终止 SSL,然后允许平衡器和代理之间的明文通信可以解决我的问题. 没有。不要这样做。
或者:
- 弄清楚如何让 SSL 在客户端和代理之间工作(Kafka 官方用户邮件列表 非常好 帮助我实现了这一点);或
- 不要require/support SSL 连接;或
- 在你的 Kafka 前面放一个网络服务
是的,你完全可以做到这一点,我将使用 AWS 的 ELB 作为我设置它的示例。
我们有一个 Kafka 集群,集群中的 producers/consumers 使用了一个“私有”侦听器,我们在 public 中也有 producers/consumers 使用了“public “听众。因此,我们必须使用 SSL 保护 public producer/consumer 流量。 Kafka 集群位于 ELB 后面,在从 public producers/consumers.
接收流量后,ELB 发生 SSL 终止为代理设置的关键道具是(注意这些是 docker 容器的环境变量):
- 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
现在,对于public producers/consumers,要设置的关键道具是
props.put("security.protocol", "SSL");
请注意,即使 public Kafka 客户端使用 SSL,在它到达代理之前,SSL 在 ELB 内终止,因此 Kafka 集群只能使用 PLAINTEXT 运行。此外,public Kafka 客户端需要连接 ELB_DNS.
我不会详细介绍如何设置 ELB 和证书,但您只需要让 ELB 侦听器启用 TLS 并应用相关证书。在我们的例子中,我们让侦听器将流量转发到 9093 和 8081(架构注册表)的 Kafka 代理实例。
最后,如果您使用的是架构注册表,请务必记住将权限从 http 更改为 https。