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

Docker部署EFK栈时Fluentd无法连接Elasticsearch求助

Docker部署EFK栈:Fluentd无法连接Elasticsearch的解决方案

问题背景

尝试通过Docker部署EFK(Elasticsearch-Fluentd-Kibana)栈,将Node应用日志经Fluentd传输至Elasticsearch,最终在Kibana展示,但Fluentd始终无法连接Elasticsearch,报错连接被拒绝。

错误信息

Could not communicate to Elasticsearch, resetting connection and trying again. Connection refused - connect(2) for 172.20.0.2:9200 (Errno::ECONNREFUSED)

相关配置文件

fluent.conf

<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>
<match *.**>
  @type copy
  <store>
    @type elasticsearch
    host elasticsearch
    port 9200
    user elastic
    password pass
  </store>
</match>

Dockerfile(Fluentd)

FROM fluent/fluentd:v1.15-1
USER root
RUN gem install elasticsearch -v 7.6.0
RUN gem install fluent-plugin-elasticsearch -v 4.1.1
RUN gem install fluent-plugin-rewrite-tag-filter
RUN gem install fluent-plugin-multi-format-parser
USER fluent

docker-compose.yml

version: '3'
services:
  fluentd:
    build: ./fluentd
    container_name: loggingFluent
    volumes:
      - ./fluentd/conf:/fluentd/etc
    ports:
      - "24224:24224"
      - "24224:24224/udp"
    links:
      - elasticsearch
    depends_on:
      - elasticsearch
      - kibana  
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.8.1
    container_name: elasticsearch-Logging
    ports:
      - 9200:9200
    expose:
      - 9200  
    environment:
      discovery.type: 'single-node'
      ES_JAVA_OPTS: '-Xms1024m -Xmx1024m'
      xpack.security.enabled: 'true'
      ELASTIC_PASSWORD: 'pass'
  kibana:
    image: docker.elastic.co/kibana/kibana:7.8.1
    container_name: kibana-Logging
    volumes:
      - ./kibana.yml:/usr/share/kibana/config/kibana.yml
    ports:
      - 5601:5601
    depends_on:
      - elasticsearch     
    links:
      - elasticsearch 

解决方案

1. 解决容器启动就绪问题

depends_on仅保证容器启动顺序,不确保Elasticsearch服务完全初始化完成。Fluentd启动时Elasticsearch可能还在加载,导致连接失败。

  • 在docker-compose.yml的fluentd服务中添加健康检查,等待Elasticsearch就绪:
    healthcheck:
      test: ["CMD", "curl", "-f", "http://elasticsearch:9200"]
      interval: 10s
      timeout: 5s
      retries: 5
    
  • 若容器内无curl,需修改Fluentd的Dockerfile,添加curl工具:
    RUN apk add --no-cache curl
    

2. 验证Elasticsearch服务状态

  • 查看Elasticsearch启动日志,确认服务正常就绪:
    docker logs elasticsearch-Logging
    
    日志中出现started字样表示服务初始化完成。
  • 进入Fluentd容器,直接测试Elasticsearch连接:
    docker exec -it loggingFluent bash
    curl -u elastic:pass http://elasticsearch:9200
    
    若返回Elasticsearch的JSON响应,说明网络和认证配置正常。

3. 优化Fluentd的Elasticsearch插件配置

在fluent.conf的Elasticsearch存储块中添加重试参数,提升容错性:

<store>
  @type elasticsearch
  host elasticsearch
  port 9200
  user elastic
  password pass
  retry_limit 10
  retry_wait 3s
  scheme http
</store>

4. 规范Docker网络配置

显式定义自定义网络,确保所有服务在同一网络内通信:
在docker-compose.yml末尾添加网络配置:

networks:
  efk-network:
    driver: bridge

然后在每个服务下添加网络关联:

networks:
  - efk-network

5. 排查Elasticsearch资源问题

Elasticsearch对内存要求较高,若日志中出现内存不足报错,需调整ES_JAVA_OPTS参数(确保宿主机有足够内存),或降低内存分配:

ES_JAVA_OPTS: '-Xms512m -Xmx512m'

验证步骤

  1. 重新构建并启动服务:
    docker-compose down && docker-compose up --build
    
  2. 查看Fluentd日志,确认不再出现连接拒绝错误:
    docker logs loggingFluent
    
  3. 在Kibana中创建索引模式,验证日志是否正常流入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:25:45