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

Metricbeat无法连接Kibana:http://localhost:5601连接被拒绝

Metricbeat无法连接Kibana(Docker Compose部署)

错误日志

{"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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 20:15:54