Metricbeat无法连接Kibana:http://localhost:5601连接被拒绝
错误日志
{"log.level":"error","@timestamp":"2024-10-24T22:41:29.959Z","log.origin":{"file.name":"instance/beat.go","file.line":1142},"message":"Exiting: error connecting to Kibana: fail to get the Kibana version: HTTP GET request to http://localhost:5601/api/status fails: fail to execute the HTTP GET request: Get \"http://localhost:5601/api/status\": dial tcp 127.0.0.1:5601: connect: connection refused (status=0). Response: ","service.name":"metricbeat","ecs.version":"1.6.0"}
部署配置
docker-compose.yml
version: "3.8" networks: default: name: elastic external: false services: metricbeat: depends_on: - kibana image: docker.elastic.co/beats/metricbeat:8.7.1 user: root environment: - KIBANA_HOSTS=http://kibana:5601 volumes: - ./metricbeatdata01:/usr/share/metricbeat/data - "./metricbeat.yml:/usr/share/metricbeat/metricbeat.yml:ro" - "/var/run/docker.sock:/var/run/docker.sock:ro" - "/sys/fs/cgroup:/hostfs/sys/fs/cgroup:ro" - "/proc:/hostfs/proc:ro" - "/:/hostfs:ro" restart: on-failure elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.7.1 container_name: elasticsearch volumes: - es_data:/usr/share/elasticsearch/data environment: - discovery.type=single-node - xpack.security.enabled=false - network.host=0.0.0.0 - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ports: - 9200:9200 kibana: depends_on: - elasticsearch image: docker.elastic.co/kibana/kibana:8.7.1 volumes: - kibanadata:/usr/share/kibana/data ports: - 5601:5601 environment: - SERVERNAME=kibana - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 healthcheck: test: [ "CMD-SHELL", "curl -s -I http://localhost:5601 | grep -q 'HTTP/1.1 302 Found'", ] interval: 10s timeout: 10s retries: 120 volumes: es_data: driver: local kibanadata: driver: local
metricbeat.yml
metricbeat.modules: - module: docker metricsets: ["container", "cpu", "diskio", "info", "memory", "network"] hosts: ["unix:///var/run/docker.sock"] period: 5s output.elasticsearch: hosts: ["elasticsearch:9200"] setup.kibana: hosts: kibana:5601 setup.dashboards.enabled: true
已完成排查
- 确认
metricbeat.yml中setup.kibana.hosts指向kibana:5601 - 验证Kibana服务已正常运行
- 增加了Kibana健康检查的重试次数和间隔
- 确认Docker网络内其他服务可通过
http://kibana:5601访问Kibana
问题原因及解决方案
1. 环境变量命名错误
你在docker-compose中设置的KIBANA_HOSTS环境变量无效,Metricbeat对应的环境变量应为SETUP_KIBANA_HOSTS。错误的变量名无法覆盖配置文件,若存在配置加载异常,会导致默认值生效。
解决:删除docker-compose中metricbeat服务的KIBANA_HOSTS环境变量,确保仅通过metricbeat.yml配置Kibana地址。
2. 配置文件未被正确加载
虽然挂载了本地metricbeat.yml,但可能存在路径错误、文件权限不足或容器内默认配置覆盖的情况。
验证:进入Metricbeat容器检查生效的配置:
docker exec -it <metricbeat-container-id> cat /usr/share/metricbeat/metricbeat.yml
确认setup.kibana.hosts为kibana:5601,若不符:
- 检查本地文件路径是否正确,确保
./metricbeat.yml存在且可读 - 调整挂载权限,确保容器能读取该文件
3. Kibana就绪延迟
depends_on仅保证容器启动顺序,不确保Kibana服务完全就绪。Metricbeat启动时Kibana可能仍在初始化,导致连接失败。
解决:修改Metricbeat的启动命令,添加等待逻辑:
# 在docker-compose的metricbeat服务中添加command字段 command: > sh -c " until curl -s http://kibana:5601/api/status | grep -q '\"status\":\"green\"'; do echo '等待Kibana就绪...' sleep 5 done metricbeat -e "
4. 配置文件缩进错误
YAML对缩进敏感,若setup.kibana下的hosts缩进不正确,配置会被忽略,Metricbeat会使用默认的localhost:5601。
验证:检查metricbeat.yml中以下部分的缩进(确保hosts与setup.kibana缩进一致,通常为2个空格):
setup.kibana: hosts: kibana:5601
5. DNS解析异常
极少数情况下,Metricbeat容器可能无法解析kibana主机名。
验证:进入Metricbeat容器测试DNS解析:
docker exec -it <metricbeat-container-id> nslookup kibana
若解析失败,检查Docker网络配置,确保所有服务都加入elastic网络(你的配置中默认网络已设置为elastic,此情况概率较低)。
内容的提问来源于stack exchange,提问作者Ryan Dias

