Невозможно запустить потребителя консоли с помощью брокера Kafka внутри контейнера Docker - PullRequest
2 голосов
/ 28 мая 2020

У меня проблема с запуском брокера Kafka в контейнере Docker.

Я загрузил и распаковал tar-архив Kafka 2.12-2.4.1.

Я могу запускать брокеры Zookeeper и Kafka из командной строки, успешно создавая и получая сообщения. Когда я создаю контейнер docker с помощью Zookeeper, я могу запустить его с помощью брокера Kafka, запущенного из командной строки, и снова успешно создавать и принимать сообщения. Когда я помещаю брокера в контейнер docker, потребители и производители не могут найти брокера для подключения.

Я проверил, есть ли у Zookeeper подключенный брокер: команда zookeeper "dump" ниже

echo dump | nc localhost 2181

возвращает

SessionTracker dump:
Session Sets (3)/(1):
0 expire at Thu May 28 09:53:33 GMT 2020:
0 expire at Thu May 28 09:53:36 GMT 2020:
1 expire at Thu May 28 09:53:39 GMT 2020:
    0x10002dfed700008
ephemeral nodes dump:
Sessions with Ephemerals (1):
0x10002dfed700008:
    /controller
    /brokers/ids/0
Connections dump:
Connections Sets (2)/(2):
0 expire at Thu May 28 09:53:37 GMT 2020:
2 expire at Thu May 28 09:53:47 GMT 2020:
    ip: /172.18.0.1:55656 sessionId: 0x0
    ip: /172.18.0.5:48474 sessionId: 0x10002dfed700008

, что, на мой неподготовленный глаз, похоже, что у Zookeeper есть зарегистрированный брокер.

Я могу успешно перечислить темы с помощью команды

kafka-topics.sh --list --zookeeper localhost:2181

и когда я запускаю команду

netstat -plnt

, я вижу, что у меня есть прослушиватели на портах 2181 и 9092, как показано ниже

tcp6       0      0 :::9092                 :::*                    LISTEN      54661/docker-proxy
tcp6       0      0 :::2181                 :::*                    LISTEN      47872/docker-proxy 

Однако, когда Я пытаюсь подключиться к потребителю с помощью команды

kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic aaaa

. Я получаю сообщение об ошибке

WARN [Consumer clientId=consumer-console-consumer-8228-1, groupId=console-consumer-8228] Bootstrap broker localhost:9092 (id: -1 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)

, которое, похоже, указывает на то, что клиент не может связаться с брокером.

Я пробовал несколько различных вариантов прослушивателей и рекламируемых прослушивателей в файле конфигурации брокера, установив для них значения localhost и 127.0.0.1, но безрезультатно.

Я уверен, что мне не хватает что-то простое: кто-нибудь может помочь?

Ответы [ 2 ]

0 голосов
/ 31 мая 2020

Итак, я решил проблему, и теперь у меня есть рабочая среда Docker / Kafka: у меня есть zookeeper, брокер и потребитель, работающие в docker, и я могу создавать сообщения как от производителя, работающего в docker и потребитель, запущенный из командной строки.

Как подозревал @GiorgosMyrianthous, проблема была в слушателях и объявленных слушателях. Я ввел следующие значения в файл свойств брокера Kafka

listeners=PLAINTEXT://:29092,PLAINTEXT_HOST://:9092 advertised.listeners=PLAINTEXT://server:29092,PLAINTEXT_HOST://localhost:9092 listener.security.protocol.map=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT

и запустил контейнер с портом 9092, открытым для внешнего мира.

Я запустил Docker потребитель с сервером bootstrap, установленным на server:29092.

Я запустил производитель Docker с сервером bootstrap, установленным на server:29092.

Я выполнил команду линейный производитель с сервером bootstrap, установленным на localhost:9092.

Сообщения, введенные любым из производителей, появлялись в потребителе.

0 голосов
/ 28 мая 2020

Обязательно настройте следующее:

KAFKA_LISTENERS: LISTENER_INTERNAL://kafka-host:29092,LISTENER_EXTERNAL://kafka-host:9092
KAFKA_ADVERTISED_LISTENERS: LISTENER_INTERNAL://kafka-host:29092,LISTENER_EXTERNAL://localhost:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_INTERNAL:PLAINTEXT,LISTENER_EXTERNAL:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_INTERNAL

  • Теперь все ваши клиенты, работающие в сети Docker, должны использовать

    LISTENER_INTERNAL://kafka-host:29092
    
  • Все клиенты за пределами сети Docker должны использовать

    LISTENER_EXTERNAL://kafka-host:9092
    

Более полное руководство см. В статье @ RobinMoffatt .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...