使用Docker和Rancher运行你自己的ELK环境。
Rancher实验室的各种内部环境每天都会生成大量的日志。因为我们要依赖这些环境执行越来越多的测试,所以把不同环境的日志集中管理起来起来就显得十分必要了。本次给大家带来的是如何使用Rancher来构建和运行一个可以弹性伸缩的ELK服务栈来管理哲学日志。 对于不太熟悉ELK的同学,ELK分别代表:Elasticsearch、Logstash和Kibana。Logstash提供从
RancherLabs的各种内部环境每天都会生成大量的日志。因为我们要依赖这些环境执行越来越多的测试,所以把不同环境的日志集中管理起来起来就显得十分必要了。本次给大家带来的是如何使用Rancher来构建和运行一个可以弹性伸缩的ELK服务栈来管理这些日志。
对于不太熟悉ELK的同学,ELK分别代表:Elasticsearch、Logstash和Kibana。Logstash提供从多种收集和传递日志的渠道,组合传递日志消息到Elasticsearch或其它的存储系统中,它是一个非常强大的日志武器。Elasticsearch是一种非常善于处理查询的文档数据库,它可以从Logstash获取日志处理结果,分析并提供全方位查询接口。最后,加上Kibana(一个非常强大的可视化工具),用来展示Elasticsearch的结果数据,你会发现你的日志也可以变成一道靓丽的景观。
之前,我们介绍过的Elastic’s Found产品相信给大家留下了深刻的印象。同时我们意识到了一个非常有意思的事情,那就是ELK的组成部件是互不影响的,各有各的需求和设计理念。Found给我们贡献了Elasticsearch和Kibana,但是我们并没有找到Logstash的相关配置(尽管文档中似乎已经提供了使用方法)。所以,我们必须自己解决Logstash的接入问题。
Logstash
我们的Logstash实现分为3层,分别用于:收集、队列和处理。
收集层:负责提供远程endpoints作为日志输入(就像Syslog、Gelf或Logstash),一旦接收到日志,就会迅速把日志存放到Redis队列中去。
队列层:通过Redis实现(一种非常高效的内存数据库),作为收集层和处理层的缓存。
处理层:从队列中删除消息,通过filter插件操作日志,使其转化为我们希望的格式。处理层任务最为繁重,所以它经常会成为日志处理通道的瓶颈。最终,一旦日志处理完成,就会被发往Elasticsearch。
每一个Logstash容器都有一个配置助手,通过共享volume实现配置。
通过把服务栈划分成不同的层,你可以调整任一部分的规模或适配不同部分而不用担心会影响其它部分,甚至根据您的需要调整每一层的规模或进行适配。对应该如何很好的规划Logstash,可以参考文章:Deploying and Scaling Logstash。
对于如何构建Logstash,总的来说,就是尽可能的依靠社区的力量。通过查看DockerHub,我们看到已经存在了一个Logstash的官方镜像(由docker提供)。其实真正的难点在于如何配置Logstash的各个层。为了获得最大的灵活性,我们构建了一个confd容器,使用Key-Value方式,而配置信息作为value存在。
Logstash的配置是非常不固定的,对于不同的组织,提供的收集、索引、分发接口也会有所不同。不同组织会采用不同的处理方式、格式、标签等。为了获得最大的灵活性,我们使用confd工具和Rancher助手容器。助手容器在Rancher中创建一个原子调度单元。在这种方式下,我们的配置容器通过使用共享volume的方式暴露配置文件给Logstash容器。通过这种方法,有效的避免了修改官方的Logstash镜像。
Elasticsearch
Elasticsearch服务也划分为3层。当您阅读其生产部署建议,里边讨论了包括主节点、数据节点、客户节点的部署方式。我们参考了同样的范例实现了相同的部署,把每个角色部署成一个服务,每个服务都是由官方镜像和Confd助手容器组成的(提供配置信息),最终其部署完成后如下图所示:
Elasticsearch服务栈的每一层都有一个confd容器通过共享volume提供配置。这些配置容器在Rancher内部统一协调调度。
在我们当前使用的配置中,使用主服务实现节点发现。当使用Rancher私有网络时,我们禁用了多播并开启单播。因为集群中的每个节点都指向主节点并可以互相通讯,Rancher网络也允许节点间的互相通讯。作为服务栈的一部分,我们使用Kopf工具来快速的实现集群健康的可视化并且用来实施维护任务。当你启动服务栈,你就可以使用Kopf看到集群中启动的全部节点信息和状态。
Kibana4
最后,为了能够正常的看到所有的日志,我们通过构建Kibana来完成我们的ELK服务栈搭建。这里我们选择了Kibana 4。Kibana 4使用Nginx容器在Rancher负载均衡后端提供基本的验证服务。Kibana 4实例使用了DockerHub上的官方镜像生成,Kibana 4镜像与Elasticsearch客户端通讯。
那么,现在我们就已经实现了使用ELK服务栈收集日志并传送给Elasticsearch,且最终由Kibana进行展示。下一步,就是要从您的应用中获取这些日志。
在Rancher 中启动服务栈
目前为止,您已经了解了我们引入ELK服务栈的背景故事。下边是如何在Rancher中运行ELK服务栈的说明。他的前提是假定您已经搭建了Rancher环境并至少拥有一个计算节点,同时我们也会使用Rancher composeCLI工具。Rancher-compose可以在Github上找到rancher/rancher-compose。部署Rancher,您需要API Keys。在下边的说明中,我们将演示如何在Rancher中逐个构建相关的服务栈。在Rancher中,一个服务栈是由一个或多个服务和应用组成的,通过Docker Compose文件进行定义。在这个例子中,我们将在同一个环境中构建这些服务栈,然后使用cross stack linking来连接这些服务。Cross stacklinking允许不同的服务使用DNS名字来相互发现。
1 克隆我们的 compose template 库:
2 git clonehttps://github.com/rancher/compose-templates.git
3 首先启动Elasticsearch集群.
a cd compose-templates/elasticsearch
b rancher-compose -p es up (其它服务假定 es作为elastic search服务栈的名字)
c 这会启动4个服务:
▪ elasticsearch-masters
▪ elasticsearch-datanodes
▪ elasticsearch-clients
▪ kopf
d 当Knopf启动后, 在RancherUI中点击这个容器, 得到这个运行节点的IP地址.
e 在浏览器中打开刚刚的IP. 你将会在页面中看到datanode
4 现在我们启动Logstash层.
a cd ../logstash
b rancher-compose -p logstash up
c 这将启动下述服务:
▪ Redis
▪ logstash-collector
▪ logstash-indexer
d 此刻,你可以把你的应用指向 logtstash://host:5000.
5 (可选) 在节点上安装 logspout
a cd ../logspout
b rancher-compose -p logspout up
c 这样,就会在每个节点上都启动一个 logspout 容器。日志将会被传送到Elasticsearch.
6 最后, 我们来启动Kibana 4
a cd ../kibana
b rancher-compose -p kibana up
c 这将启动下述服务:
▪ kibana-vip
▪ nginx-proxy
▪ kibana4
d 在Rancher UI中单击kibana-vip service. 在浏览器中访问host ip. 你将会被导航到Kibana 4登陆页面并选择你的index.
现在,我们已经在Rancher环境中搭建了全套的ELK服务栈,您可以开始使用Logstash collector发送你的日志。默认情况下,Logstash collector监听UDP 5000端口。如果你在Rancher以外运行,那么就需要重新指定Logstash服务的endpoint。如果你的服务在Rancher中,你可以尝试使用Logspout-logstash。如果你的服务在Rancher外,你可以使用Gelf来配置你的Logstash。或者,你可以设置syslog listener,甚至一些支持Logstash输入的插件。
结论
在Rancher上运行ELK服务栈为我们带了了很强的灵活性和可扩展性。同时,也帮助您一步步的在您的环境中引入Rancher。作为运维团队,你可以快速的把已有应用的日志导入到Elasticsearch集群。
使用Rancher你可以最佳实践来定制你的容器。规划你的容器形成不同服务单元,减少您的后顾之忧。
原文地址:http://rancher.com/running-our-own-elk-stack-with-docker-and-rancher/
更多推荐
所有评论(0)