Docker部署ELK+Kafka时Logstash报ES不可达连接拒绝错误
问题原因
错误日志已经明确指向配置错误:Logstash 尝试连接的 Elasticsearch 地址是 http://kafka:9200/,但9200是Elasticsearch的服务端口,Kafka服务本身不监听这个端口,自然会返回连接拒绝。
你在宿主机能通过localhost:9200访问Elasticsearch,是因为docker-compose把Elasticsearch容器的9200端口映射到了宿主机,但在docker自定义的tweetapp-network内部,容器之间是通过服务名做域名解析互相访问的:
- Kafka服务的内部域名为
kafka,仅监听9092端口 - Elasticsearch服务的内部域名为
elasticsearch,监听9200端口
你在logstash的输出配置里把Elasticsearch的主机名错写成了kafka,才导致Logstash找错了服务地址。
修复步骤
- 修改logstash配置文件中elasticsearch输出段的hosts配置,将错误的
kafka:9200改为正确的服务地址:
output { elasticsearch { hosts => ["elasticsearch:9200"] index => "tweetapp" workers => 1 } }
- 检查配置挂载路径:你docker-compose里写的Logstash配置挂载路径是
.\logstash:/usr/share/logstash/pipeline/,如果是Windows环境要确认相对路径识别正常,同时要保证你本地logstash目录下的配置文件后缀是.conf,Logstash默认只会加载pipeline目录下后缀为.conf的配置文件,后缀不对会导致配置不生效。 - 重启Logstash容器加载新配置,在docker-compose.yml所在目录执行命令:
docker-compose restart logstash - 注意
depends_on配置仅能控制容器的启动顺序,无法保证容器内的服务完全就绪,如果重启后短时间内还有连接报错,等Elasticsearch完全启动(单节点ES一般启动需要10-30秒,可进入Logstash容器执行curl elasticsearch:9200验证连通性)后报错就会消失,长期使用可以给Elasticsearch加健康检查,让Logstash等ES服务真正就绪后再启动。
验证方法
查看Logstash容器日志,不再出现HostUnreachableError连接拒绝的报错后,往Kafka的tweetapp-logs主题发送一条测试日志,等待数秒后访问Elasticsearch的tweetapp索引,能查到对应的日志文档就说明整个采集链路正常。
内容的提问来源于stack exchange,提问作者VA splash
相关产品推荐
相关产品推荐

