天天看点

容器服务中使用ELK容器服务中使用ELK

日志是IT系统的重要组成部分,记录了系统在什么时候发生了什么事情。我们可以根据日志排查系统故障,也可以做统计分析。通常日志存放在本机的日志文件里,需要查看日志的时候,登录到机器上,用grep等工具过滤关键字。但是当应用要部署在多台机器上的时候,这种方式查看日志就很不方便了,为了找到一个特定的错误对应的日志,不得不登录到所有的机器上,一个文件一个文件的过滤。于是出现了集中式的日志存储方式:所有日志收集到日志服务里,在日志服务里可以查看和搜索日志。

在Docker环境里,集中式日志存储更加重要。相比传统的运维模式,Docker通常使用编排系统管理容器,容器和宿主机之间的映射并不固定,容器也可能不断的在宿主机之间迁移,登录到机器上查看日志的方式完全没法用了,集中式日志成了唯一的选择。

容器服务集成了阿里云日志服务,通过声明的方式自动收集容器日志到日志服务。但是有些用户可能更喜欢用elasticsearch、logstash、kibana这个组合,这篇文章我就介绍下如何在容器服务里使用ELK。

容器服务中使用ELK容器服务中使用ELK

我们要部署一个独立的logstash集群,logstash比较重,很耗资源,所以不会在每台机器上都运行logstash,更不要说每个Docker容器里。为了采集容器日志,我们会用到syslog、logspout和filebeat,当然你还可能会用到其他的采集方式。

为了尽可能贴合实际场景,这里我们创建两个集群,一个ELK集群,只部署ELK,另外一个应用集群,用于部署应用。

在容器服务里部署elasticsearch非常简单。使用下面的编排文件一键部署。

注意:elasticsearch需要2g以上的内存,部署ELK的机器内存至少4G,最好8G

注意:为了能让其他服务想logstash发送日志,我们在logstash前面配置了slb。先到slb控制台创建一个slb,监听端口5000和5044,不用添加后端服务。*不要忘了修改编排文件中的slb id

这是一个非常简单的logstash配置,我们提供了syslog和filebeats两种输入格式,对外的端口分别是5044和5000。

容器服务中使用ELK容器服务中使用ELK

好了,现在可以访问kibana看看。URL可以在应用的路由列表里找到。

容器服务中使用ELK容器服务中使用ELK

Excited!已经能打开kibana,不过还没有任何日志。接下来想办法写点日志到elasticsearch里。

Docker里,标准的日志方式是用Stdout,所以我们先演示如何把Stdout收集到ELK,如果你在使用文件日志,可以直接用filebeat。我们用wordpress作为演示用的例子,下面是wordpress的编排模板。我们在另外一个集群中创建应用wordpress

待部署成功后,找到wordpress的访问地址,打开页面

容器服务中使用ELK容器服务中使用ELK

然后再打开kibana的页面,可以看到已经收集到日志了

容器服务中使用ELK容器服务中使用ELK