Невозможно подключиться к кафке, которая находится вне сети - PullRequest
1 голос
/ 20 марта 2020

Я пытаюсь подключить свою работу в контейнере, который отправляет события в кластер kafka в другом контейнере. Независимо от того, что я пробовал, я не могу отправить событие в тему kafka, которую я пробовал te lnet и kafkacat на порт прослушивателя адресов моей kafka, все работает просто отлично:

Te lnet output

Kafkacat output

Это мой файл составления задания, "172.16.33.91" - мой локальный IP-адрес:

version: '3'
services:
    events-processor:
        build:
            context: ./events-processor
        extra_hosts:
            - "host:172.16.33.91"
        restart: unless-stopped

Это мой код работы, который отправляет данные от 1 -> 1000 на существующий топи c num-test :

from time import sleep
from json import dumps
from kafka import KafkaProducer

if __name__=="__main__":
    producer = KafkaProducer(bootstrap_servers=['host:9093'],
                             value_serializer=lambda x: dumps(x).encode('utf-8'))
    for e in range(1000):
        data = {'number' : e}
        producer.send('numtest', value=data)
        print(data)
        sleep(5)

Это моя кафка -zookeeper составьте файл:

version: '3'

services: 
    zookeeper:
        image: confluentinc/cp-zookeeper
        environment:
            ZOOKEEPER_CLIENT_PORT: 2181
            ZOOKEEPER_TICK_TIME: 2000
        volumes:
            - zk-data:/var/lib/zookeeper/data
            - zk-logs:/var/lib/zookeeper/log
            - secrets:/etc/zookeeper/secrets
        restart: unless-stopped

    kafka:
        image: confluentinc/cp-kafka
        depends_on:
            - zookeeper
        ports: 
            - "9093:9093"
        environment:
            KAFKA_BROKER_ID: 1
            KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
            KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:9092,EXTERNAL://:9093
            KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT      
            KAFKA_LISTENERS: INTERNAL://:9092,EXTERNAL://:9093
            KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
            KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
        volumes:
            - kafka-data:/var/lib/kafka/data
            - secrets:/etc/kafka/secrets
        restart: unless-stopped

volumes:
    zk-logs: {}
    zk-data: {}
    kafka-data: {}
    secrets: {}

У кого-нибудь есть идеи, что я сделал не так? Любая помощь приветствуется !!!

Ответы [ 2 ]

2 голосов
/ 20 марта 2020

Я помню, что сталкивался с подобной проблемой с подключением. Оказывается, чтобы ваш контейнер мог получить доступ к портам на вашем хост-компьютере, вам может потребоваться добавить дополнительные правила к вашему брандмауэру, чтобы открыть его.

Например, с помощью iptables вы можете добавить правило, подобное ниже, чтобы позволить вашему хост-компьютеру принимать запросы от ваших docker контейнеров.

-A INPUT -i docker0 -j ACCEPT

В качестве альтернативы, вы можете поместить свой рабочий контейнер в ту же docker сеть, что и ваш kafka / zookeeper. Либо поместив приложение в один и тот же docker -компонентный файл, либо используя общую внешнюю docker сеть.

1 голос
/ 21 марта 2020

Если есть лучшее место, куда следует поместить эту информацию, или ключевые слова, которые вам не хватает, чтобы найти решения, сообщите об этом сообществу

На этом уже написано несколько блогов

KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:9092,HOST://localhost:9093
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,HOST:PLAINTEXT      
KAFKA_LISTENERS: INTERNAL://0.0.0.0:9092,HOST://0.0.0.0:9093
  1. При использовании адреса ://:port будет прослушиваться только локальное имя хоста, контейнера или нет
  2. Вы должны прослушивать внешние соединения с помощью привязки ко всем интерфейсам, 0.0.0.0
  3. Вы должны объявить внутренне и / или любые внешние имена хостов
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...