如何在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 条评论
登录 后参与评论

相关文章

来自专栏腾讯云容器服务团队的专栏

Deployment vs ReplicationController in Kubernetes

此文主要选择了两个最常用的 controller : Deployment 和 ReplicationController ,从各自功能,优缺点方面进行对比,...

2.8K00
来自专栏友弟技术工作室

docker微服务初体验

在介绍微服务时,首先得先理解什么是微服务,顾名思义,微服务得从两个方面去理解,什么是"微"、什么是"服务", 微 狭义来讲就是体积小、单个服务的设计。 而所谓服...

58080
来自专栏Tencentcloud

Docker,请做好自己的清理工作

最近,我们开始对一些应用程序进行docker化,不得不说,我简直爱上了Docker!这是一个非常棒的工程,在AWS EC2的软件运用的基础上,它让我们的生活变得...

80970
来自专栏北京马哥教育

把docker镜像当作桌面系统来用

博主一直都很喜欢思考怎样管理装在自己电脑上的桌面系统,这篇算是前作能当主力,能入虚拟机,还能随时打包带走,Linux就是这么强大的后续探索吧。

20700
来自专栏素质云笔记

caffe镜像︱window10+docker+ubuntu14.04+caffe镜像的简单尝试

win10专业版可以利用Hyper-V开启docker,一般升级而来的都是家庭版,现在要升级到win10专业版, 需要产品秘钥。 github网址:h...

34390
来自专栏Java后端技术

Docker三十分钟快速入门(下)

  上篇文章我们进行了Docker的快速入门,基本命令的讲解,以及简单的实战,那么本篇我们就来实战一个真实的项目,看看怎么在产线上来通过容器技术来运行我们的项...

10520
来自专栏owent

Lnmp yum 安装脚本 (for CentOS)

心情大好,给VPS升级了一下系统,然后自己配了LNMP安装脚本,用yum源安装的话更新比较方便点哈 ​​这个过程挺麻烦啊,所以果断要记下来,以防以后要用到 ...

25210
来自专栏云计算D1net

使用Docker时应该避免这10 件事…

容器可以解决很多问题,并且具有诸多优势,当你投身其中时便会发现其奥妙所在。 第一:容器是不可变的 - 操作系统,库版本,配置,文件夹和应用程序都包装在容器内。 ...

36270
来自专栏coder修行路

Docker入门简介

Docker的概念 什么是Docker? Docker是一个开源平台,包含:容器引擎和Docker Hub注册服务器 Docker容器引擎:可以将开发者打包他们...

208100
来自专栏友弟技术工作室

docker微服务初体验配置文件composedocker compose使用

99050

扫码关注云+社区

领取腾讯云代金券