Невозможно получить доступ к kafka снаружи Docker - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть слитная настройка kafka и docker-compose.yml файл

https://github.com/confluentinc/cp-docker-images/blob/5.0.0-post/examples/kafka-cluster/docker-compose.yml

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

---
version: '2' 
services: 
  zookeeper-1: 
    image: confluentinc/cp-zookeeper:latest 
    environment: 
      ZOOKEEPER_SERVER_ID: 1 
      ZOOKEEPER_CLIENT_PORT: 22181 
      ZOOKEEPER_TICK_TIME: 2000 
      ZOOKEEPER_INIT_LIMIT: 5 
      ZOOKEEPER_SYNC_LIMIT: 2 
      ZOOKEEPER_SERVERS: localhost:22888:23888;localhost:32888:33888;localhost:42888:43888 
    network_mode: "host" 

  zookeeper-2: 
    image: confluentinc/cp-zookeeper:latest 
    environment: 
      ZOOKEEPER_SERVER_ID: 2 
      ZOOKEEPER_CLIENT_PORT: 32181 
      ZOOKEEPER_TICK_TIME: 2000 
      ZOOKEEPER_INIT_LIMIT: 5 
      ZOOKEEPER_SYNC_LIMIT: 2 
      ZOOKEEPER_SERVERS: localhost:22888:23888;localhost:32888:33888;localhost:42888:43888 
    network_mode: "host" 

  zookeeper-3: 
    image: confluentinc/cp-zookeeper:latest 
    environment: 
      ZOOKEEPER_SERVER_ID: 3 
      ZOOKEEPER_CLIENT_PORT: 42181 
      ZOOKEEPER_TICK_TIME: 2000 
      ZOOKEEPER_INIT_LIMIT: 5 
      ZOOKEEPER_SYNC_LIMIT: 2 
      ZOOKEEPER_SERVERS: localhost:22888:23888;localhost:32888:33888;localhost:42888:43888 
    network_mode: "host" 

  kafka-1: 
    image: confluentinc/cp-kafka:latest 
    depends_on: 
      - zookeeper-1 
      - zookeeper-2 
      - zookeeper-3 
    ports: 
      - "19092" 
    environment: 
      KAFKA_BROKER_ID: 1 
      KAFKA_ZOOKEEPER_CONNECT: localhost:22181,localhost:32181,localhost:42181 
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:19092 
    network_mode: "host" 

  kafka-2: 
    image: confluentinc/cp-kafka:latest 
    depends_on: 
      - zookeeper-1 
      - zookeeper-2 
      - zookeeper-3 
    ports: 
      - "29092" 
    environment: 
      KAFKA_BROKER_ID: 2 
      KAFKA_ZOOKEEPER_CONNECT: localhost:22181,localhost:32181,localhost:42181 
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:29092 
    network_mode: "host" 

  kafka-3: 
    image: confluentinc/cp-kafka:latest 
    depends_on: 
      - zookeeper-1 
      - zookeeper-2 
      - zookeeper-3 
    ports: 
      - "39092" 
    environment: 
      KAFKA_BROKER_ID: 3 
      KAFKA_ZOOKEEPER_CONNECT: localhost:22181,localhost:32181,localhost:42181 
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:39092 
    network_mode: "host" 

Я выполнил следующие команды:

docker-compose up --no-start
docker-compose start zookeeper-1
docker-compose start zookeeper-2
docker-compose start zookeeper-3

docker-compose run -d --service-ports kafka-1
docker-compose run -d --service-ports kafka-2
docker-compose run -d --service-ports kafka-3

Запустился zookeeper-1,2,3, но kafka-1 не удалось с кодом выхода 0. Когда я делаю docker-compose start kafka-1, порты не отображаются, но служба запускается.

Вывод вышеуказанных команд:

Docker PS

CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS               NAMES
7abec60edd7a        confluentinc/cp-zookeeper:latest   "/etc/confluent/dock…"   3 minutes ago       Up 3 minutes                            kafka-cluster_zookeeper-2_1_c9f58ba3fbc8
68ec403740d6        confluentinc/cp-zookeeper:latest   "/etc/confluent/dock…"   3 minutes ago       Up 3 minutes                            kafka-cluster_zookeeper-3_1_31e4762a61bb
69d6645487aa        confluentinc/cp-zookeeper:latest   "/etc/confluent/dock…"   3 minutes ago       Up 3 minutes                            kafka-cluster_zookeeper-1_1_8bbd729b09d8

Докеры журналов Кафка-1, Кафка-2, Кафка-3 (все одинаковые)

[main-SendThread(localhost:42181)] INFO org.apache.zookeeper.ClientCnxn - Opening socket connection to server localhost/127.0.0.1:42181. Will not attempt to authenticate using SASL (unknown error)
[main-SendThread(localhost:42181)] INFO org.apache.zookeeper.ClientCnxn - Socket connection established to localhost/127.0.0.1:42181, initiating session
[main-SendThread(localhost:42181)] INFO org.apache.zookeeper.ClientCnxn - Unable to read additional data from server sessionid 0x0, likely server has closed socket, closing socket connection and attempting reconnect
[main-SendThread(localhost:32181)] INFO org.apache.zookeeper.ClientCnxn - Opening socket connection to server localhost/0:0:0:0:0:0:0:1:32181. Will not attempt to authenticate using SASL (unknown error)
[main-SendThread(localhost:32181)] INFO org.apache.zookeeper.ClientCnxn - Socket connection established to localhost/0:0:0:0:0:0:0:1:32181, initiating session
[main-SendThread(localhost:32181)] INFO org.apache.zookeeper.ClientCnxn - Unable to read additional data from server sessionid 0x0, likely server has closed socket, closing socket connection and attempting reconnect
[main-SendThread(localhost:22181)] INFO org.apache.zookeeper.ClientCnxn - Opening socket connection to server localhost/0:0:0:0:0:0:0:1:22181. Will not attempt to authenticate using SASL (unknown error)
[main-SendThread(localhost:22181)] INFO org.apache.zookeeper.ClientCnxn - Socket connection established to localhost/0:0:0:0:0:0:0:1:22181, initiating session
[main-SendThread(localhost:22181)] INFO org.apache.zookeeper.ClientCnxn - Unable to read additional data from server sessionid 0x0, likely server has closed socket, closing socket connection and attempting reconnect
[main] ERROR io.confluent.admin.utils.ClusterStatus - Timed out waiting for connection to Zookeeper server [localhost:22181,localhost:32181,localhost:42181].
[main] INFO org.apache.zookeeper.ZooKeeper - Session: 0x0 closed

docker-compose ps

                  Name                              Command            State    Ports
-------------------------------------------------------------------------------------
kafka-cluster_kafka-1_1_c79e5ef5d397       /etc/confluent/docker/run   Exit 0        
kafka-cluster_kafka-2_1_d4399ed0a670       /etc/confluent/docker/run   Exit 0        
kafka-cluster_kafka-3_1_2df6f47759c0       /etc/confluent/docker/run   Exit 0        
kafka-cluster_zookeeper-1_1_8bbd729b09d8   /etc/confluent/docker/run   Up            
kafka-cluster_zookeeper-2_1_c9f58ba3fbc8   /etc/confluent/docker/run   Up            
kafka-cluster_zookeeper-3_1_31e4762a61bb   /etc/confluent/docker/run   Up            

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Если вы посмотрите на пример all-in-one Compose от Confluent, то все настроено правильно для доступа брокера во всех направлениях, а не с использованием network: host «хаков» (которые только работали бы) в Linux)

См.

KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
  KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:9092,PLAINTEXT_HOST://localhost:29092

За пределами сети Docker вы можете подключиться через порт 29092, но внутри - 9092

.

Что еще более важно, строки соединения Zookeeper должны указывать друг на друга, а не localhost

Я также хотел бы отметить, что несколько брокеров на одной машине не имеют много преимуществ, и если вам нужны постоянные данные (не теряйте все при перезагрузке компьютера или Docker), вам понадобится объем крепления

0 голосов
/ 07 ноября 2018

Проблема здесь в том, что в KAFKA_ADVERTISED_LISTENERS должен быть указан IP-адрес хоста. Так что, когда вы запустите его на другой машине, эта машина сможет получить доступ к kafka, используя IP-адрес.

      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://10.1.1.1:39092 

Следующим пунктом, указанным @Ntwobike, является удаление опции -p. Не то чтобы это не нужно, но это избыточно, если установлена ​​опция --net=host.

Самое важное , проверить брандмауэр . Проверьте правила iptables и измените их на FORWARD ACCEPT (в моем случае я так и сделал, поскольку мой является хостом разработки).

Если вы используете CentOS или RHEL, вы можете попробовать остановить firewalld и проверить, не является ли это брандмауэром, который создает проблему.

systemctl stop firewalld

Для других это UFW (Ubuntu, Mint)

systemctl stop ufw

В качестве альтернативы, вы также можете сделать iptables -F, но до этого убедиться, что вы сделали резервную копию своих правил iptables , используя

iptables-save > /home/iptables_rules_bak

и затем после сброса правил вы можете сделать

iptables -P FORWARD ACCEPT

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