前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Ubuntu 14.04上使用Fluentd和ElasticSearch集中Docker日志

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

原创
作者头像
信姜缘
修改2018-09-21 09:58:10
1.3K0
修改2018-09-21 09:58:10
举报

介绍

什么是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

代码语言:javascript
复制
curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh

开始td-agent

代码语言:javascript
复制
sudo /etc/init.d/td-agent start

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

代码语言:javascript
复制
tail /var/log/td-agent/td-agent.log

您应该看到类似于以下内容的输出:

代码语言:javascript
复制
    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包:

代码语言:javascript
复制
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9

将存储库添加到源:

代码语言:javascript
复制
sudo sh -c "echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list"

更新您的系统:

代码语言:javascript
复制
sudo apt-get update

安装Docker:

代码语言:javascript
复制
sudo apt-get install lxc-docker

通过检查版本来验证是否已安装Docker:

代码语言:javascript
复制
docker --version

您应该看到如下输出:

代码语言:javascript
复制
Docker version 1.5.0, build a8a31ef

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

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

代码语言:javascript
复制
sudo gpasswd -a sammy docker

然后,重启Docker。

代码语言:javascript
复制
sudo service docker restart

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

第4步 - 建立流利的图像

在本节中,我们将为Fluentd Docker容器创建Docker镜像。

为您的Fluentd Docker资源创建一个新目录,然后进入该目录:

代码语言:javascript
复制
mkdir ~/fluentd-docker && cd ~/fluentd-docker

创建以下内容Dockerfile

代码语言:javascript
复制
sudo nano Dockerfile

准确地将以下内容添加到您的文件中。该文件告诉Docker更新Docker容器并安装Ruby,Fluentd和Elasticsearch:

代码语言:javascript
复制
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文件。

代码语言:javascript
复制
sudo nano fluent.conf

fluent.conf文件应如下所示。您可以完全复制此文件:

代码语言:javascript
复制
<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

代码语言:javascript
复制
docker build -t fluentd-es .

这将需要几分钟才能完成。检查您是否已成功构建图像:

代码语言:javascript
复制
docker images

你应该看到这样的输出:

代码语言:javascript
复制
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容器的主目录或首选目录:

代码语言:javascript
复制
cd ~

下载并启动Elasticsearch容器。已有一个自动构建:

代码语言:javascript
复制
docker run -d -p 9200:9200 -p 9300:9300 --name es dockerfile/elasticsearch

等待容器映像下载并启动。

接下来,通过检查Docker进程,确保Elasticsearch容器正常运行:

代码语言:javascript
复制
docker ps

你应该看到这样的输出:

代码语言:javascript
复制
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。

代码语言:javascript
复制
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进程来检查容器是否正在运行:

代码语言:javascript
复制
docker ps

这次,您应该看到Elasticsearch容器和新fluentd-es容器:

代码语言:javascript
复制
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正在接收事件:

代码语言:javascript
复制
curl -XGET 'http://localhost:9200/_all/_search?q=*'

输出应包含如下所示的事件:

代码语言:javascript
复制
{"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》

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 主要特征
  • 目标:使用流利的收集集中的Docker容器日志
  • 准备
  • 第1步 - 安装Fluentd
  • 第2步 - 安装Docker
  • 第3步 - 将用户添加到docker Group
  • 第4步 - 建立流利的图像
  • 第5步 - 启动Elasticsearch容器
  • 第6步 - 启动Fluentd-to-Elasticsearch容器
  • 第7步 - 确认Elasticsearch正在接收事件
  • 结论
    • 用例1:实时日志搜索和日志存档
      • 用例2:集中式应用程序日志记录
      相关产品与服务
      Elasticsearch Service
      腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
      http://www.vxiaotou.com