应用日志的收集,在docker未出现前,常用做法是将日志写到主机的某个文件,当需要查看日志时先登录到主机然后去查看相关的日志文件,主机上的日志只要不特意删除会一直存在;随着docker和容器编排技术的出现,容器的销毁和重新创建被看成是一种常态,如果用原来的方式将应用日志写到容器的文件系统里,那么当容器销毁时日志就会丢失,这种情况下,一种有效的解决方法是引入集中式的日志管理系统,将容器的日志通过agent发送给日志系统进行统一存储。
目前主流的分布式日志系统有ELK,flume,fluentd,splunk等,本文利用腾讯云容器服务搭建ELK系统收集nginx的访问日志 ,搭建过程中共搭建如下4个服务,每个服务的功能如下:
在开始搭建日志系统之前,了解容器日志的输出方式和ELK的相关配置是非常必要的,因此下文先简单介绍这两个方面的内容,然后再进行具体的搭建步骤说明,最后对搭建过程中碰到的问题进行总结。
下面的搭建方法采用的方式是一个应用容器绑定一个采集日志容器的做法,如果一台主机上有很多服务的日志需要采集,建议先提前规划好日志目录,用一台主机放一个日志采集容器的方法。
容器日志常见输出形式主要有以下两种:
日志驱动名称 | 描述 |
---|---|
none | 不输出任何内容 |
json-file | 日志以json的格式保存成文件,这是默认的docker日志输出驱动 |
syslog | 将log日志输出到syslog |
journald | 将日志输出到journald |
gelf | 将日志输出到支持GaryLog Extended log Fromat(GELF)格式的日志采集系统如Graylog和Logstash |
fluentd | 将日志输出到fluentd |
awslogs | 将日志输出到AWS cloudwatch logs |
splunk | 将日志输出到Splunk |
etwlogs | 将日志输出到Windows的事件系统,这个驱动只有对windows下的docker生效 |
gcplogs | 将日志输出到GCP的日志系统中 |
ELK是由ElasticSearch、logstash和kibana三个项目共同组成的日志系统,其中:
在ELK系统中采集端如果用logstash,logstash因为是java写的,对系统资源占用相对较多,因此ELK生态中出现了轻量级的采集端beat家族,目前beat家族的成员如下:
elaticsearch的配置文件采用yaml文件格式
配置项名称 | 含义 |
---|---|
cluster.name | ES集群名称 |
node.name | ES节点名称 |
node.master | 是否允许该节点成为master |
node.data | 是否允许该节点成为数据节点 |
path.logs | 存储ES日志的目录 |
path.data | 存储ES数据的目录 |
transport.host | bind的主机地址 |
discovery.zen.ping.unicast.hosts | 集群中主机之间相互发现时使用该字段,指定集群内的所有主机IP,格式如discovery.zen.ping.unicast.hosts: ["host1", "host2"] |
discovery.zen.minimum_master_nodes | 成为master的时候,集群中至少需要多少个节点 |
logstash的配置文件包含三部分: 1、input部分,指定数据源,可以同时指定多个数据源,可以使syslog,标准输出,kafka等
2、filter部分,数据处理部分,可以对输入的数据做格式解析,提取新字段等。
3、output部分, 指定数据输出到哪里,可以同时指定多个输出源,可以是标准输出,kafka,redis和elasticsearch等。
kibana的配置文件也是采用yaml格式
配置项名称 | 含义 |
---|---|
server.port | web的服务端口,默认为5601 |
elasticsearch.url | 指定elasticsearch的url |
server.ssl.enabled | 是否启用https |
server.ssl.certificate | ssl证书 |
logging.dest | 日志输出的地址 |
logging.silent | 控制是否输出日志 |
下面的搭建步骤基于腾讯云容器服务来搭建,容器服务集群中包括两台机器,配置是2核4G的ubuntu16.04系统。 搭建步骤如下:
搭建过程中使用的镜像是dockerhub上的offical的elasticsearch、kibana和logstash的镜像,版本为5.4
在搭建ELK之前,参考Elasticsearch的安装文档,需要对容器主机做相关设置:
启动elastcisearch的docker run命令如下:
docker run -d --name elas -p 9200:9200 -v "$PWD/esdata":/usr/share/elasticsearch/data elasticsearch -Etransport.host=0.0.0.0 -Ediscovery.zen.minimum_master_nodes=1
对应腾讯容器服务控制台创建elasticsearch的参数配置如下:
配置项名称 | 配置值 |
---|---|
服务名称 | elasticsearch |
CPU限制 | 1核 |
内存限制 | 3072M |
镜像 | elasticsearch |
镜像版本 | 5.4 |
实例个数 | 1 |
运行命令 | /docker-entrypoint.sh |
运行参数 | -Etransport.host=0.0.0.0 -Ediscovery.zen.minimum_master_nodes=1 |
网络参数 | 网络方式选仅在集群内访问,协议选TCP,容器端口9200,服务端口9200 |
数据卷 | 选择本地磁盘,选择一个主机目录,取名为esdata |
挂载点 | 选择数据卷esdata,映射到容器目录为/usr/share/elasticsearch/data |
另外为了避免容器还在运行状态但是es进程异常导致服务不可用,可以考虑给elasticsearch服务配置健康检查参数。
启动kibana的docker run 命令如下:
docker run --name some-kibana --link elas:elasticsearch -p 5601:5601 -d kibana
对应腾讯容器服务控制台创建该服务的参数如下:
配置项名称 | 配置值 |
---|---|
服务名称 | kibana |
核数 | 1核 |
内存 | 512M |
实例个数 | 1 |
镜像 | kibana |
镜像版本 | 5.4 |
网络方式 | 提供集群内访问方式,不在公网上直接暴露5601的端口 |
第一步,在主机上用htpasswd生成包含用户名和密码的文件,具体的使用方式如下:
htpasswd /etc/nginx/.htpasswd administrator
在两台主机上将生成的帐号密码文件.htpasswd放到该目录放到/home/ubuntu/conf目录下
第二步,在两台主机的/home/ubuntu/conf目录下创建nginx的配置文件内容如下:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
auth_basic "kibana ui";
auth_basic_user_file /conf/.htpasswd;
autoindex on;
proxy_pass http://kibana:5601;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
第三步,创建nginx认证服务,配置参数如下:
配置项名称 | 配置值 | |
---|---|---|
服务名称 | nginx-basicauth | |
镜像 | nginx | |
数据卷1 | 使用本地硬盘,volume名称用nginxconf,对应的主机目录 /home/ubuntu/conf/nginx.conf | |
数据卷2 | 使用本地磁盘,volume名称用passwd,对应的主机目录/home/ubuntu/conf/.htpasswd | |
网络方式 | 提供公网访问,容器端口用80,服务端口用9098 | |
挂载点1 | 使用volume nginxconf,容器内目录/etc/nginx/nginx.conf,放nginx的配置文件 | |
挂载点2 | 使用volume passwd,容器内目录/conf/.htpasswd,放basic auth的用户密码文件 |
第四步,在外网访问kibana服务,输入正确的用户名和密码后,可以看到kibana的界面,表示这一步配置成功。
输入正确的用户名和密码后,如果可以看到kibana的如下界面,表示ELK搭建成功:
第一步,先在两台主机上放好logstash的配置文件,配置文件的内容如下,配置文件放到主机的/home/ubuntu/conf/logstash.conf,需要映射到logstash容器的目录为/conf/logstash.conf。该配置文件同时抓取access.log和error.log两个日志文件到elasticsearch。
input {
file {
path => ["/var/log/nginx/access.log"]
type => "nginx_access_log"
start_position => "beginning"
}
file {
path => ["/var/log/nginx/error.log"]
type => "nginx_error_log"
start_position => "beginning"
}
}
output {
elasticsearch { hosts => ["elasticsearch:9200"] }
}
第二步,创建两个数据卷
数据卷名称 | 对应的本机目录 | 用途 |
---|---|---|
log | 不填主机上临时分配 | nginx在该目录下产生日志,logstash读取该目录的日志 |
conf | /home/ubuntu/conf | 存放nginx的启动配置文件 |
第三步, 创建logstash容器
配置项名称 | 配置值 |
---|---|
实例个数 | 1 |
镜像 | logstash |
镜像版本 | 5.4 |
核数 | 1 |
内存 | 1650M |
运行命令 | /docker-entrypoint.sh |
运行参数 | -f /conf/logstash.conf,注意在界面上填的时候,-f 和/conf/logstash.conf要放两行 |
挂载点1 | 挂载卷 log,容器目录/var/log/nginx,存放nginx生成的日志文件 |
挂载点2 | 挂载卷conf,容器目录/conf,存放logstash的配置文件 |
第四步, 创建nginx容器
配置项名称 | 配置值 |
---|---|
实例个数 | 1 |
镜像 | nginx |
内存 | 128M |
核数 | 0.2 |
挂载点1 | 挂载卷 log,容器目录/var/log/nginx,存放nginx生成的日志文件 |
第五步,将nginx的端口80映射到外部8088端口
第六步:等服务创建完成,通过网页访问nginx服务,检查kibana界面上是否可以看到nginx的访问日志,正常的访问日志如下:
在使用腾讯云容器服务搭建ELK系统的过程中碰到如下问题:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。