Kafka Docker部署下连接报错‘Disconnected while requesting ApiVersion’求助
问题:Confluent-Kafka客户端连接Bitnami Kafka容器失败
通过以下docker-compose.yml部署的Kafka Docker环境此前运行正常:
version: '2' services: zookeeper: image: bitnami/zookeeper:3.8 ports: - 2181:2181 environment: - ALLOW_ANONYMOUS_LOGIN=yes #- ZOO_ENABLE_AUTH=yes kafka: image: bitnami/kafka:2.5.0 ports: - 9092:9092 - 9091:9091 links: - zookeeper environment: - ALLOW_PLAINTEXT_LISTENER=true - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181 - KAFKA_LISTENERS=INTERNAL://kafka:9091,EXTERNAL://localhost:9092 - KAFKA_ADVERTISED_LISTENERS=EXTERNAL://localhost:9092,INTERNAL://kafka:9091 - KAFKA_INTER_BROKER_LISTENER_NAME=INTERNAL - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=EXTERNAL:PLAINTEXT,INTERNAL:PLAINTEXT
尝试使用confluent-kafka客户端连接,生产者代码如下:
from confluent_kafka import Producer import socket conf = {'bootstrap.servers': "127.0.0.1:9092", "enable.ssl.certificate.verification": False, 'client.id': socket.gethostname()} producer = Producer(conf) producer.produce('my_topic', key="key", value="value") producer.flush()
运行代码时出现以下错误:
Disconnected while requesting ApiVersion: might be caused by incorrect
security.protocol configuration (connecting to a SSL listener?) or
broker version is < 0.10 (see api.version.request) (after 2ms in state
APIVERSION_QUERY)
注意到以下信息:
- Kafka broker版本为2.5。
- docker-compose日志显示:
ssl.client.auth = none
ssl.enabled.protocols = [TLSv1.2]
解决建议
- 指定安全协议为PLAINTEXT:你的Kafka配置中EXTERNAL监听用的是明文协议,但confluent-kafka客户端默认可能尝试SSL连接,导致协议不匹配。在客户端配置里加上
'security.protocol': 'PLAINTEXT',修改后的配置如下:conf = {'bootstrap.servers': "127.0.0.1:9092", "enable.ssl.certificate.verification": False, 'security.protocol': 'PLAINTEXT', 'client.id': socket.gethostname()} - 显式开启API版本请求:虽然Kafka 2.5版本支持API版本请求,但可以在客户端配置中添加
'api.version.request': True,确保客户端主动向broker请求版本信息,避免版本兼容问题。 - 验证Kafka监听状态:查看Kafka容器日志,确认是否有类似
Listening for connections on EXTERNAL://localhost:9092 (PLAINTEXT)的日志,确保明文监听端口正常启动。 - 检查端口映射有效性:在主机上执行
netstat -anp | grep 9092(Linux)或netstat -ano | findstr 9092(Windows),确认9092端口确实处于监听状态,没有被其他进程占用。 - 调整Listener地址(可选):如果上述方法无效,可以尝试将docker-compose中KAFKA_LISTENERS和KAFKA_ADVERTISED_LISTENERS的EXTERNAL地址改为
0.0.0.0:9092,确保broker绑定到所有可用网络接口,避免localhost解析问题。
内容的提问来源于stack exchange,提问作者kta
相关产品推荐
相关产品推荐

