通过 SSH 隧道从 Kafka 集群消费

Consume from a Kafka Cluster through SSH Tunnel

我们正在尝试使用 Java 客户端从 Kafka 集群中消费。集群位于跳转主机后面,因此唯一的访问方式是通过 SSH 隧道。但是我们无法读取,因为一旦消费者获取元数据,它就会使用原始主机连接到代理。可以覆盖此行为吗?我们可以要求 Kafka Client 不使用元数据吗?

据我所知还没有。

当我需要做类似的事情时,我使用的技巧是:

  1. 为每个 Kafka 代理设置一个虚拟接口[=52​​=]
  2. 打开到每个代理的隧道,以便代理 n 绑定到虚拟接口 n
  3. 配置您的 /etc/hosts 文件,以便将代理 n 的广告主机名解析为虚拟接口 n 的 IP。

Es.

Kafka 经纪人:

  • broker1(广告为 broker1.mykafkacluster)
  • broker2(广告为 broker2.mykafkacluster)

虚拟接口:

  • veth1 (192.168.1.1)
  • veth2 (192.168.1.2)

隧道:

  • 经纪人 1:ssh -L 192.168.1.1:9092:broker1.mykafkacluster:9092 jumphost
  • 经纪人2:ssh -L 192.168.1.2:9092:broker1.mykafkacluster:9092 jumphost

/etc/hosts:

  • 192.168.1.1 broker1.mykafkacluster
  • 192.168.1.2 broker2.mykafkacluster

如果您像这样配置系统,您应该能够访问 Kafka 集群中的所有代理。

注意:如果您将 Kafka 代理配置为通告 IP 地址而不是主机名,该过程仍然有效,但您需要使用相同的 IP 地址配置虚拟接口经纪人做广告。

如果代理通告主机名,您实际上不必添加虚拟接口即可通过 SSH 隧道访问代理。在客户端的 /etc/hosts 中添加主机条目并将隧道绑定到添加的名称就足够了。

假设 broker.kafkacluster 是您经纪人的 advertised.hostname:

/etc/hosts:
127.0.2.1broker.kafkacluster

隧道:
ssh -L broker.kafkacluster:9092:broker.kafkacluster:9092 <brokerhostip/name>

对我来说绝对最好的解决方案是使用 kafkatunnel (https://github.com/simple-machines/kafka-tunnel)。工作得很好。

像这样 sshuttle 试试:

sshuttle -r user@host broker-1-ip:port broker-2-ip:port broker-3-ip:port

当然,代理列表取决于广告侦听器代理设置。