1

我正在尝试在 docker 容器上使用 fluent-bit 设置 EFK 堆栈。虽然我可以将日志从 fluent-bit 推送到 elasticsearch,但当我尝试集成 fluentd 时,我遇到了问题。这是确切的错误消息:

意外错误 error_class=Errno::EADDRNOTAVAIL error="地址不可用 - bind(2) for \"fluent-bit\" port 24224"

我的docker-compose文件中的服务

  弹性搜索:
    图片:docker.elastic.co/elasticsearch/elasticsearch:${TAG}
    端口:
      - '9200:9200'
      - '9300:9300'
    卷:
      - 类型:绑定
        来源:./config/elasticsearch.yml
        目标:/usr/share/elasticsearch/config/elasticsearch.yml
        只读:真
      - 类型:体积
        来源:弹性搜索
        目标:/usr/share/elasticsearch/data
    网络:
      - efk_1
  流利的:
    图片:流利/流利:${FLBV}
    端口:
      - '24224:24224'
    卷:
      - 类型:绑定
        来源:./config/fluent.conf
        目标:/fluentd/etc/fluent.conf
        只读:真
    网络:
      - efk_1
    取决于:
      - 弹性搜索
  流利位:
    图片:流利/流利位:${FBITV}
    端口:
      - '2020:2020'
    卷:
      - 类型:绑定
        来源:./config/fluent-bit.conf
        目标:/fluent-bit/etc/fluent-bit.conf
        只读:真
      - 类型:绑定
        来源:./sample_logs
        目标:/var/log
    网络:
      - efk_1
    取决于:
      - 流利

以前我像这样直接将日志从 fluent-bit 推送到 elasticsearch,而无需在任何地方进行 fluentd 配置:

[SERVICE]
    Flush   2
    Log_Level   debug

[INPUT]
    Name    tail
    Path    /var/log/log.txt

[OUTPUT]
    Name    es
    Match   *
    Host    elasticsearch
    Port    9200

这成功地将日志推送到elasticsearch,但是现在我在两者之间添加了fluentd,所以fluent-bit会将日志发送到fluentd,然后再推送到elasticsearch。

流利的位conf:

[SERVICE]
    Flush   2
    Log_Level   debug

[INPUT]
    Name    tail
    Path    /var/log/log.txt

[OUTPUT]
    Name    forward
    Match   *
    Host    fluentd

流利的conf:

<source>
    @type forward
    bind fluent-bit
</source>

<match **>
    @type stdout
</match>

这给了我错误,因为即使它们是同一个 docker 网络的一部分,它们也无法检测到地址。

这些是我得到的错误:

流利位_1 | [2019/11/06 10:31:02] [error] [io] TCP 连接失败:fluentd:24224(连接被拒绝)

流利的_1 | 2019-11-06 10:31:02 +0000 [错误]:#0 意外错误 error_class=Errno::EADDRNOTAVAIL 错误="地址不可用 - 绑定 (2) 用于 \"fluent-bit\" 端口 24224"

有人可以帮我知道我在哪里犯了错误吗?

4

3 回答 3

1

我创建了下一个配置:docker-compose.yaml

version: "3.7"

services:
  fluentd:
    image: fluent/fluentd:v1.7.4-1.0
    ports:
      - '24224:24224'
    volumes:
      - type: bind
        source: ./config/fluent.conf
        target: /fluentd/etc/fluent.conf
        read_only: true
  fluent-bit:
    image: fluent/fluent-bit:0.14
    ports:
      - '2020:2020'
    volumes:
      - type: bind
        source: ./config/fluent-bit.conf
        target: /fluent-bit/etc/fluent-bit.conf
        read_only: true
      - type: bind
        source: /var/log/
        target: /var/log/
    depends_on:
      - fluentd

流利的.conf

<source>
  @type forward
  bind 0.0.0.0
  port 24224
</source>

<match test>
  @type stdout
</match>

流利的bit.conf

[SERVICE]
    Flush   2
    Log_Level   debug

[INPUT]
    Name    tail
    Path    /var/log/syslog
    Tag     test

[OUTPUT]
    Name    forward
    Match   *
    Host    fluentd

在这些配置中,fluentd run 和 fluent-bit 能够发送 syslog

于 2019-11-08T10:54:13.030 回答
0

我认为你流利的配置应该是这样的:

<source>
  type forward
  bind 0.0.0.0
  port 24224
</source>

<match fluent_bit>
  type stdout
</match>

正如在文档中

可能 fluentd 在绑定字段中应该有明确的 IP 而不是主机名。

请参阅问题错误描述

于 2019-11-06T11:42:40.560 回答
0

您的 fluentd 配置需要在输入上绑定到 0.0.0.0,并将输出发送到 ES:

<source>
    @type forward
    port 24224
    bind 0.0.0.0
</source>

<match **>
    @type copy
    <store>
      @type               elasticsearch
      host                ${ELASTICSEARCH_URL}
      port                9200
    </store>
</match>

甚至可能还会更改您的 Fluent Bit 输出:

[OUTPUT]
    Name    forward
    Match   *
    Host    0.0.0.0
    Port    24224

如果您可以使其正常工作,则可以调整设置以按名称和端口调用容器

于 2020-02-04T18:54:08.857 回答