docker内部和外部的Kafka访问

jdi*_*zio 19 apache-kafka docker docker-compose

我正在尝试使用 docker-compose 启动一个 kafka 服务,它应该可以在 docker 内部和外部访问。因此,应该在内部和外部设置合适的广告商:

version: '3'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka
    ports:
      - "9094:9092"
    environment:
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://127.0.0.1:9094
      KAFKA_ADVERTISED_LISTENERS: INSIDE://:9092,OUTSIDE://127.0.0.1:9094
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
Run Code Online (Sandbox Code Playgroud)

问题是当我尝试从集群外部连接时,我没有得到 127.0.0.1 作为节点的名称,而是内部主机名:

$ kafkacat -L -b 127.0.0.1:9094
Metadata for all topics (from broker -1: 127.0.0.1:9092/bootstrap):
 1 brokers:
  broker 1001 at 91588ea968d4:9092
 28 topics:
 ...
Run Code Online (Sandbox Code Playgroud)

KAFKA_ADVERTISED_LISTENERS 和 KAFKA_LISTENERS 的目的不是处理这种情况吗?我尝试设置 KAFKA_ADVERTISED_HOST_NAME 但它被忽略了(一份文档说它已弃用,另一份说它仍然处于活动状态),但这似乎不是答案,因为我想要两个不同的广告主机名用于两个不同的网络。

我想老问题仍然存在:如何使 kafka 在 docker-compose 内外工作?

dan*_*niu 16

我需要做的是将侦听器声明为都绑定到 docker 主机,然后以不同的方式宣传它们 - 一个到 docker 网络,一个到主机:

services:
  zookeeper:
    image: confluentinc/cp-zookeeper
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
      ZOOKEEPER_SYNC_LIMIT: 2
  kafka:
    image: confluentinc/cp-kafka
    ports:
      - 9094:9094
    depends_on:
      - zookeeper
    environment:
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENERS: INTERNAL://kafka:9092,OUTSIDE://kafka:9094
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:9092,OUTSIDE://localhost:9094
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
Run Code Online (Sandbox Code Playgroud)

  • KAFKA_LISTENERS 中有一个冒号而不是点: INTERNAL://0.0 **:** 0.0:9092,OUTSIDE://0.0.0.0:9094 应该是: INTERNAL://0.0.0.0.9092,OUTSIDE:/ /0.0.0.0:9094 (3认同)

Rob*_*att 8

您的侦听器配置看起来正确,问题在于您的 Docker Compose:

ports:
  - "9094:9092"
Run Code Online (Sandbox Code Playgroud)

您将9094('Outside')映射回9092('Inside'),因此当您连接时,您正在连接到“Inside”侦听器。如果您删除这行配置,那么您的侦听器设置应该按预期工作。

有关更多信息,请参阅http://rmoff.net/2018/08/02/kafka-listeners-explained/

  • 当我想通的时候已经快写完了。您的帖子缺少最相关的行,即 KAFKA_LISTENERS。您需要在此处将两者都设置为 kafka 主机(“INTERNAL://kafka:9092,OUTSIDE://kafka:9094”),然后可以不同地宣传它们(“INTERNAL://kafka:9092,OUTSIDE://本地主机:9094”)。 (3认同)