容器服务中使用ELK
日志是IT系统的重要组成部分,记录了系统在什么时候发生了什么事情。我们可以根据日志排查系统故障,也可以做统计分析。通常日志存放在本机的日志文件里,需要查看日志的时候,登录到机器上,用grep等工具过滤关键字。但是当应用要部署在多台机器上的时候,这种方式查看日志就很不方便了,为了找到一个特定的错误对应的日志,不得不登录到所有的机器上,一个文件一个文件的过滤。于是出现了集中式的日志存储方式:所有日志收集到日志服务里,在日志服务里可以查看和搜索日志。
在Docker环境里,集中式日志存储更加重要。相比传统的运维模式,Docker通常使用编排系统管理容器,容器和宿主机之间的映射并不固定,容器也可能不断的在宿主机之间迁移,登录到机器上查看日志的方式完全没法用了,集中式日志成了唯一的选择。
容器服务集成了阿里云日志服务,通过声明的方式自动收集容器日志到日志服务。但是有些用户可能更喜欢用elasticsearch、logstash、kibana这个组合,这篇文章我就介绍下如何在容器服务里使用ELK。
整体结构
我们要部署一个独立的logstash集群,logstash比较重,很耗资源,所以不会在每台机器上都运行logstash,更不要说每个Docker容器里。为了采集容器日志,我们会用到syslog、logspout和filebeat,当然你还可能会用到其他的采集方式。
为了尽可能贴合实际场景,这里我们创建两个集群,一个ELK集群,只部署ELK,另外一个应用集群,用于部署应用。
部署ELK
在容器服务里部署elasticsearch非常简单。使用下面的编排文件一键部署。
注意:elasticsearch需要2g以上的内存,部署ELK的机器内存至少4G,最好8G
注意:为了能让其他服务想logstash发送日志,我们在logstash前面配置了slb。先到slb控制台创建一个slb,监听端口5000和5044,不用添加后端服务。*不要忘了修改编排文件中的slb id
version: '2'
services:
elasticsearch:
image: elasticsearch
kibana:
image: kibana
environment:
ELASTICSEARCH_URL: http://elasticsearch:9200/
labels:
aliyun.routing.port_5601: kibana
links:
- elasticsearch
logstash:
image: registry.cn-hangzhou.aliyuncs.com/acs-sample/logstash
hostname: logstash
ports:
- 5044:5044
- 5000:5000
labels:
aliyun.lb.port_5044: 'tcp://${SLB_ID}:5044' #先创建slb
aliyun.lb.port_5000: 'tcp://${SLB_ID}:5000'
links:
- elasticsearch
在这个编排文件里,elasticsearch和kibana我们直接使用了官方镜像,没有任何更改。logstash需要配置文件,所以不得不自己做了一个镜像,把配置文件放进去。镜像源码在这里:https://github.com/AliyunContainerService/demo-logstash , logstash的配置文件如下
input {
beats {
port => 5044
type => beats
}
tcp {
port => 5000
type => syslog
}
}
filter {
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
}
stdout { codec => rubydebug }
}
这是一个非常简单的logstash配置,我们提供了syslog和filebeats两种输入格式,对外的端口分别是5044和5000。
好了,现在可以访问kibana看看。URL可以在应用的路由列表里找到。
Excited!已经能打开kibana,不过还没有任何日志。接下来想办法写点日志到elasticsearch里。
收集日志
Docker里,标准的日志方式是用Stdout,所以我们先演示如何把Stdout收集到ELK,如果你在使用文件日志,可以直接用filebeat。我们用wordpress作为演示用的例子,下面是wordpress的编排模板。我们在另外一个集群中创建应用wordpress
version: '2'
services:
mysql:
image: mysql
environment:
- MYSQL_ROOT_PASSWORD=password
wordpress:
image: wordpress
labels:
aliyun.routing.port_80: wordpress
links:
- mysql:mysql
environment:
- WORDPRESS_DB_PASSWORD=password
logging:
driver: syslog
options:
syslog-address: 'tcp://${SLB_IP:5000'
待部署成功后,找到wordpress的访问地址,打开页面
然后再打开kibana的页面,可以看到已经收集到日志了