Кафка docker составь внешнее соединение - PullRequest
0 голосов
/ 16 апреля 2020

Я хочу выставить 9093 вне контейнера docker. Когда я устанавливаю порты kafka-0 для 9093 и KAFKA_ADVERTISED_LISTENERS, как показано ниже, я не могу подключиться к localhost: 9093, как показано в следующем файле docker -compose.

version: '3'

services:
  kafka-0:
    image: confluentinc/cp-kafka:5.2.1
    container_name: kafka-0
    hostname: kafka-0
    ports:
      - "9093:9092"
    environment:
      - KAFKA_BROKER_ID=1
      - KAFKA_ZOOKEEPER_CONNECT=wise-nlp-zookeeper:2181
      - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka-0:29094,PLAINTEXT_HOST://localhost:9093
      - KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1
    depends_on:
      - zookeeper

  zookeeper:
    image: confluentinc/cp-zookeeper:5.3.1
    container_name: zookeeper
    ports:
      - "2182:2181"
    environment:
      - ZOOKEEPER_CLIENT_PORT=2181

Однако, когда я изменяю на

ports:
 - "9092:9092"

и

- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka-0:29094,PLAINTEXT_HOST://localhost:9092

Я могу подключиться к локальному хосту брокера kafka: 9092.

Как я могу изменить внешний порт на 9093 для приложений подключить? Я хочу настроить несколько брокеров.

1 Ответ

0 голосов
/ 16 апреля 2020

Почему он не работает в настоящее время?

Рекламируемые слушатели (как определено в KAFKA_ADVERTISED_LISTENERS) - это хост и порт , которые брокер возвращает клиенту в своем первоначальном соединении, чтобы он мог использовать в последующих соединениях .

Если вы хотите, чтобы внешние клиенты использовали 9093, то KAFKA_ADVERTISED_LISTENERS=…PLAINTEXT_HOST://localhost:9093 является правильным. Однако , вы не настроили KAFKA_LISTENERS, который при проверке журнала брокера при запуске будет иметь значение по умолчанию, установленное KAFKA_ADVERTISED_LISTENERS:

kafka-0      |  listeners = PLAINTEXT://0.0.0.0:29094,PLAINTEXT_HOST://0.0.0.0:9093

Так в этом состоянии брокер прослушивает порт 9093, но с помощью этой команды Docker Compose вы перенаправили внешние соединения в контейнер с 9093 на 9092 внутри контейнера:

    ports: 
      - "9093:9092"
➜ docker ps
CONTAINER ID        IMAGE                             … PORTS                                        NAMES
8b934ef4145c        confluentinc/cp-kafka:5.4.1       … 0.0.0.0:9093->9092/tcp                       kafka-0

Итак ваши внешние подключения будут go к порту 9092 в контейнере - и брокер не прослушивает этот порт. Вы можете проверить это с помощью nc:

-- Port 9093 is open on the host machine
➜ nc -vz localhost 9093
Connection to localhost port 9093 [tcp/*] succeeded!

-- Port 9092 is _not_ open on the Kafka container
➜ docker exec -it kafka-0 nc -vz localhost 9092
localhost [127.0.0.1] 9092 (?) : Connection refused

❌ Вы увидите, что соединение с клиентом не устанавливается

➜ kafkacat -b localhost:9093 -L
% ERROR: Failed to acquire metadata: Local: Broker transport failure

Как вы можете это исправить?

Вы может либо:

  1. Изменить прослушиватель на порт, на который вы нацелены с перенаправлением порта Docker. Это будет работать, но лично я думаю, что это более запутанно.
  2. Измените перенаправление порта Docker, чтобы указать порт, на котором включен прослушиватель. Эту опцию я бы использовал, поскольку она более понятна (например, порт 9093 используется повсюду, а не смешивает 9092 и 9093 вместе)

Опция 1: измените слушателя на на порт, на который вы нацелены с помощью перенаправления порта Docker

version: '3'

services:
  kafka-0:
    image: confluentinc/cp-kafka:5.4.1
    container_name: kafka-0
    ports:
      - "9093:9092"
    environment:
      - KAFKA_BROKER_ID=1
      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
      - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka-0:29094,PLAINTEXT_HOST://localhost:9093
      - KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:29094,PLAINTEXT_HOST://0.0.0.0:9092
      - KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1
    depends_on:
      - zookeeper

  zookeeper:
    image: confluentinc/cp-zookeeper:5.4.1
    container_name: zookeeper
    ports:
      - "2182:2181"
    environment:
      - ZOOKEEPER_CLIENT_PORT=2181

estTest:

➜ kafkacat -b localhost:9093 -L
Metadata for all topics (from broker 1: localhost:9093/1):
 1 brokers:
  broker 1 at localhost:9093 (controller)

Вариант 2: Измените перенаправление порта Docker, чтобы указать порт, на котором слушатель включен

version: '3'

services:
  kafka-0:
    image: confluentinc/cp-kafka:5.4.1
    container_name: kafka-0
    ports:
      - "9093:9093"
    environment:
      - KAFKA_BROKER_ID=1
      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
      - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka-0:29094,PLAINTEXT_HOST://localhost:9093
      # If you don't specify KAFKA_LISTENERS it will default to the ports used in
      # KAFKA_ADVERTISED_LISTENERS, but IMO it's better to be explicit about these settings
      - KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:29094,PLAINTEXT_HOST://0.0.0.0:9093
      - KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1
    depends_on:
      - zookeeper

  zookeeper:
    image: confluentinc/cp-zookeeper:5.4.1
    container_name: zookeeper
    ports:
      - "2182:2181"
    environment:
      - ZOOKEEPER_CLIENT_PORT=2181

estTest

➜ kafkacat -b localhost:9093 -L
Metadata for all topics (from broker 1: localhost:9093/1):
 1 brokers:
  broker 1 at localhost:9093 (controller)

Подключение к Kafka из в Docker сеть

Приведенные выше примеры о подключении к Kafka с Docker хоста . Если вы хотите подключиться к нему из в сети Docker (например, из другого контейнера), вам нужно использовать kafka-0:29094 в качестве хоста-посредника и IP. Если вы попытаетесь использовать localhost:9093, клиентский контейнер преобразует localhost в свой собственный контейнер и, таким образом, потерпит неудачу.

Несколько брокеров

См. Здесь для примера Docker Составьте список с несколькими брокерами Kafka.

Список литературы

https://rmoff.net/2018/08/02/kafka-listeners-explained/

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