专栏首页云计算教程系列如何在Ubuntu 14.04上使用Fluentd和ElasticSearch集中Docker日志
原创

如何在Ubuntu 14.04上使用Fluentd和ElasticSearch集中Docker日志

介绍

什么是Fluentd?

Fluentd是一个开源数据收集器,旨在统一日志记录基础架构。它旨在通过简化和扩展日志来收集和存储日志,从而将运营工程师,应用工程师和数据工程师聚集在一起。

在Fluentd之前

在Fluentd之后

主要特征

Fluentd有四个关键功能,使其适合构建清洁,可靠的日志管道:

  • 使用JSON进行统一日志记录: Fluentd尝试尽可能地将数据结构化为JSON。这使得Fluentd能够统一处理日志数据的各个方面:收集,过滤,缓冲和输出跨多个源和目标的日志。使用JSON可以更轻松地进行下游数据处理,因为它具有足够的结构,可以在不强制使用严格模式的情况下进行访问
  • 可插拔架构: Fluentd拥有灵活的插件系统,允许社区扩展其功能。300多个社区贡献的插件将数十个数据源连接到数十个数据输出,根据需要操作数据。通过使用插件,您可以立即更好地使用日志
  • 所需的最低资源:数据收集器应该是轻量级的,以便用户可以在繁忙的机器上舒适地运行它。Fluentd是用C和Ruby组合编写的,需要最少的系统资源。vanilla实例运行30-40MB内存,可处理13,000个事件/秒/核心
  • 内置可靠性:绝不应该发生数据丢失。Fluentd支持基于内存和文件的缓冲,以防止节点间数据丢失。Fluentd还支持强大的故障转移功能,可以设置为高可用性

目标:使用流利的收集集中的Docker容器日志

随着Docker容器在生产中推出,越来越需要将容器的日志保存在比容器更短暂的地方。

在本教程中,我们将向您展示如何安装Fluentd并使用它来从Docker容器中收集日志,并将它们存储在外部,以便在容器停止后保存数据。我们将在同一个Ubuntu 14.04服务器上将数据流式传输到运行Elasticsearch的另一个容器。

正如Kubernetes的GitHub存储库中所述,该体系结构使用Fluentd的功能来为每个容器分析和解析Docker守护程序生成的每行JSON日志文件。如需最小化设置,请参阅此配方

在本教程结束时,我们将讨论另外两个用例。阅读本文后,您应该了解如何使用Fluentd的基础知识。

准备

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

  • Ubuntu 14.04 腾讯云CVM
  • 有sudo访问权限的用户(你可能需要一台已经设置好可以使用sudo命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。)

第1步 - 安装Fluentd

部署Fluentd最常见的方法是通过td-agent软件包。Fluentd的原作者Treasure Data将Fluentd打包为自己的Ruby运行时,这样用户就不需要设置自己的Ruby来运行Fluentd。

目前,td-agent支持以下平台:

  • Ubuntu:Lucid, Precise and Trusty
  • Debian:Wheezy和Squeeze
  • RHEL / Centos:5,6和7
  • Mac OSX:10.9及以上

在本教程中,我们假设您使用的是运行Ubuntu 14.04 LTS(Trusty)的腾讯云CVM。

使用以下命令安装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可作为Ruby gem使用,可以安装gem install fluentd。如果您没有sudo权限,请安装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 Group

Docker以root身份运行,因此为了发出docker命令,请将您的sudo用户添加到docker组。把sammy替换为您选择的用户。

sudo gpasswd -a sammy docker

然后,重启Docker。

sudo service docker restart

最后,如果您当前以sudo用户身份登录,则必须注销并重新登录。

第4步 - 建立流利的图像

在本节中,我们将为Fluentd 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-to-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将与上面显示的不同!)

结论

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

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

许多用户来到Fluentd构建一个既可以进行实时日志搜索又可以进行长期存储的日志管道。架构看起来像这样:

该架构利用了Fluentd复制数据流并将其输出到多个存储系统的能力。在上面的设置中,Elasticsearch用于实时搜索,而MongoDB和/或Hadoop用于批量分析和长期存储。

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

Web应用程序生成大量日志,并且它们通常被任意格式化并存储在本地文件系统中。这有两个原因:

  • 日志很难以编程方式解析(需要大量正则表达式),因此对于那些希望通过统计分析(A / B测试,欺诈检测等)了解用户行为的人来说,它们不是很容易理解的。
  • 无法实时访问日志,因为文本日志已批量加载到存储系统中。此外,如果服务器的磁盘在批量加载之间损坏,则日志会丢失或损坏

Fluentd通过以下方式解决了这些问题:

  • 使用一致的API为各种编程语言提供记录器库:每个记录器向Fluentd发送三倍(时间戳,标记,JSON格式的事件)。目前,有Ruby,Node.js,Go,Python,Perl,PHP,Java和C ++的记录器库
  • 允许应用程序“发射并忘记”:记录器可以异步记录到Fluentd,Fluentd在上传到后端系统之前反过来缓冲日志

资源:

更多Ubuntu教程请前往腾讯云+社区学习更多知识。

参考文献:《How To Centralize Your Docker Logs with Fluentd and ElasticSearch on Ubuntu 14.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何在Ubuntu 16.04上使用Apache或Nginx加密Tomcat 8连接

    Apache Tomcat是一个Web服务器和servlet容器,旨在为Java应用程序提供服务。Tomcat经常用于生产企业部署和较小的应用程序需求,既灵活又...

    信姜缘
  • 如何在Ubuntu 14.04上备份,还原和迁移MongoDB数据库

    MongoDB是最受欢迎的NoSQL数据库引擎之一。它以可扩展,强大,可靠和易于使用而闻名。在本文中,我们将向您展示如何备份,还原和迁移MongoDB数据库。

    信姜缘
  • 如何使用WP-CLI安装WordPress

    很多人都熟悉WordPress的安装,Wordpress安装起来非常简单,其号称5分钟快速安装。但是,当您需要部署多个Wordpress时,重复的工作会拖慢你大...

    信姜缘
  • 【赵强老师】Docker的日志

    Docker的日志分两类,一类是 Docker引擎的日志;另一类是容器日志。下面我们分别进行介绍。

    赵强老师
  • 5个Docker 1.8的Fluentd Logging Driver用例

    这篇文章来自 Kiyoto Tamura。

    Noah____________________
  • 为Spring开发者准备的Docker备忘录

    我最近一直在使用 Docker 去部署 Spring Boot 应用程序。Docker非常的酷。我学到了很多 Docker 的技巧。

    用户1070112
  • ASP.NET Core & Docker 实战经验分享

    晓晨
  • Docker支持更深入的容器日志分析

    应用容器平台Docker本周基于各个公司对容器化应用程序分发支持的全面性程度,宣布了针对容器应用程序日志管理的生态系统技术合作伙伴(ETP: Ecosystem...

    CSDN技术头条
  • 【趣学程序】Docker之简介安装

    一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本...

    趣学程序-shaofeer
  • OpenStack支持哪些容器编排引擎?

    组织通常会使用容器编排工具,有时称为编排引擎,来部署、扩展和连接不同的容器技术组件。这些编排工具还帮助企业监控容器实例,从而缓解容器蔓延到整个企业。 ? Ope...

    静一

扫码关注云+社区

领取腾讯云代金券