【问题标题】:Kafka in a Docker Container - External and and Internal connectionsDocker 容器中的 Kafka - 外部和内部连接
【发布时间】:2021-01-07 00:38:54
【问题描述】:

我有一种情况,Kafka 使用网络中的特定 IP 地址在 docker 容器中运行。使用以下命令创建网络

sudo docker network create --subnet=172.19.0.0/16  --gateway 172.19.0.1 --ip-range=172.19.0.1/24 my_net

Kafka 容器使用以下方式启动

docker run -d --name kafkanode --net my_net --hostname=kafkahost01 kafka_zook:212-358 -p 2181:2181 -p 9092:9092 tail -f /dev/null

我有来自不同容器的同一主机中的生产者。 Kafka 的 server.properties 如下所示的简单配置适用于同一主机内和不同容器中的生产者。

listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://kafkahost01:9092

但是,在我们的例子中,我们将有生产者,他们也将从该机器外部发送消息。

不幸的是,我无法从 docker 主机外部进行连接。有人可以帮我配置一下吗?

我们使用的是 Kafka 2.12-2.6.0 动物园管理员——3.5.8

使用以下值编辑的服务器属性

 listeners=INTERNAL://0.0.0.0:29092,EXTERNAL://0.0.0.0:9092 
 listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT 
 advertised.listeners=INTERNAL://kafkahost01:29092,EXTERNAL://10.20.30.40:9092 
 inter.broker.listener.name=INTERNAL 

谢谢 巴拉吉

【问题讨论】:

  • 只需为外部访问添加另一个侦听器
  • @OneCricketeer 和 x4k3p 谢谢。收到以下错误 INFO:kafka.conn: [IPv4 ('10.20.30.40', 9092)]>: Connection complete。 Traceback(最近一次通话最后): producer.send(b'tweets',value=kafka_data) 文件“C:kafka.py”,第 576 行,在 send self._wait_on_metadata(topic, self.config['max_block_ms'] / 1000.0) _wait_on_metadata 中的文件“C:kafka.py”第 702 行引发 Errors.KafkaTimeoutError(kafka.errors.KafkaTimeoutError: KafkaTimeoutError: 60.0 秒后更新元数据失败。
  • server.properties 有如下配置 listeners=INTERNAL://0.0.0.0:29092,EXTERNAL://0.0.0.0:9092 listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL: PLAINTEXT advertised.listeners=INTERNAL://kafkahost01:29092,EXTERNAL://10.20.30.40:9092 inter.broker.listener.name=INTERNAL
  • @OneCricketeer 我可以通过 kafkacat kafkacat -b 10.20.30.40:9092 -L 所有主题的元数据(来自代理 0:144.25.103.235:9092/0)从另一台机器连接:1经纪人:经纪人 0 在 10.20.30.40:9092 2 个主题:主题“推文”有 1 个分区:我进一步测试了来自不同机器的 nc -vz 10.20.30.40 9092。 Ncat:版本 7.50 (nmap.org/ncat) Ncat:连接到 10.20.30.40:9092。 Ncat:0.01 秒内发送 0 个字节,接收 0 个字节。不知道可能出了什么问题。

标签: docker apache-kafka apache-zookeeper


【解决方案1】:

这里有一个配置了内部和外部侦听器的 docker-compose 示例。试用。 (将 localhost 替换为您想要的 IP 或 DNS)

version: '3.7'
services:
  zookeeper:
    image: zookeeper:3.5.8
    hostname: zookeeper
    volumes:
      - zookeeper-data:/data
      - zookeeper-datalog:/datalog

  kafka:
    image: wurstmeister/kafka:2.13-2.6.0
    hostname: kafka
    depends_on:
    - zookeeper
    ports:
    - 9093:9093
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ADVERTISED_LISTENERS: INSIDE://:9092,OUTSIDE://localhost:9093
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:9093
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    volumes:
      - kafka:/kafka


volumes:
  zookeeper-data:
  zookeeper-datalog:
  kafka:

在同一网络中运行生产者:

# note: I just placed my docker-compose.yml in example dir, thats the reason for the example_default network
$ docker run -it --rm \
--name producer \
--network example_default \
wurstmeister/kafka:2.13-2.6.0 bash
bash-4.4# /opt/kafka/bin/kafka-console-producer.sh --bootstrap-server kafka:9092 --topic 
example
>some
>test

并使用 kaf 从外部 docker 消费:

$ cat ~/.kaf/config
current-cluster: single
clusteroverride: ""
clusters:
- name: single
  version: 2.7.0
  brokers:
  - localhost:9093
  SASL: null
  TLS: null
  security-protocol: PLAINTEXT
  schema-registry-url: ""
$ kaf nodes
ID    ADDRESS          
1     localhost:9093
$ kaf consume example -f --raw 
some
test

希望这个示例可以帮助您定义自己的设置。

【讨论】:

  • 您应该删除公布的主机名和端口设置,因为如果定义了公布的侦听器,则不会使用它们。这也不能解决从另一台机器连接的问题
  • 谢谢,删除了这些环境。我已经在第一部分中写道,应该将 localhost 替换为 IP/DNS 以便能够从另一台机器进行连接。我使用几乎相同的设置“部件”没有问题(并远程连接)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-20
  • 2015-11-28
相关资源
最近更新 更多