通过 SSH 隧道从 Kafka 集群消费
Consume from a Kafka Cluster through SSH Tunnel
我们正在尝试使用 Java 客户端从 Kafka 集群中消费。集群位于跳转主机后面,因此唯一的访问方式是通过 SSH 隧道。但是我们无法读取,因为一旦消费者获取元数据,它就会使用原始主机连接到代理。可以覆盖此行为吗?我们可以要求 Kafka Client 不使用元数据吗?
据我所知还没有。
当我需要做类似的事情时,我使用的技巧是:
- 为每个 Kafka 代理设置一个虚拟接口[=52=]
- 打开到每个代理的隧道,以便代理 n 绑定到虚拟接口 n
- 配置您的
/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
当然,代理列表取决于广告侦听器代理设置。
我们正在尝试使用 Java 客户端从 Kafka 集群中消费。集群位于跳转主机后面,因此唯一的访问方式是通过 SSH 隧道。但是我们无法读取,因为一旦消费者获取元数据,它就会使用原始主机连接到代理。可以覆盖此行为吗?我们可以要求 Kafka Client 不使用元数据吗?
据我所知还没有。
当我需要做类似的事情时,我使用的技巧是:
- 为每个 Kafka 代理设置一个虚拟接口[=52=]
- 打开到每个代理的隧道,以便代理 n 绑定到虚拟接口 n
- 配置您的
/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
当然,代理列表取决于广告侦听器代理设置。