【问题标题】:Unable to connect to Kafka from outside application无法从外部应用程序连接到 Kafka
【发布时间】:2020-06-02 09:44:52
【问题描述】:

我有两台 docker 机器,我想在 docker swarm 中创建一个 kafka 集群。我的docker-compose.yml 看起来像这样:

version: '3.2'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka:latest
    ports:
      - "9092:9092"
      - "29092:29092"
    environment:
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_LISTENERS: PLAINTEXT://:9092,PLAINTEXT_HOST://:29092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092

我关注了这个问题:Unable to connect to Kafka run in container from Spring Boot app run outside container,我正在尝试使用 localhost:29092 从外部访问 kafka。

我已经在 kafka 中创建了主题mytesttopic。以下python代码:

from kafka import KafkaConsumer, SimpleProducer, TopicPartition, KafkaClient


def consume_from_topic():
    try:
        consumer = KafkaConsumer('mytesttopic',
                                 group_id= None,
                                 bootstrap_servers=['localhost:29092'],
                                 auto_offset_reset='earliest')

        for message in consumer:
            #consumer.commit()
            print ("%s:%d:%d: key=%s value=%s" % (message.topic, message.partition,
                                                  message.offset, message.key,
                                                  message.value))
    except Exception as e:
        print(e)
        pass



if __name__ == '__main__':
    consume_from_topic()

返回:

没有经纪人可用

有人知道我在这里缺少什么吗?

【问题讨论】:

  • 你提到你在两台机器上运行 docker swarm,你从哪个源运行 python 应用程序? docker 节点之一还是您的本地机器?
  • 在我的本地机器上。
  • 你执行哪个命令来调出堆栈?

标签: docker apache-kafka docker-swarm


【解决方案1】:

假设您在其他 2 台机器上运行 docker swarm,您将无法在 localhost:29092 上连接,因为 kafka 将暴露在 docker swarm 节点上的端口 29092 上。尝试使用您的一个节点的主机名 + 端口 29092 连接到 kafka。您应该可以通过这种方式连接到 kafka。

请注意,这仅在您使用routing mesh 运行 docker swarm 时才有效,路由网格确保每个节点在已发布端口上接受任何服务的传入请求,无论它是否在同一主机上运行并确保流量到达运行容器的实际主机。

如果您尚未设置路由网格,请尝试连接到运行 kafka 容器的实际主机名(不推荐,但出于测试目的,它可以工作)

希望对你有帮助!

【讨论】:

  • 主机名为 manager。你的意思是 bootstrap_servers=['manager:29092'] ?如果是这样,这不起作用
  • @Telperinquar,你能 ping 经理:29092 吗?这是您可以使用此主机名访问的 docker 节点之一?
  • 不,我无法 ping。我找到了主机名:docker node ls,对吧?
  • @Telperinquar,即 swarm 自身中该节点的主机名,您需要该节点的 IP 地址或您还需要通过 SSH 连接到您的节点的主机名
  • ip 是 192.168.99.100 无法ping通
【解决方案2】:

你的听众完全一样。

您需要设置PLAINTEXT_HOST://0.0.0.0:29092 将监听器绑定到所有接口

【讨论】:

    猜你喜欢
    • 2018-01-04
    • 2020-06-25
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    相关资源
    最近更新 更多