Rancher中实现统一管理容器日志

相信大家对于容器和Docker这个概念并不陌生,很高兴的是Docker为我们提供了多种log-driver。

rancher

我们在使用Docker处理日志的时候多数是采用Dockerlogs <container>命令,因为docker默认采用的log-driver是json-file,所以Docker会捕捉每一个容器进程STDOUTS和STDERR,保存在磁盘文件.json.log中供Dockerlogs命令查询。

rancher

上述方式如果用于开发过程中的调试工作,是种快速且不错的方案,但是如果面对大规模应用部署的环境下那么日志的跟踪与调试带来的困扰显而易见,因此我们需要一个统一集中的容器日志收集与展示平台。

对于容器日志收集与展示,syslog + rsyslog + ELK(ElasticSearch、Logstash、Kibana)是一个不错的技术方案,我将简单介绍下为什么我们选用这种方案。

syslog免费且是UNIX标准的日志解决方案,集成度良好,rsyslog顾名思义是remote的意思使syslog具备收集远端日志的功能,由于logstash采用java和jruby开发,所以logstash文件库中可以加入windows日志文件。而logspout暂不支持容器-t(tty)启动。

我们庆幸的是Rancher的Catalog真的很强大,Rancher Catalog 已经为我们提供了ELK的Catalog,下面我将给出ELK在Rancher中的部署视图,并简单介绍下视图中每个组件都是干什么的。

rancher

logstash-collector: 用于接收dockercontainer发送过来的日志信息,并将日志信息发送到redis队列中。在rancher中默认开启TCP:6000 UDP:5000端口用于侦听发送过来的日志报文。

redis: 日志消息队列。

logstash-indexer: 用于接收redis中未处理的日志信息,然后将该日志消息发送到elasticsearsh中进行存储及搜索分析。

kopf: elasticsearch的一款第三方插件,提供一个简单的管理员web界面。

elasticsearch-clients: 用于处理路由请求,协调数据节点与主节点。

elasticsearch-master: 用于集群操作相关的内容。

elasticsearch-datanode: 用于存储索引数据的节点。

上述部署视图中说好的Kibana哪儿去了?

因为我们有自己的日志展现平台,所以这里去掉了kibana,如果你想在Rancher中使用Kibana做日志前端展现,那么很简单,只需要利用Rancher的Catalog,service link:Rancher环境中上述已经部署好的elasticsearch-client即可。

至此,在Rancher中如何部署一套完整ELK系统已经介绍完了,下面我将介绍如何将容器日志发送到ELK中。

rancher

为了完成上述的目标,我们还需要做一些准备工作,那就是需要一个运行rsyslog的容器如果你不想基于alpine去制作rsyslog镜像,那么可以使用panoptix/rsyslog这个镜像。

下面就是关键的一步如何让rsyslog发送日志到logstash中。

上述rsyslog容器启动好之后我们需要告知rsyslog,目的接收端logstash的地址。过程很简单,需要在容器中/etc/rsyslog.d/ 目录下建立一个文件60-logstash.conf

rancher

:programname, contains, “docker”的意思是过滤日志,只有Properties中key为programname,value包含docker字样的日志才会被发送给logstash

*.* @@logstash-collector:6000;json-template是所有用户的所有日志通过tcp传输到logstash-collector的6000端口并且日志使用json-template格式化。

同样我们需要建立01-json-template.conf,property的key值我们可以通过rsyslog官网获取。

rancher

下面我将介绍rsyslog如何收集容器日志。

首先我们需要修改我们的应用容器log-driver为syslog(可以通过rancher-ui或者rancher-compose)来完成。

其次我们需要设置我们日志接收端rsyslog地址,可以通过log_opt指定syslog-address:hostname:tcp_port来完成

log_opt可以指定许多syslog支持的选项比如facility等,在此不一一列举。

目前日志显的杂乱无序。如何去按照container或者stack或者service去区分日志呢?

syslog的tag属性为我们支持了自定义的标签,通过打tag的方式我们可以细粒度的自行切分日志。

Rancher对docker的亲和性极大程度的为我们提供了遍历。我们可以通过go templage语法去获取rancher环境下容器的特征值从而协助我们切分日志信息。

rancher

 

OK,现在我们再去查看kibana发现我们的容器日志已经展示在这里了。

rancher

最后我们可以按照rancher catalog规范,制作一键部署应用。

rancher

K8S中文社区微信公众号
分享到:更多 ()

评论 抢沙发

评论前必须登录!