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之后,会有几个地方需要同步调整,包括如下:

  1. kiban连接es集群的kibana.yaml文件中,需要配置es集群的用户名和密码,我这里使用超级用户elastic;
  2. logstash output到elsticsearch集群,也要添加es集群的用户名和密码,我这里使用超级用户elastic;
  3. 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/
  1. 安装x-pack功能之后就可以使用kibana的账户角色和权限控制功能了,大体配置如下:
       1. 创建角色: 角色可以选择指定应用名称的索引,还有一个关键的.kibana的索引就可以了;

   2. 创建用户: 关联角色就可以了。这样的话就实现了kibana不同的用户登录只能看到自己应用的索引;
7、 filebeat日志收集客户端的介绍
  前面都是在介绍ELK集群怎么搭建,但是最关键的一步还是如何收集业务系统的日志。这就要用到日志收集客户端了。业界关于日志收集客户端的工具很多,常用的有logstash、filebeat、fluentd等。他们各自有自己的特长,filebeat属于轻量级的,对资源消耗最少。fluentd更适合于容器的日志收集。所以本文重点介绍filebeat,前面的博文中我曾经写过一篇关于容器日志平台EFK的搭建,里面有重点默哀红素fluentd的配置,感兴趣的朋友可以搜一下;首先我们谈谈日志收集的标准:
  关于日志收集的标准,我个人有几点看法,总结如下:

  1. filebeat的配置应该标准化,一些基础信息:比如服务器ip、应用的名称应该通过filed增加字段的方式将索引的名称固定下来;

  2. 日志目录需要规范,比如都定义到/applogs/应用名称/应用名称-级别.log 如: /applogs/test/testtestUpdate-error.log

  3. 日志级别需要规范,生产环境尽量不要使用DEBUG模式;

  4. 日志最好能输出成json格式;

  5. JAVA程序的Error日志的格式定义要规范,用于filebeat收集时的日志多行合并;

  6. 每一个应用创建一个索引;如果一台服务器有多个应用,应该是创建多个索引;

  7. 索引的命名应该标准化,可以是: 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的配置,有几个关键的地方需要解释一下:

  1. 我在每个日志收集的时候,通过fields配置增加了比如IP地址、应用名称等,用于后面的输出到kafka的索引名的匹配;也就是不同的服务器、或者一个服务器不同的应用索引名都有标识;
  2. 日志路径的文件名称是可以通配符的。比如可以写成/var/log/等,还有一种特殊情况比如catalina.out这个日志,有些应用他的catalina.out是每天切割的,也就是今天可能是catalina-2019-06-07.out,明天要获取的日志文件就是catalina-2019-06-08.out。这个时候怎么办,如果用catalina-.out,就把以前的日期的日志文件也获取了。实际上我们只需要获取最新的日志文件。解决的方法就是增加ignore_older: 24h 表示只收集24小时之内的日志文件,所以以前日期的文件也收集不到;
  3. 大家有没有注意我在上篇博文中降到的logstash的配置文件,如果串通起来就是filebeat输出到kafka集群,产生了topic。topic的名字自动根据filebeat里面的自定义field,topic名字就包含了服务器ip和应用名称。然后logstash又从kafka输入topic,直接使用了正则表达式通配了所有的topic,如我的配置elk-.* 然后再通过output到es集群,生成的索引名称又都是topic名称+时间戳。这样就贯通了所有。我们增加filebeat的配置,不需要调整logstash的设置,kibana就会自动生成索引了;
  4. 如果配置好了filebeat,但是在kibana里面不创建索引,怎么排查问题了,方式如下:
第一步:  登录kafka集群,查看topic是否常见成功?如果都没有topic,就说明filebeat配置有问题或者服务没有启动成功;
第二步:  登录es集群的管理插件head,查看索引;没有索引,但是有topic,可能是logstash的配置文件,就是从kafka集群到logstash再到es的问题;需要一步一步排查;

好了,今天就写到这里吧。端午节放假这几天,白天遛娃,晚上写作,身体都有点吃不消了。从18年开始我就养成了每天早上跑步的习惯,基本上每周至少有3天早上要跑步7公里。也希望能通过本公众号结识一些喜欢运动跑步的朋友。我们除了讨论一些运维技术,也可以聊聊运动、生活等。毕竟生活要努力,也要有诗和远方;

博文的更详细内容请关注我的个人微信公众号 “云时代IT运维”,本公众号旨在共享互联网运维新技术,新趋势; 包括IT运维行业的咨询,运维技术文档分享。重点关注devops、jenkins、zabbix监控、kubernetes、ELK、各种中间件的使用,比如redis、MQ等;shell和python等运维编程语言;本人从事IT运维相关的工作有十多年。2008年开始专职从事Linux/Unix系统运维工作;对运维相关技术有一定程度的理解。本公众号所有博文均是我的实际工作经验总结,基本都是原创博文。我很乐意将我积累的经验、心得、技术与大家分享交流!希望和大家在IT运维职业道路上一起成长和进步;

ELK统一日志平台搭建第二篇_第1张图片