Kafka和防火墙规则

Geo*_*ith 18 apache-kafka kafka-consumer-api

我们有一个相当严格的网络细分政策.我正在使用云代工实例来部署应用程序.已设置防火墙规则以从云代工厂实例中到达kafka群集.我相信防火墙规则也已设置为访问zookeeper实例.我需要确实确认一个.

我的问题似乎是我可以向kafka发送消息,但我的消费者似乎并没有接受它们.它似乎在"投票"时挂起.

我的防火墙规则是否需要处理一些隐藏的主机或端口,而这些规则不仅仅是kafka和zookeeper节点的标准主机和端口?

小智 22

卡夫卡和动物园管理员是不同的事情.如果您在同一台计算机上运行,​​则需要打开两个corse端口.

kafka默认端口:

  • 9092,可以在server.properties上更改;

zookeeper默认端口:

  • 2181用于客户端连接;
  • 2888为追随者(其他动物园管理员节点)连接;
  • 3888用于节点间连接;

而已.

Kafka,也有听众advertised.listeners属性,这对第一个用户产生了一些混乱.为简化起见,listener是服务器将绑定的网络接口,advertised.listeners是您的服务器将在zookeeper上注册并侦听请求的主机名或IP.如果您在其中放置主机名,则客户端必须使用主机名进行连接.该advertised.listeners url是一个你的客户端将使用来引导连接.建立连接后,您的客户端将获得与zookeeper的连接以获取其他经纪人网址.你的制作人因此没有工作.

所以,要使它工作,你需要在你的防火墙上打开2888,而不仅仅是2181.而@Jaya Ananthram在他告诉你kafka需要2181端口时错了.这是一个动物园管理员港口.kafka 0.10剧照的消费者需要联系zookeeper来坚持一些事情,就是这样.

Kafka 0.11.0.0改变了这一点,并且让客户根本不需要zookeeper.


小智 3

TL;DR:没有隐藏端口。检查您的经纪人配置。确保它公布 Kafka 消费者可以访问的 IP/端口。


在作为消费者使用 kafka-python 库使用 Kafka 0.10.1.1 遇到同样的问题后,我遇到了这个问题。

不。我捕获了网络流量,它没有使用任何其他端口与 Kafka 进行通信。如果代理配置为使用 9092,它将是消费者使用的唯一端口。

但经过进一步调查,在我的案例中,代理配置有问题。

kafka.advertished.listeners = PLAINTEXT://[private_ip]:9092,SSL://[public_ip]:9093 kafka.listeners = PLAINTEXT://0.0.0.0:9092,SSL://0.0.0.0:9093

我使用[public_ip]:9092作为引导服务器,因为我没有设置 PKI,但我想从公共互联网测试我的消费者。

消费者能够连接到代理,但无法提取任何消息。

由于消费者使用 PLAINTEXT 连接到 Kafka,因此 Kafka 公布的是 PLAINTEXT 代理地址而不是 SSL 地址。然后,消费者尝试使用私有 IP 地址而不是公共 IP 地址来访问 Kafka 代理。(由原始网络捕获揭示)

在代理和客户端中启用并配置 PKI 后,我能够很好地从公共互联网中提取消息。

  • 这个答案具有误导性。虽然对于独立 Kafka 实例来说是正确的,但它没有考虑到在集群中运行时 Kafka 还需要端口 2888 和 3888 用于追随者连接和领导者选举。问题是关于 Kafka 集群,而不是独立实例。 (3认同)