Kafkadocker撰写外部连接

yqkkidmi  于 2021-06-04  发布在  Kafka
关注(0)|答案(1)|浏览(527)

我想把9093暴露在码头集装箱外面。当我将kafka-0端口设置为9093并且kafka\u播发\u侦听器如下时,我无法连接到localhost:9093 as 显示在下面的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经纪人localhost:9092.
如何将外部端口更改为9093以便应用程序连接?我想建立多个经纪人。

c0vxltue

c0vxltue1#

为什么现在不行?

播发侦听器(如中所定义) 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

因此,您的外部连接将转到容器中的端口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

你怎么能修好它?

您可以:
使用docker端口重定向将侦听器更改为位于目标端口上。这将工作,但我个人认为是更混乱。
更改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

✅测试:

➜ 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

✅测试

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

从docker网络连接到kafka

上面的例子是关于从docker主机连接到kafka的。如果要从docker网络(例如另一个容器)内连接到它,则需要使用 kafka-0:29094 作为代理主机和ip。如果你想用 localhost:9093 然后客户端容器将解析 localhost 它自己的容器,因此失败。

多个经纪人

请参阅这里的示例docker compose与多个kafka代理。

参考文献

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

相关问题