首页 > 解决方案 > 无法从网络设备正确发送到 kafka-docker

问题描述

我正在尝试在我的主机机器上设置 Kafka / Docker 设置并从网络设备连接到它。我正在使用 bitnami/kafka。这是我的 docker-compose 文件:

version: '2'

services:
  zookeeper:
    image: 'bitnami/zookeeper:3'
    ports:
      - '2181:2181'
    volumes:
      - 'zookeeper_data:/bitnami'
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes
  kafka:
    image: 'bitnami/kafka:2'
    ports:
      - '9092:9092'
      - '29092:29092'
    volumes:
      - 'kafka_data:/bitnami'
    environment:
      - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
      - ALLOW_PLAINTEXT_LISTENER=yes
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,PLAINTEXT_HOST://:29092
      - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
    depends_on:
      - zookeeper

volumes:
  zookeeper_data:
    driver: local
  kafka_data:
    driver: local

当我在我的主机机器(不在 docker 内)上运行我的 python 脚本并且水银是我主机的名称时,它工作得很好:

from kafka import KafkaProducer

producer = KafkaProducer(bootstrap_servers=['mercury:29092'])
print("Connected")
producer.send('topic', b'It works!')
print('Theoretically send')
producer.close()
print('Closed')

当我尝试从另一个网络设备运行相同的脚本时,它不起作用。我什至没有收到错误。该脚本也运行良好,因此在尝试连接或发送时没有延迟。只有当我使用错误的端口或不存在的主题时才会发生这种情况。特别是最后一部分让我相信脚本可以连接但不能正确发送消息。我不确定为什么会这样。我的端口设置正确还是需要一些额外的 kafka 环境设置?

在此先感谢您的帮助

标签: dockernetworkingapache-kafkabitnami

解决方案


问题在于 Kafka 的广告侦听器的配置。

TL/DR;更改PLAINTEXT_HOST://localhost:29092PLAINTEXT_HOST://mercury:29092in KAFKA_CFG_ADVERTISED_LISTENERS,您的 Kafka 集群应该可以从其他机器访问。

在更复杂的网络中,可能希望有一个内部网络和一个外部网络,例如由于不同的安全要求。listenersKafka 允许通过分别设置和来区分它们advertised.listenersAdvertising.listeners的条目应该代表可以从集群外部的客户端访问 Kafka 集群的 URL。如果限制为localhost,则除了您的主机之外,没有任何机器可以连接到集群。


推荐阅读