容器日志实战
一、容器日志摘要
通常Docker的日志信息存储在计算机本地,当在分布式环境当中,日志会被分散到不同的服务器,导致日志查阅繁琐及效率低下,最好的办法就是集中化的日志管理方式。使用rsyslog可以将所有服务器上的Docker日志手机汇总到一台服务器上统一管理。
二、常见日志手机方式
1、基于rsyslog的日志收集方案
Linux系统通常使用rsyslog来实现系统日志的集中管理(6.0版本之前为syslog),采用服务器端和客户端的模式。客户端只需要在本地syslog服务配置中添加日志服务器端的IP和端口号(514)就可以将日志发送到日志服务器。
(1)日志收集服务器(syslog-server)
①在配置文件/etc/rsyslog.conf中启用TCP/UDP端口,用于接收远程日志客户端传送过来的日志信息
②定义日志模板并用于远程日志,将远程主机上传输的日志单独存放
$template RemoteLogs,"/var/log/%FROMHOST-IP%.log"
*.* ?RemoteLogs
& ~
(2)发送日志服务器(syslog-client)
vim /etc/rsyslog.conf
*.* @@192.168.11.50:514
*.* @192.168.11.50:514
*.* @(z9)192.168.11.50:514
(3)收集docker容器日志到日志服务器中
docker容器日志默认是json-file日志驱动程序,需修改默认日志驱动
①全局修改
/etc/docker/daemon.json
{
"log-driver": "syslog"
}
②某个容器修改
docker run -itd --log-driver syslog daocloud.io/nginx
(4)配置Docker的log-driver直接把日志发送到远端
①取消rsyslog配置文件中的转发选项
②配置Docker全局变量(如docker无法启动,将后缀json修改为conf)
/etc/docker/daemon.json
{
"log-driver": "syslog"
" log-opt syslog-address" : tcp://192.168.11.243:514
}
③或者运行容器时添加选项
docker run -d -p 8080:80 --log-driver syslog --log-opt syslog-address=tcp://localhost:514 --log-opt tag="nginx" --name nginx nginx
2、Logstash日志收集方案
(1)安装JDK环境
tar zxf jdk-8u91-linux-x64.tar.gz
mv jdk1.8.0_91 /usr/local/java
vim /etc/profile
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
source /etc/profile
(2)安装Logstash
tar xf logstash-5.2.2.tar.gz -C /usr/local/
ln -s /usr/local/logstash-5.2.2/bin/* /usr/local/bin/
(3)配置Logstash
vim /usr/local/logstash-5.2.2/bin/logstash.conf
input {
file {
path => "/data/log/slave1/dockerd-current.log"
}
}output {
stdout {
codec => rubydebug //输出到屏幕
}
}
(4)测试
(5)一般使用rsyslog收集系统日志,logstash收集日志,两者配合,解析后的数据可以写入Elasticsearche/Kafka/MQ等等。
三、基于ELK的日志分析/存储/展示
1、ELK简介
ELK是一套完整的日志解决方案,由ElasticSearch、Logstash、Kibana三款开源软件组成。ElasticSearch是基于Lucene开发的愤怒时存储检索引擎,用来存储各类日志;Logstash对日志进行收集、分析爱,并将其存储供以后使用;Kibana是基于Node.js开发的展示工具,为前者提供用于日志展示的Web界面。
2、ELK单ElasticSearche平台部署
(1)安装ElasticSearch
tar xf elasticsearch-5.2.2.tar.gz -C /usr/local/
(2)修改配置文件
vim /usr/local/elasticsearch-5.2.2/config/elasticsearch.yml
network.host: 192.168.11.50
(3)直接启动会报错,elasticsearch不允许用root用户启动
useradd elas
chown -R elas /usr/local/elasticsearch-5.2.2/
vim /etc/security/limits.conf
* hard nofile 65536
* soft nofile 65536
vi /etc/sysctl.conf
vm.max_map_count=655360
sysctl -p
(4)切换到用户elas进行启动
nohup /usr/local/elasticsearch-5.2.2/bin/elasticsearch &>/dev/null &
(5)配置好之后可以浏览器登录192.168.11.50:9200查看软件版本
(6)创建logstash的配置文件,并启动logstash
vim /usr/local/logstash-5.2.2/bin/logstash-test.conf
input {
file {
path => "/data/log/slave1/dockerd-current.log"
}
}output {
elasticsearch{
hosts => "192.168.11.50"
}
}
(7)访问测试
url 'http://192.168.100.14:9200/_search?pretty'
3、Kibana部署
(1)tar xf kibana-5.2.2-linux-x86_64.tar.gz -C /usr/local/
(2)修改配置文件
elasticsearch.url: "http://192.168.100.14:9200"
(3)启动kibana
/usr/local/kibana-5.2.2-linux-x86_64/bin/kibana
4、填坑
(1)如果ElasticSearch与logstash安装在同一机器,如果内存不足将导致ElasticSearch被kill掉
(2)在日志未生成前,kibana可能无法创建索引(没有create键)