centos7搭建EFK收集docker容器日志

  • EFK简介
  • EFK部署
  • Elasticsearch部署
  • 部署kibana
  • 部署filebeat


EFK简介

说起ELK相信大部分人都很熟悉,这是一个日志收集系统,可以收集咱们需要日志的关键信息,并且通过web界面的形式展示出来,ELK一般只是用来收集服务的日志信息,那么在云原生趋势下很火的kubernetes和docker,想必大家都很关心一个问题docker容器的又该怎么搜集处理呢?这个问题的答案就是我们今天的主角EFK要做的事了。

为什么要用EFK而不用ELK收集容器的日志信息呢?
本人才疏学浅,下面说的为了抛砖引玉,有说的不对的还请指正,有不同的看法也欢迎评论留言
首先说一下ELK是由三个开源项目组成他们分别是:

  • E: Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据功能
  • L: Logstash是用来搜集、分析、过滤日志的工具
  • K: Kibana是一个基于web图形化界面,用于搜索、分析和可视化存储在Elasticsearch指标中的日志数据

EFK由三个开源项目组成分别是:
E:Elasticsearch
F:Filebeat
K:Kibana
这里说一下Filebeat的功能,是用来搜集文件数据的收集器,但是不像Logstash一样,不会对搜集的日志文件进行分析、处理等操作。

说一下Filebeat的优势吧!
Filebeat的性能稳定,占用系统资源少,相较于Logstash来说,安装使用简单。Logstash是基于内存来进行存储的,如果出现服务异常等,情况的话那么数据就会丢失Filebeat是基于硬盘存储的

EFK部署

注意:内存需要给到4G不然会报错

环境说明:
系统centos7.9
IP地址:192.168.182.132

软件

版本

Elasticsearch

8.4.1

Filebeat

8.4.1

Kibana

8.4.1

EFK下载地址

Elasticsearch部署

jdk下载地址

// 修改主机名,做域名解析
[root@localhost ~]# hostnamectl set-hostname efk
[root@localhost ~]# bash
[root@efk ~]# tail -1 /etc/hosts
192.168.182.132 efk
// 下载Elasticsearch
[root@localhost ~]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.4.1-linux-x86_64.tar.gz -P /opt/

因为es需要依赖jdk所以咱们需要安装jdk
[root@efk opt]# rpm -ivh jdk-18_linux-x64_bin.rpm
// 解压tar包
[root@localhost opt]# tar -zxf elasticsearch-8.4.1-linux-x86_64.tar.gz -C /usr/local/
// 做软链接
[root@efk local]# ln -s elasticsearch-8.4.1/ elasticsearch
// 配置环境变量
[root@efk bin]# cat /etc/profile.d/es.sh
export PATH=/usr/local/elasticsearch/bin:$PATH

[root@efk bin]# source /etc/profile.d/es.sh
// 创建用户并设置密码,因为Elasticsearch不能使用root来管理
[root@efk ~]# useradd es
[root@efk ~]# passwd es

[root@efk local]# chown -R es.es elasticsearch-8.4.1/
//创建elasticsearch的数据目录和日志目录
[root@efk ~]# mkdir -p /var/data/elasticsearch
[root@efk ~]# mkdir -p /var/log/elasticsearch
[root@efk data]# chown -R es.es elasticsearch/
[root@efk log]# chown -R es.es elasticsearch/
// 修改elasticsearch的配置文件
17  cluster.name: my-es  //取消注释,集群名称,可根据需要进行修改
33  path.data: /var/data/elasticsearch  //elasticsearch数据目录存放位置,建议创建此目录(官网推荐)
37  path.logs: /var/log/elasticsearch  //elasticsearch日志文件存放位置
56  network.host: 192.168.182.132  //取消注释,这里是监听地址
61  http.port: 9200  //取消注释,这里是监听的端口号
70  discovery.seed_hosts: ["efk"]  //取消注释,指定要发现的节点,可以写节点名也可写IP地址,因为我们这里是单节点所以写当前节点名就可以了
98  xpack.security.enabled: true
100  xpack.security.enrollment.enabled: true
103  xpack.security.http.ssl:
108  xpack.security.transport.ssl:
115  cluster.initial_master_nodes: ["efk"]
119  http.host: 0.0.0.0
以上的这个几行行要注意缩进不然启动服务会报错
// 使用systemd来管理elasticsearch
[root@efk config]# tail -7 /etc/security/limits.conf | grep -iv end
* hard nofile 131072
* soft nproc 4096  
* hard nproc 4096
es hard nofile 65536
es soft nofile 65536

[root@efk ~]# tail -3 /etc/sysctl.conf 
vm.max_map_count=655360
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

[root@efk ~]# sysctl -p
vm.max_map_count = 655360
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
[root@efk config]# cat /usr/lib/systemd/system/es.service
[Unit]
Description=es server daemon
After=network.target sshd-keygen.service

[Service]
Type=simple
LimitNOFILE=100000
LimitNPROC=100000
ExecStart=/usr/local/elasticsearch/bin/elasticsearch 
ExecReload=/bin/kill -HUP $MAINPID
Restart=no
PrivateTmp=true

[Install]
WantedBy=multi-user.target

[root@efk config]# systemctl daemon-reload
[root@efk config]# systemctl enable --now es.service
[root@efk config]# systemctl list-unit-files --type=service | grep -w es
es.service                                    enabled
// 设置elasticsearch的用户名和密码,因为我们上面开启了ssl
执行设置用户名和密码的命令,需要设置密码的用户有elastic、apm_system、kibana_system、logstash_system、beats_system、remote_monitoring_user
[es@efk elasticsearch]$ elasticsearch-setup-passwords interactive
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
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]: 
passwords must be at least [6] characters long
Try again.
Enter password for [elastic]: 
Reenter password for [elastic]: 
Enter password for [apm_system]: 
Reenter password for [apm_system]: 
Enter password for [kibana_system]: 
Reenter password for [kibana_system]: 
Enter password for [logstash_system]: 
Reenter password for [logstash_system]: 
Enter password for [beats_system]: 
Reenter password for [beats_system]: 
Enter password for [remote_monitoring_user]: 
Reenter password for [remote_monitoring_user]: 
Changed password for user [apm_system]
Changed password for user [kibana_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]
  • elastic用户拥有superuser角色,是内置的超级用户
  • kibana用户:拥有kibana_system角色,用户kibana用来连接elasticsearch并与之通信。Kibana服务器以该用户身份提交请求以访问集群监视API和Kibana索引。不能访问index
  • logstash_system用户:拥有logstash_system角色,用户Logstash在Elasticsearch中存储监控信息时使用。

// 修改密码

curl -H "Content-Type:application/json" -XPOST -u elastic 'http://127.0.0.1:9200/_xpack/security/user/elastic/_password' -d '{ "password" : "123456" }'

// 带密码查询

Elasticsearch设置用户名密码之后,不能再直接使用Elasticsearch head 访问,可以在查询等API上加上用户等参数
curl -XGET --user user:passwd 'http://XXXX:9200/XX/XXX'

浏览器IP:9200

用户名为elastic,密码为刚才设置的密码,我这里我密码为123456

loki收集docker容器日志 elk收集docker日志_loki收集docker容器日志

部署kibana

// 下载Kibana
[root@localhost ~]# wget https://artifacts.elastic.co/downloads/kibana/kibana-8.4.1-linux-x86_64.tar.gz -P /opt/
// 解压tar包
[root@efk opt]# tar -zxf kibana-8.4.1-linux-x86_64.tar.gz -C /usr/local/
// 做软链接
[root@efk local]# ln -s kibana-8.4.1/ kibana
[root@efk local]# chown -R kibana.kibana kibana-8.4.1/
[root@efk ~]# useradd kibana
[root@efk ~]# passwd kibana
// 配置环境变量
[root@efk ~]# cat /etc/profile.d/kibana.sh 
export PATH=/usr/local/kibana/bin:$PATH
[root@efk ~]# source /etc/profile.d/kibana.sh
// 创建相应文件,并修改属主和属组
[root@efk ~]# mkdir -p /var/log/kibana/
[root@efk ~]# touch /var/log/kibana/kibana.log
[root@efk ~]# chown -R kibana.kibana /var/log/kibana/kibana.log

[root@efk ~]# mkdir -p /run/kibana/
[root@efk ~]# touch /run/kibana/kibana.pid
[root@efk ~]# chown -R kibana.kibana /run/kibana/kibana.pid
// 修改kibana配置文件,修改配置文件之前建议先备份
[root@efk config]# cp kibana.yml kibana.yml-bak
[root@efk config]# vim kibana.yml
 server.port: 5601  //kibana监听的端口号
 server.host: "192.168.182.132"  //默认为localhost,后端服务器的主机地址
 elasticsearch.hosts: ["http://localhost:9200"]  //与es连接,es的IP+端口号
 elasticsearch.username: "kibana_system"  //kibana_system用户和密码
 elasticsearch.password: "kibana"
 pid.file: /run/kibana/kibana.pid  //kibana的pid文件路径
  i18n.locale: "zh-CN"  //语言中文
logging:
  appenders:
    file:
      type: file
      fileName: /var/log/kibana/kibana.log
      layout:
        type: json
  root:
    appenders:
      - default
      - file
// 使用systemd控制kibana
[root@efk ~]# cat /usr/lib/systemd/system/kibana.service
[Unit]
Description=kibana server daemon
After=network.target sshd-keygen.service

[Service]
Type=simple
ExecStart=/usr/local/kibana/bin/kibana
ExecReload=/bin/kill -HUP $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

[root@efk ~]# systemctl daemon-reload
[root@efk ~]# systemctl enable --now kibana.service

// 浏览器访问IP:5601

loki收集docker容器日志 elk收集docker日志_loki收集docker容器日志_02


loki收集docker容器日志 elk收集docker日志_loki收集docker容器日志_03

// 获取令牌
[root@efk bin]# elasticsearch-create-enrollment-token --scope kibana

loki收集docker容器日志 elk收集docker日志_elasticsearch_04


// 获取验证码

loki收集docker容器日志 elk收集docker日志_loki收集docker容器日志_05

// 获取验证码命令
[root@efk bin]# kibana-verification-code

loki收集docker容器日志 elk收集docker日志_elasticsearch_06

loki收集docker容器日志 elk收集docker日志_搜索引擎_07


// 先选择自己浏览

loki收集docker容器日志 elk收集docker日志_loki收集docker容器日志_08

部署filebeat

// 下载Filebeat
[root@localhost ~]# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.4.1-linux-x86_64.tar.gz -P /opt
// 解压filebeat
[root@efk opt]# tar -zxf filebeat-8.4.1-linux-x86_64.tar.gz -C /usr/local/
// 创建软链接
[root@efk local]# ln -s filebeat-8.4.1-linux-x86_64/ filebeat
//配置环境变量
[root@efk ~]# cat /etc/profile.d/filebeat.sh
export PATH=/usr/local/filebeat/filebeat:$PATH
[root@efk ~]# source /etc/profile.d/filebeat.sh
// 使用systemd控制filebeat
[root@efk ~]# cat /usr/lib/systemd/system/filebeat.service
[Unit]
Description=filebeat server daemon
After=network.target sshd-keygen.service

[Service]
Type=simple
ExecStart=/usr/local/filebeat/filebeat -c /usr/local/filebeat/fields.yml
ExecReload=/bin/kill -HUP $MAINPID
Restart=always

[Install]
WantedBy=multi-user.target

[root@efk ~]# systemctl daemon-reload
[root@efk ~]# systemctl enable --now filebeat.service