5、 kibana的安装和配置:
在上一篇ELK博文中我们讲到了es集群安装x-pack插件,这节博文我们继续讲ELK集群。现在开始安装kibana日志展示工具;
# 安装kibana工具
cd /software
wget ftp://test:[email protected]:9020/software/ELK_201906/kibana-6.2.4-linux-x86_64.tar.gz
tar xzvf kibana-6.2.4-linux-x86_64.tar.gz -C /usr/local
cd /usr/local
ln -sv kibana-6.2.4-linux-x86_64 kibana
# 在kibana服务器上面安装x-pack插件
cd /usr/local/kibana/bin
./kibana-plugin install file:///home/elasticsearch/x-pack-6.2.4.zip
# 因为es开启了x-pack功能之后,kibana连接es就需要使用用户名和密码才可以连接。所以我们回到ES集群,在ES的client节点上面初始化用户名和密码:
[elasticsearch@SZ1PRDELK00AP008 ~]$ /usr/local/elasticsearch/bin/x-pack/setup-passwords interactive
Initiating the setup of passwords for reserved users elastic,kibana,logstash_system.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y
Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [kibana]:
Reenter password for [kibana]:
Enter password for [logstash_system]:
Reenter password for [logstash_system]:
# 配置了密码之后,如何验证连接es密码是否正常,可以使用下面的命令:
curl -u elastic 'http://192.168.1.19:9200/_xpack/security/_authenticate?pretty'
或者通过curl查看索引
curl -X GET 'http://192.168.1.19:9200/_cat/' -u elastic:123456
# 在ES集群的client节点设置密码之后,就可以配置kibana的配置文件了
[root@SZ1PRDELK00AP0010 config]# egrep -v "^$|#" kibana.yml
server.port: 5601
server.host: "192.168.1.25"
elasticsearch.url: "http://192.168.1.24:9200"
elasticsearch.username: "elastic"
elasticsearch.password: "654321"
[root@SZ1PRDELK00AP0010 config]#
nohup /usr/local/kibana/bin/kibana & #启动kibana
在我自己做实验的过程中,还遇到了一个问题,就是我在初始化的时候设置的超级管理员elastic这个用户的密码忘记了。但是kibana、logstash等这些系统连接es都用这个连接,这下怎么办?解决方案如下:
(1)停止elasticsearch client节点
(2)使用该bin/x-pack/users命令创建一个新的基于文件的超级用户:用户名是my_admin,属于superuser
bin/x-pack/users useradd my_admin -p my_password -r superuser
(3)启动elasticsearch节点
(4)使用curl,为弹性用户重置密码:
curl -u my_admin -XPUT 'http://localhost:9200/_xpack/security/user/elastic/_password?pretty' -H 'Content-Type: application/json' -d'
{
"password" : "new_password"
}
'
(5)验证新密码
curl -u elastic 'http://localhost:9200/_xpack/security/_authenticate?pretty'
kibana默认是英文版的,如果想使用中文版的kibana,就需要汉化,汉化的方法如下:
https://github.com/anbai-inc/Kibana_Hanization github地址
cd /usr/local/kibana/
git clone https://github.com/anbai-inc/Kibana_Hanization.git
cd /usr/local/kibana/Kibana_Hanization/old
python main.py /usr/local/kibana
汉化完成
vim kibana.yaml
i18n.defaultLocale: "zh-CN" 增加配置
6、 x-pack插件的介绍:
X-Pack是一个Elastic Stack扩展,将安全性,警报,监控,报告,机器学习和图形功能捆绑到一个易于安装的软件包中。要访问此功能,您必须 在Elasticsearch中安装X-Pack。 我们默认使用的开源的elasticsearch,x-pack功能只能试用一个月的时间,一个月之后就不能使用了。在互联网上有很多高手介绍如何破解这个功能。鉴于产权问题,我就不在本文介绍如何破解x-pack功能。大家可以自行在网上参考,有大把的文档描述如何破解x-pack功能。要有一定的java程序开发能力,破解起来更轻松。同时提醒大家破解功能最好只用于实验环境,不要用于生产环境,不然容易带来版权问题;我这边重点介绍安装x-pack之后的一些配置,包括如下:
# 破解x-pack功能,可以参考https://blog.csdn.net/wangpei1949/article/details/80561812
# 破解的包名是:x-pack-core-6.2.4.jar
# 破解之后的将这个包上传到目录: /usr/local/elasticsearch/plugins/x-pack/x-pack-core/
# 更换完成所有es节点的x-pack-core-6.2.4.jar包之后,还需要完成如下步骤:
#(1)需要在所有elasticsearch节点config/elasticsearch.yml增加配置项,用于上传授权文件
xpack.security.enabled: false
#(2)申请licene授权文件并在邮箱中下载
https://license.elastic.co/registration
#(3)修改type 为platinum 铂金 有效期到2050年 "expiry_date_in_millis":2524579200999
#(4)启动8台elasticsearch
#(5)8个节点替换licene
curl -XPUT -u elastic:654321 'http://`0.10.1.19:9200/_xpack/license' -H "Content-Type: application/json" -d @license.json 如果提示是有效的证书,就表示成功了
#由于开启了x-pack,所有的es节点之间的通信都需要加密,需要配置ssl,配置步骤如下:
# 在client es上面为Elasticsearch集群创建证书颁发机构
bin/x-pack/certutil ca
# 为群集中的每个节点生成证书和私钥文件,这里需要设置密码,后边会用到。文件名称为elastic-certificates.p12
bin/x-pack/certutil cert --ca elastic-stack-ca.p12
# 在每一个es节点创建目录
mkdir -p /usr/local/elasticsearch/config/certs
# 拷贝elastic-certificates.p12文件到所有的es节点的/usr/local/elasticsearch/config/certs
所有elasticsearch节点启用SSL,修改每一个es节点的elasticsearch.yaml配置文件,增加如下配置: 其中有一个http.ssl.enable,官方是推荐打开的,但是实际上不要打开,打开会很麻烦。包括logstash、kibana、还有es的管理工具等都不能连接了。因为默认这些工具都是通过http连接的,改成了https,还要证书的话,就麻烦很多了
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
xpack.security.http.ssl.enabled: true #不要在es上面开启这三行,不然kibana使用http://es连接不了,logstash也连接不了,切记
xpack.security.http.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.http.ssl.truststore.path: certs/elastic-certificates.p12
# 所有elasticsearch节点和kibana节点将密码添加至elasticsearch-keystore
bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
bin/elasticsearch-keystore add xpack.security.http.ssl.truststore.secure_password
至此x-pack功能就安装完成。在这里的配置一般要参考官网文档:https://www.elastic.co/guide/en/elasticsearch/reference/6.2/configuring-tls.html#node-certificates 只有官网文档介绍的比较清楚。配置最麻烦的是ssl证书这块。因为如果你使用的是开源的x-pack,也就是默认一个月试用期的。其实安装x-pack插件之后,初始化用户名和密码之后就没有问题了。es节点之间不需要配置ssl证书连接的,但是一旦你破解了x-pack,那就不一样了。必须配置证书这段,这也是看了好多文档才总结出来的。并且ssl证书这块也分两部分,一部分是es节点内部之间通信一定要使用ssl证书通信,一部分是kibana或者logstash连接es集群的http接口换成https和证书的方式,官方是建议打开,实际测试中我只要一打开kibana和logstash就无法连接到es集群,并且各种错误。不开启https就没有问题了。
安装x-pack之后,会有几个地方需要同步调整,包括如下:
- kiban连接es集群的kibana.yaml文件中,需要配置es集群的用户名和密码,我这里使用超级用户elastic;
- logstash output到elsticsearch集群,也要添加es集群的用户名和密码,我这里使用超级用户elastic;
- elasticsearch head插件访问的时候需要带上用户名和密码才可以,比如:
# 要给elasticsearch.yml增加如下配置
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
# 通过带有用户名和密码的方式访问head
http://192.168.1.19:9100/?auth_user=elastic&auth_password=654321
#不安装x-pack之前访问的方式: http://192.168.1.19:9100/
- 安装x-pack功能之后就可以使用kibana的账户角色和权限控制功能了,大体配置如下:
1. 创建角色: 角色可以选择指定应用名称的索引,还有一个关键的.kibana的索引就可以了;
2. 创建用户: 关联角色就可以了。这样的话就实现了kibana不同的用户登录只能看到自己应用的索引;
7、 filebeat日志收集客户端的介绍
前面都是在介绍ELK集群怎么搭建,但是最关键的一步还是如何收集业务系统的日志。这就要用到日志收集客户端了。业界关于日志收集客户端的工具很多,常用的有logstash、filebeat、fluentd等。他们各自有自己的特长,filebeat属于轻量级的,对资源消耗最少。fluentd更适合于容器的日志收集。所以本文重点介绍filebeat,前面的博文中我曾经写过一篇关于容器日志平台EFK的搭建,里面有重点默哀红素fluentd的配置,感兴趣的朋友可以搜一下;首先我们谈谈日志收集的标准:
关于日志收集的标准,我个人有几点看法,总结如下:
-
filebeat的配置应该标准化,一些基础信息:比如服务器ip、应用的名称应该通过filed增加字段的方式将索引的名称固定下来;
-
日志目录需要规范,比如都定义到/applogs/应用名称/应用名称-级别.log 如: /applogs/test/testtestUpdate-error.log
-
日志级别需要规范,生产环境尽量不要使用DEBUG模式;
-
日志最好能输出成json格式;
-
JAVA程序的Error日志的格式定义要规范,用于filebeat收集时的日志多行合并;
-
每一个应用创建一个索引;如果一台服务器有多个应用,应该是创建多个索引;
- 索引的命名应该标准化,可以是: elk-ip-公司名称(比如tx 应用名称; 比如elk-192.1680.21-tx-test 注意这里的索引名一定要以elk开头,因为我的logstash里面用了通配符elk-*
filebeat的配置如下:
filebeat的安装很简单,可以直接使用yum安装,配置文件在/etc/filebeat/filebeat.yml增加配置项
#===========================Filebeat prospectors =============================
filebeat.prospectors:
- input_type: log
encoding: utf-8
fields:
serverip: 192.1682.37 #此处的ip为每个应用系统自己的服务器IP
logtopic: tx-test-testUpdate #此处的字段是应用的名称,用于kafka的topic名字
enabled: true
paths:
- /tx/logs/test-testUpdate.log #此处是应用日志的文件路径,下面的这三段是java程序多行合并,每个应用的多行合并配置可能不一样。因为ERROR报错开头的字符串不同
multiline.pattern: '^\[' #表示已[开头的和下面的行合并,直到下一个[
multiline.negate: true
multiline.match: after
tail_files: false #表示文件从头开始还是从末尾开始,下面的应用日志,如果只有一个应用的话,就不需要配置多个应用日志
ignore_older: 24h #表示24小时之前的日志就不会获取
- input_type: log
encoding: utf-8
fields:
serverip: 192.1682.37 #每个服务器的只有ip不同,系统日志其他的都是相同的
logtopic: message
enabled: true
paths:
- /var/log/messages #这个是服务器操作系统日志,每个服务器的配置都是一样的
tail_files: false
ignore_older: 24h #表示24小时之前的日志就不会获取
- input_type: log
encoding: utf-8
fields:
serverip: 192.1682.37 #每个服务器的只有ip不同,系统日志其他的都是相同的
logtopic: history
enabled: true
paths:
- /var/log/history/history.log #这个是服务器历史记录的日志,每个服务器的配置都是一样的
tail_files: false
ignore_older: 24h #表示24小时之前的日志就不会获取
- input_type: log
encoding: utf-8
fields:
serverip: 192.1682.37 #每个服务器的只有ip不同,系统日志其他的配置都是相同的
logtopic: secure
enabled: true
paths:
- /var/log/secure #这个是服务器安全的日志,每个服务器的配置都是一样的
tail_files: false
ignore_older: 24h #表示24小时之前的日志就不会获取
#----------------------------- Kafka output ---------------------------------
output.kafka:
enabled: true
hosts: ['192.168.1.12:9092','192.168.1.14:9092','192.168.1.15:9092']
topic: 'elk-%{[fields.serverip]}-%{[fields.logtopic]}'
partition.hash:
reachable_only: true
compression: gzip
max_message_bytes: 1000000
required_acks: 1
关于filebeat的配置,有几个关键的地方需要解释一下:
- 我在每个日志收集的时候,通过fields配置增加了比如IP地址、应用名称等,用于后面的输出到kafka的索引名的匹配;也就是不同的服务器、或者一个服务器不同的应用索引名都有标识;
- 日志路径的文件名称是可以通配符的。比如可以写成/var/log/等,还有一种特殊情况比如catalina.out这个日志,有些应用他的catalina.out是每天切割的,也就是今天可能是catalina-2019-06-07.out,明天要获取的日志文件就是catalina-2019-06-08.out。这个时候怎么办,如果用catalina-.out,就把以前的日期的日志文件也获取了。实际上我们只需要获取最新的日志文件。解决的方法就是增加ignore_older: 24h 表示只收集24小时之内的日志文件,所以以前日期的文件也收集不到;
- 大家有没有注意我在上篇博文中降到的logstash的配置文件,如果串通起来就是filebeat输出到kafka集群,产生了topic。topic的名字自动根据filebeat里面的自定义field,topic名字就包含了服务器ip和应用名称。然后logstash又从kafka输入topic,直接使用了正则表达式通配了所有的topic,如我的配置elk-.* 然后再通过output到es集群,生成的索引名称又都是topic名称+时间戳。这样就贯通了所有。我们增加filebeat的配置,不需要调整logstash的设置,kibana就会自动生成索引了;
- 如果配置好了filebeat,但是在kibana里面不创建索引,怎么排查问题了,方式如下:
第一步: 登录kafka集群,查看topic是否常见成功?如果都没有topic,就说明filebeat配置有问题或者服务没有启动成功;
第二步: 登录es集群的管理插件head,查看索引;没有索引,但是有topic,可能是logstash的配置文件,就是从kafka集群到logstash再到es的问题;需要一步一步排查;
好了,今天就写到这里吧。端午节放假这几天,白天遛娃,晚上写作,身体都有点吃不消了。从18年开始我就养成了每天早上跑步的习惯,基本上每周至少有3天早上要跑步7公里。也希望能通过本公众号结识一些喜欢运动跑步的朋友。我们除了讨论一些运维技术,也可以聊聊运动、生活等。毕竟生活要努力,也要有诗和远方;