如何在 Ubuntu 16.04 上使用 Fluentd 和 ElasticSearch 集中管理 Docker 日志

一个文章从 Fluentd

介绍

当你将Docker容器滚动到生产中时,你会发现需要越来越多地保持日志比容器少。Docker配备了Fluentd的本地日志驱动程序,使其易于收集这些日志,并将其路由到其他地方,如 Elasticsearch,这样你就可以分析数据。

Fluentd是一个开源的数据收集器,旨在统一您的日志基础设施,将操作工程师,应用工程师和数据工程师聚集在一起,使其易于收集和存储日志。

Fluentd 有四个关键功能,使其适合建造清洁、可靠的木材管道:

*与JSON统一记录: 流利地尝试尽可能地将数据结构化为JSON. 这使得流利公司能够统一处理日志数据的所有方面:收集、过滤、缓冲和输出多个来源和目的地的日志。 JSON的下游数据处理要容易得多,因为它有足够的结构可以无障碍访问,而无需强制硬性计划. *可拆卸建筑: Fluentd有一个灵活的插件系统,允许社区扩展其功能. 300多个由社区贡献的插件将数十个数据源与数十个数据输出连接起来,根据需要操纵数据. 通过使用插件,可以立刻更好地利用你的日志. *最低限度所需资源: 数据收集器应该轻而易举,以便能在繁忙的机器上舒适地运行。 Fluentd由C和Ruby组合而成,需要最少的系统资源. 香草的例子运行在30-40MB的内存上,可以处理13000个事件/秒/核心. *基本可靠性: 数据损失不应该发生。 Fluentd支持基于内存和基于文件的缓冲,以防止节点间数据丢失. 流利还支持强力故障并可以被设置为高可用性. .

在本教程中,您将学习如何安装Fluentd并将其配置为从Docker容器收集日志,然后将数据流到在同一 Ubuntu 16.04服务器上运行Elasticsearch的其他容器,并查询日志。

前提条件

要完成本教程,您将需要以下内容:

第1步:安装Fluentd

安装 Fluentd的最常见的方式是通过 td-agent 包。 Treasure Data,Fluentd 的原创作者,包 Fluentd 具有自含的 Ruby 运行时间,所以您不需要设置 Ruby 环境来运行 Fluentd. 他们还提供一个脚本来获取最新的 td-agent 包,为您配置一个存储库并安装该包。

登录您的服务器作为您的非根用户:

1ssh sammy@your_server_ip

然后使用 Treasure Data 提供的脚本安装 td-agent. 首先,下载脚本:

1\curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent2.sh -o install-td-agent.sh

如果您想审核脚本,请使用文本编辑器打开它:

1nano install-td-agent.sh

一旦您对脚本的内容感到满意,请运行脚本来安装 td-agent:

1sh install-td-agent.sh

安装完成后,开始td-agent:

1sudo systemctl start td-agent

检查日志以确保它已成功安装:

1tail /var/log/td-agent/td-agent.log

您将看到类似于以下的输出:

 1[secondary_label Output]
 2    port 8888
 3  </source>
 4  <source>
 5    @type debug_agent
 6    bind 127.0.0.1
 7    port 24230
 8  </source>
 9</ROOT>
102016-12-02 19:45:31 +0000 [info]: listening fluent socket on 0.0.0.0:24224
112016-12-02 19:45:31 +0000 [info]: listening dRuby uri="druby://127.0.0.1:24230" object="Engine"

接下来,使用td-agent-gem命令安装 Fluentd 的 Elasticsearch 插件:

1sudo td-agent-gem install fluent-plugin-elasticsearch

另外,Fluentd 可作为 Ruby 宝石安装,并可使用gem install fluentd安装。

1gem install fluentd --no-rdoc --no-ri
2gem install fluentd-plugin-elasticsearch --no-rdoc --no-ri

美元

接下来,我们将配置 Fluentd,以便我们可以收听 Docker 事件并将其发送到 Elasticsearch 实例。

步骤 2 — 配置 Fluentd

Fluentd 需要知道从哪里收集信息,以及从哪里传输信息. 您可以将这些规则定义为位于 `/etc/td-agent/td-agent.conf 的 Fluentd 配置文件。

在文本编辑器中打开此文件:

1sudo nano /etc/td-agent/td-agent.conf

删除文件的内容. 你将在本教程中从头开始写自己的规则。

您在部分中定义信息来源. 将此配置添加到文件中:

1[label /etc/td-agent/td-agent.conf]
2<source>
3  @type forward
4  port 24224
5</source>

这将源定义为前进,即在TCP上运行的Fluentd协议,并将被Docker在向Fluentd发送日志时使用。

当日志记录进入时,它们将有一些额外的相关字段,包括时间,标签,消息,container_id和其他一些。

要配置此设置,请定义一个匹配部分,匹配标签字段的内容,并将其相应地路由。

1[label /etc/td-agent/td-agent.conf]
2<match docker.**>
3  @type elasticsearch
4  logstash_format true
5  host 127.0.0.1
6  port 9200
7  flush_interval 5s
8</match>

该规则说,每个带有docker前缀的标签的记录都将发送到 Elasticsearch,该记录在端口9200上运行在127.0.0.1

<$>[注] 有关缓冲和冲洗的更多细节,请参阅缓冲插件概览文档部分。

保存新配置文件后,重新启动td-agent服务,以便应用更改:

1sudo systemctl restart td-agent

现在Fluentd已为我们的目的配置正确,让我们安装Elasticsearch来从Fluentd捕捉我们的日志。

第3步:启动 Elasticsearch 容器

我们将使用 Docker 运行 Elasticsearch 实例,因为它比我们自己配置更快。我们将使用 Elasticsearch Docker 图像来创建我们的容器。为了使用此图像,请在您的 Docker 主机上增加 max_map_count 的值如下:

1sudo sysctl -w vm.max_map_count=262144

然后执行此命令来下载 Elasticsearch 图像并启动容器:

1docker run -d -p 9200:9200 -p 9300:9300 elasticsearch

图像将下载并启动 Elasticsearch 容器. 通过检查 Docker 流程并寻找容器来确保容器正常运行:

1docker ps

你应该看到这样的输出:

1[secondary_label Output]
2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
376e96943491f elasticsearch       "/docker-entrypoint.s"   About a minute ago Up 51 seconds 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp gigantic_hawking

如果容器没有列出,请在没有d开关的情况下重新启动,以便容器在前面运行。运行命令docker run -p 9200:9200 -p 9300:9300 elasticsearch并寻找任何特定的错误消息。最有可能遇到的错误是没有足够的系统内存,或者Docker主机上的max_map_count值太低。检查本教程中的所有步骤,以确保您没有错过任何东西,然后再试一次。

现在Elasticsearch在容器中运行,让我们生成一些日志并将其注入到Fluentd中。

第4步:从Docker容器生成日志

使用 Docker,您可以通过标准输出(‘STDOUT’)和错误(‘STDERR’)接口将日志视为数据流。当您启动 Docker 应用程序时,只需指示 Docker 使用本地 Fluentd 日志驱动程序扫除日志。

通过在 Docker 容器中启动一个 Bash 命令来测试这一点:

1docker run --log-driver=fluentd ubuntu /bin/echo 'Hello world'

这将打印Hello world消息到标准输出,但它也将被Docker Fluentd驱动程序捕捉到,并发送到您之前配置的Fluentd服务。大约五秒后,记录将被清洗到Elasticsearch。

这足以将日志转移到Elasticsearch,但您可能想看看官方文档(https://docs.docker.com/engine/admin/logging/fluentd/)以了解有关您可以使用Docker管理Fluentd驱动程序的选项的更多细节。

最后,让我们确认 Elasticsearch 正在接收事件. 使用弯曲向 Elasticsearch 发送查询:

1curl -XGET 'http://localhost:9200/_all/_search?q=*'

输出将包含看起来像这样的事件:

1{"took":2,"timed_out":false,"_shards":{"total":1,"successful":1,"failed":0},"hits":{"total":1,"max_score":1.0,"hits":[{"_index":"logstash-2016.12.02","_type":"fluentd","_id":"AVQwUi-UHBhoWtOFQKVx","_score":1.0,"_source":{"container_id":"d16af3ad3f0d361a1764e9a63c6de92d8d083dcc502cd904155e217f0297e525","container_name":"/nostalgic_torvalds","source":"stdout","log":"Hello world","@timestamp":"2016-12-02T14:59:26-06:00"}}]}}

根据您的设置,您可能有相当多的事件登录。一个单一的事件应该从``采取:开始,并以时间标签结束. 它还将包含与源容器相关的一些额外信息。

结论

从Docker容器收集日志只是使用Fluentd的一种方式。许多用户来到Fluentd建立一个日志管道,该管道既可以实时搜索日志,也可以进行长期存储。该架构利用Fluentd的能力来复制数据流并将其输出到多个存储系统。

Web应用程序产生大量日志,它们经常被任意格式化并存储在本地文件系统中. 这可能带来两个原因。 首先,日志在程序上难以解析,需要大量正态表达式,因此,希望通过统计分析了解用户行为,审查A/B测试结果,或进行欺诈检测的人也不太容易获得.

其次,日志无法实时访问,因为文本日志被大量加载到存储系统中,更糟糕的是,如果服务器的磁盘在大量加载之间被破坏,则日志会丢失或被破坏。

流利地解决了这两个问题,为各种编程语言提供记录器库,具有一致的API. 每个日志员向流利德发送包含时间戳,标记,以及JSON格式事件的记录,就像你在这个教程中看到的. 鲁比,Node.js,Go,Python,Perl,PHP,Java和C++都有开发库. 这样可以让应用程序起火并遗忘;日志将数据发送到流畅的同步上,然后在将日志传送到后端系统之前缓冲.

您可以使用 Fluentd 和 Elasticsearch 做很多其他有用的事情,您可能会发现以下链接很有趣:

Published At
Categories with 技术
comments powered by Disqus