You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker宿主机外无法连接Kafka集群问题咨询

Docker部署Kafka集群的Kubernetes客户端连接异常问题

问题背景

原本存在外部机器无法连接Docker部署Kafka集群的问题,其中192.168.2.13这台外部机器的问题已解决,但第三台服务器上的Kubernetes Kafka客户端Pod仅能获取版本信息,执行主题列表等其他命令均失败,推测问题源于网络环境差异。

宿主机(192.168.2.14)连接正常

宿主机本地可正常连接Kafka集群并列出主题:

/opt/kafka/bin/kafka-topics.sh --list --bootstrap-server 192.168.2.14:9092
       message_shown_topic

原外部机器(192.168.2.13)连接失败记录(已解决)

此前该机器连接时出现以下错误,目前此问题已修复:

/opt/kafka/bin/kafka-topics.sh --list --bootstrap-server 192.168.2.14:9092,192.168.2.14:9093  
      [2024-05-15 14:59:11,657] WARN [AdminClient clientId=adminclient-1] Connection to node 1 (/127.0.0.1:9092) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
      [2024-05-15 14:59:11,662] WARN [AdminClient clientId=adminclient-1] Connection to node 2 (/127.0.0.1:9093) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
      [2024-05-15 14:59:11,662] WARN [AdminClient clientId=adminclient-1] Connection to node 3 (/127.0.0.1:9094) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)

Kubernetes客户端Pod连接异常情况

Pod内仅能成功获取Kafka版本信息,执行主题列表等命令超时失败:

失败案例

#FAIL 
I have no name!@mmi-medic-kafka-client-360:/$ /opt/bitnami/kafka/bin/kafka-topics.sh --list --bootstrap-server 192.168.2.14:9092
    Error while executing topic command : Timed out waiting for a node assignment. Call: listTopics 

成功案例

#SUCCESS 
I have no name!@mmi-medic-kafka-client-360:/$ /opt/bitnami/kafka/bin/kafka-topics.sh --version --bootstrap-server 192.168.2.14:9092    
3.6.2

Kafka集群Docker Compose配置(运行正常)

集群使用Confluent Kafka镜像,核心配置如下:

kafka-1:
  image: confluentinc/cp-kafka:latest
  ...
  environment:
    KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka-1:19092,EXTERNAL://${DOCKER_HOST_IP:-127.0.0.1}:9092,DOCKER://host.docker.internal:29092
    KAFKA_LISTENERS: INTERNAL://0.0.0.0:19092,EXTERNAL://0.0.0.0:9092,DOCKER://0.0.0.0:29092
    KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT,DOCKER:PLAINTEXT
  ...

kafka-2:
  image: confluentinc/cp-kafka:latest
  ...
  environment:
    KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka-2:19093,EXTERNAL://${DOCKER_HOST_IP:-127.0.0.1}:9093,DOCKER://host.docker.internal:29093
    KAFKA_LISTENERS: INTERNAL://0.0.0.0:19093,EXTERNAL://0.0.0.0:9093,DOCKER://0.0.0.0:29093
    KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT,DOCKER:PLAINTEXT
  ...

kafka-3:
  image: confluentinc/cp-kafka:latest
  ...
  environment:
    KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka-3:19094,EXTERNAL://${DOCKER_HOST_IP:-127.0.0.1}:9094,DOCKER://host.docker.internal:29094
    KAFKA_LISTENERS: INTERNAL://0.0.0.0:19094,EXTERNAL://0.0.0.0:9094,DOCKER://0.0.0.0:29094
    KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT,DOCKER:PLAINTEXT

排查与解决方向

  1. 基础网络连通性验证

    • 在K8s Pod内执行ping 192.168.2.14,确认Pod与宿主机的基础网络连通;
    • 使用telnet 192.168.2.14 9092或nc -zv 192.168.2.14 9092测试9092、9093、9094端口的可达性;
    • 检查K8s集群与Docker宿主机所在网段的防火墙/安全组规则,确保上述端口允许双向通信。
  2. Kafka监听器配置核对

    • 确认启动Docker Compose时DOCKER_HOST_IP环境变量已设置为宿主机实际IP(192.168.2.14),而非默认的127.0.0.1;
    • 通过docker exec <kafka-container-id> kafka-configs.sh --describe --bootstrap-server localhost:9092 --entity-type brokers --entity-name 1命令,验证broker广播的监听器地址是否为外部可访问的IP。
  3. Kafka客户端参数调整

    • 执行命令时显式指定所有broker的外部端口:--bootstrap-server 192.168.2.14:9092,192.168.2.14:9093,192.168.2.14:9094;
    • 增加客户端超时参数,比如创建配置文件client.properties写入request.timeout.ms=30000,执行命令时添加--command-config client.properties。
  4. K8s网络策略检查

    • 确认K8s集群是否启用网络策略,检查客户端Pod所在Namespace是否有出站流量限制,确保允许访问宿主机网段;
    • 若使用Calico等网络插件,检查是否存在阻止Pod访问外部IP的规则。

内容的提问来源于stack exchange,提问作者user3008410

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 23:58:10