【问题标题】:Unable to consume or produce to a remote Kafka broker无法消费或生产到远程 Kafka 代理
【发布时间】:2025-11-29 22:45:01
【问题描述】:

我已经在 Digital Ocean 上设置了一个简单的 droplet,并且正在运行一个使用 docker-compose 文件启动的单个 Kafka 和 Zookeeper 节点。

我遇到了从 Digital Ocean 液滴外部向 Kafka 代理消费或生产的问题。 这就是我的 docker-compose 的样子,

version: '3.4'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
    volumes:
      - /root/data/zookeeper/etc:/etc/zookeeper
      - /root/data/zookeeper/data:/var/lib/zookeeper/data
    container_name: "zookeeper"
    network_mode: "host"

  kafka:
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: PUBLIC_DIGITIAL_OCEAN_IP:2181
      KAFKA_ADVERTISED_LISTENERS:PLAINTEXT://PUBLIC_DIGITIAL_OCEAN_IP:9093
      KAFKA_LISTENER: PUBLIC_DIGITIAL_OCEAN_IP:9093
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_LOG4J_LOGGERS: "kafka.controller=WARN"
      KAFKA_LOG4J_ROOT_LOGLEVEL: WARN
      KAFKA_TOOLS_LOG4J_LOGLEVEL: ERROR
    volumes:
      - /root/data/kafka/etc:/etc/kafka
      - /root/data/kafka/data:/var/lib/kafka/data
    container_name: "kafka"
    network_mode: "host"

我尝试了不同的组合,将KAFKA_ADVERTISED_LISTENERS 设置为使用 localhost, 0.0.0.0,但我没有成功。

如果我进入 kafka 容器并使用 CLI,我可以消费和生产。

根据我的阅读,数字海洋没有任何防火墙规则,因此端口被暴露。

在 droplet 中运行 netstat 的 sn-p

> netstat -tulpn | grep :2181
> tcp6       0      0 :::2181                 :::*                    LISTEN      10522/java  
> netstat -tulpn | grep :9093
> tcp6       0      0 :::9093                 :::*                    LISTEN      13093/java

非常感谢任何帮助!

【问题讨论】:

    标签: apache-kafka docker-compose


    【解决方案1】:

    问题是我在 droplet 上的防火墙规则。运行命令;

    sudo ufw allow 2181 && sudo ufw allow 9092 解决了我的问题。

    【讨论】: