如何集中你的Docker用原木和Fluentd上ElasticSearch 14.04的Ubuntu

[Fluentd](https://www.fluentd.org)是一个旨在统一日志基础设施一个开源的数据收集器。它的目的是通过简单和可扩展性,以收集和存储日志,以使运营工程师,应用工程师和数据工程师一起工作。本教程演示了如何安装Fluentd并用它来从Docker容器收集日志。我们将流式传输数据到相同的Ubuntu 14.04服务器上运行Elasticsearch另一个容器。

来自第Fluentd

介绍

什么是Fluentd? Fluentd是一个开源数据收集器,旨在统一日志记录基础结构。它旨在通过使操作工程师,应用程序工程师和数据工程师简单和可扩展地收集和存储日志,使它们相互联系在一起。 之前Fluentd 凌乱的日志结构显示了许多程序之间的关系 后Fluentd Fluentd从许多来源收集应用程序和访问日志,并将其归入许多分析,归档和度量输出

主要特征

Fluentd有四个主要功能,使其适合于构建清洁,可靠的测井管道:
  • 使用JSON统一日志记录:Fluentd试图构建数据作为JSON尽可能。这允许Fluentd统一处理日志数据的所有方面:在多个源和目标中收集,过滤,缓冲和输出日志。使用JSON,下游数据处理更容易,因为它具有足够的结构,无需强制使用刚性模式即可访问
  • 可插拔架构:Fluentd有一个灵活的插件系统,让社区来扩展其功能。 300多个社区提供的插件将几十个数据源连接到数十个数据输出,根据需要处理数据。通过使用插件,您可以更好地使用您的日志马上
  • 最少的资源要求:一个数据收集要轻便,使用户可以在繁忙的机器上轻松运行。 Fluentd是以C和Ruby的组合编写的,并且需要最少的系统资源。香草实例运行在30-40MB内存,可以处理13,000个事件/秒/核心
  • 内置的可靠性:数据丢失情况不应该发生。 Fluentd支持基于内存和文件的缓冲,以防止节点间数据丢失。 Fluentd还支持强大的故障转移,并且可以设置为高可用性

目标:使用Fluentd收集集中式Docker容器日志

随着Docker容器在生产中推出,越来越需要将容器日志保存在比容器更短暂的地方。 在本教程中,我们将向您展示如何安装Fluentd并使用它来收集来自Docker容器的日志,将它们存储在外部,以便在容器停止后可以保存数据。我们将数据流传输到运行Elasticsearch的另一个容器,在同一个Ubuntu 14.04服务器上。 正如概述Kubernetes的GitHub库 ,该架构采用Fluentd的能力,尾巴和解析由Docker守护每个容器生产的JSON每行日志文件。 对于一个最小的设置,请参阅本Recipe 。 在本教程的最后,我们将讨论另外两个用例。阅读本文后,您应该知道如何使用Fluentd的基础知识。

先决条件

请确保您完成本教程的这些先决条件。

第1步 - 安装Fluentd

部署Fluentd的最常见的方法是通过td-agent包。 Treent Data是Fluentd的原作者,它将Fluentd与其自己的Ruby运行时组合在一起,以便用户不需要设置自己的Ruby来运行Fluentd。 目前, td-agent支持以下平台:
  • Ubuntu:Lucid,Precise和Trusty
  • Debian:Wheezy和Squeeze
  • RHEL / Centos:5,6和7
  • Mac OSX:10.9及以上
在本教程中,我们假设您使用的是运行Ubuntu 14.04 LTS(Trusty)的DigitalOcean Droplet。 安装td-agent使用以下命令:
curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh
启动td-agent
sudo /etc/init.d/td-agent start
检查日志以确保已成功安装:
tail /var/log/td-agent/td-agent.log
您应该看到类似以下的输出:
    port 24230
  </source>
</ROOT>
2015-02-22 18:27:45 -0500 [info]: adding source type="forward"
2015-02-22 18:27:45 -0500 [info]: adding source type="http"
2015-02-22 18:27:45 -0500 [info]: adding source type="debug_agent"
2015-02-22 18:27:45 -0500 [info]: adding match pattern="td.*.*" type="tdlog"
2015-02-22 18:27:45 -0500 [info]: adding match pattern="debug.**" type="stdout"
2015-02-22 18:27:45 -0500 [info]: listening fluent socket on 0.0.0.0:24224
2015-02-22 18:27:45 -0500 [info]: listening dRuby uri="druby://127.0.0.1:24230" object="Engine"
注:另外,Fluentd可以作为一个RubyGem,可与安装gem install fluentd 。 如果你没有Sudo权限,请安装Ruby(参见安装Ruby这里,例如),然后运行:
gem install fluentd --no-rdoc --no-ri

第2步 - 安装Docker

现在我们将安装Docker。本教程使用Docker v1.5.0进行测试。 添加Docker仓库的密钥,以便我们可以获得最新的Docker软件包:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
将存储库添加到源:
sudo sh -c "echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
更新系统:
sudo apt-get update
安装Docker:
sudo apt-get install lxc-docker
通过检查版本来验证Docker是否已安装:
docker --version
您应该看到如下输出:
Docker version 1.5.0, build a8a31ef

第3步 - 将用户添加到docker组

Docker以root身份运行,所以为了发出docker命令,你的sudo用户添加到Docker组。 替换sammy与您所选择的用户。
sudo gpasswd -a sammy docker
然后,重新启动Docker。
sudo service docker restart
最后,如果您目前以您的sudo用户身份登录,则必须注销并重新登录。

第4步 - 构建流畅的图像

在本节中,我们将为Fluentd Docker容器创建Docker镜像。如果您想了解更多关于Docker一般,请阅读本入门教程 。 为您的Fluentd Docker资源创建一个新目录,并移入其中:
mkdir ~/fluentd-docker && cd ~/fluentd-docker
创建以下Dockerfile
sudo nano Dockerfile
将以下内容完全添加到您的文件。这个文件告诉Docker更新Docker容器并安装Ruby,Fluentd和Elasticsearch:
FROM ruby:2.2.0
MAINTAINER kiyoto@treausuredata.com
RUN apt-get update
RUN gem install fluentd -v "~>0.12.3"
RUN mkdir /etc/fluent
RUN apt-get install -y libcurl4-gnutls-dev make
RUN /usr/local/bin/gem install fluent-plugin-elasticsearch
ADD fluent.conf /etc/fluent/
ENTRYPOINT ["/usr/local/bundle/bin/fluentd", "-c", "/etc/fluent/fluent.conf"]
您还需要创建一个fluent.conf在同一个目录下的文件。
sudo nano fluent.conf
fluent.conf文件应该是这样的。您可以完全复制此文件:
<source>
  type tail
  read_from_head true
  path /var/lib/docker/containers/*/*-json.log
  pos_file /var/log/fluentd-docker.pos
  time_format %Y-%m-%dT%H:%M:%S
  tag docker.*
  format json
</source>
# Using filter to add container IDs to each event
<filter docker.var.lib.docker.containers.*.*.log>
  type record_transformer
  <record>
    container_id ${tag_parts[5]}
  </record>
</filter>

<match docker.var.lib.docker.containers.*.*.log>
  type elasticsearch
  logstash_format true
  host "#{ENV['ES_PORT_9200_TCP_ADDR']}" # dynamically configured to use Docker's link feature
  port 9200
  flush_interval 5s
</match>
这个文件的目的是告诉Fluentd在哪里可以找到其他Docker容器的日志。 然后,建立自己的形象Docker,被称为fluentd-es
docker build -t fluentd-es .
这将需要几分钟时间完成。检查您是否已成功构建映像:
docker images
你应该看到这样的输出:
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
fluentd-es          latest              89ba1fb47b23        2 minutes ago       814.1 MB
ruby                2.2.0               51473a2975de        6 weeks ago         774.9 MB

第5步 - 启动Elasticsearch容器

现在,返回到您的Elasticsearch容器的主目录或首选目录:
cd ~
下载并启动Elasticsearch容器。已经有一个自动化的构建:
docker run -d -p 9200:9200 -p 9300:9300 --name es dockerfile/elasticsearch
等待容器映像下载并启动。 接下来,通过检查Docker进程,确保Elasticsearch容器正常运行:
docker ps
你应该看到这样的输出:
CONTAINER ID        IMAGE                           COMMAND             CREATED             STATUS              PORTS                                           NAMES
c474fd99ce43        dockerfile/elasticsearch:latest   "/elasticsearch/bin/   4 minutes ago      Up 4 minutes        0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   es

第6步 - 启动Fluentd到Elasticsearch容器

现在我们将启动运行Fluentd的容器,收集日志,并将它们发送到Elastcisearch。
docker run -d --link es:es -v /var/lib/docker/containers:/var/lib/docker/containers fluentd-es
在上面的命令中, --link es:es部联结的Elasticsearch容器的Fluentd容器。 该-v /var/lib/docker/containers:/var/lib/docker/containers需要部分主机容器的日志目录挂载到Fluentd容器,这样可以Fluentd尾创建日志文件作为容器。 最后,通过检查我们的活动Docker进程来检查容器是否正在运行:
docker ps
这个时候,你应该同时看到Elasticsearch容器和新fluentd-es容器:
CONTAINER ID        IMAGE                           COMMAND             CREATED             STATUS              PORTS                                           NAMES
f0d2cac81ac8        fluentd-es:latest               "/usr/local/bundle/b   2 seconds ago    Up 2 seconds                                                        stupefied_brattain
c474fd99ce43        dockerfile/elasticsearch:latest   "/elasticsearch/bin/   6 minutes ago      Up 6 minutes        0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   es

第7步 - 确认Elasticsearch正在接收事件

最后,让我们确认Elasticsearch正在接收事件:
curl -XGET 'http://localhost:9200/_all/_search?q=*'
输出应包含如下所示的事件:
{"took":66,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":0,"max_score":null,"hits":[]}}
{"took":59,"timed_out":false,"_shards":{"tod","_id":"AUwLaKjcnpi39wqZnTXQ","_score":1.0,"_source":{"log":"2015-03-12 00:35:44 +0000 [info]: following tail of /var/lib/docker/containers/6abeb6ec0019b2198ed708315f4770fc7ec6cc44a10705ea59f05fae23b81ee9/6abeb6ec0019b2198ed708315f4770fc7ec6cc44a10705ea59f05fae23b81ee9-json.log\n","stream":"stdout","container_id":"6abeb6ec0019b2198ed708315f4770fc7ec6cc44a10705ea59f05fae23b81ee9","@timestamp":"2015-03-12T00:35:44+00:00"}}]}}
根据您的设置,可能记录了很多事件。单个事件应该启动{"took":和时间戳结束。 如此输出所示,Elasticsearch正在接收数据。 (您的容器ID将不同于上面显示的!)

第8步 - 将事件日志转到下一级

现在你的容器事件正在被Elasticsearch保存,接下来应该怎么做?有很多有用的事情与Elasticsearch有关。如果你正在寻找想法,你可能想检查:

结论

从Docker容器收集日志只是使用Fluentd的一种方法。在本节中,我们将介绍Fluentd的其他两个常见用例。

用例1:实时日志搜索和日志归档

许多用户来到Fluentd构建一个日志管道,既可以进行实时日志搜索,也可以长期存储。架构看起来像这样: 从多个后端到Elasticsearch,MongoDB和Hadoop的漏洞日志 此架构利用Fluentd复制数据流并将其输出到多个存储系统的能力。在上述设置中,Elasticsearch用于实时搜索,而MongoDB和/或Hadoop用于批处理分析和长期存储。

用例2:集中应用程序日志记录

Web应用程序产生大量日志,它们通常格式化并存储在本地文件系统上。这是坏的,有两个原因:
  • 日志很难以编程方式解析(需要大量的正则表达式),因此对那些希望通过统计分析(A / B测试,Cheat检测等)理解用户行为的人不是很容易访问。
  • 日志无法实时访问,因为文本日志被批量加载到存储系统中。此外,如果服务器的磁盘在批量加载之间损坏,日志将丢失或损坏
Fluentd通过以下方式解决这些问题:
  • 使用一致的API提供各种编程语言的记录器库:每个记录器向Fluentd发送三次(timestamp,tag,JSON格式的事件)。目前,有Ruby,Node.js,Go,Python,Perl,PHP,Java和C ++的记录器库
  • 允许应用程序“触发并忘记”:记录器可以异步地与Fluentd进行日志记录,Fluentd会在上传到后端系统之前缓冲日志
资源: