文章目录

  • ​​1. elk + filebeat 数据流​​
  • ​​2. 项目目录结构​​
  • ​​3. 前置配置​​
  • ​​4. 镜像下载​​
  • ​​5. 部署 nginx​​
  • ​​6. 部署 elk​​
  • ​​7. 部署 filebeat​​
  • ​​7.1 filebeat deb 方式部署​​
  • ​​7.2 filebeat docker 方式部署​​
  • ​​7.3 filebeat 卸载​​
  • ​​8. 涉及到文件详细内容​​
  • ​​8.1 filebeat - filebeat.yml​​
  • ​​8.2 02-beats-input.conf​​
  • ​​8.3 nginx - docker-compose.yaml​​
  • ​​8.4 nginx - nginx.conf​​
  • ​​8.5 nginx - index.html​​
  • ​​9. Issues​​
  • ​​10. kibana 操作图示​​
  • ​​附录 - 参考网址​​

1. elk + filebeat 数据流

filebeat(​​日志数据采集器​​​) -> logstash:5044(​​搜集日志​​​) -> es:9200(​​存储日志​​​) -> kibana:5601(​​查询和可视化​​)

elk+ filebeat环境部署(docker 方式)_html


 

2. 项目目录结构

elk/
├── dockerFile # 空文件夹
├── filebeat
│ └── filebeat.yml
├── module # 空文件夹
└── nginx
├── conf
│ ├── index
│ │ └── index.html
│ └── nginx.conf
├── docker-compose.yaml
└── logs
├── access.log # nginx 启动后会自动生成
└── error.log # nginx 启动后会自动生成

 

3. 前置配置

# 1. 调高JVM线程数限制数量, 防止启动容器时,报出如下错误:
# bootstrap checks failed max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
# 方式1: 运行 ELK 镜像需要 vm.max_map_count 至少需要 262144 内存(永久性修改)
sudo vim /etc/sysctl.conf
# 存在 vm.max_map_count 参数则修改,没有则新增
vm.max_map_count = 262144

# 方式2: 临时改变某个指定参数的值
sysctl -w vm.max_map_count=262144

# 重新加载内核参数
sudo sysctl -p

# 2. 添加本地IP的域名映射
sudo vim /etc/hosts
127.0.0.1 elk.answer.com

 

4. 镜像下载

# ELK_VERSION=7.0.1 & ES_VERSION=7.0.1 & LOGSTASH_VERSION=7.0.1 & KIBANA_VERSION=7.0.1  
# ES_PACKAGE=elasticsearch-7.0.1-linux-x86_64.tar.gz
# LOGSTASH_PACKAGE=logstash-7.0.1.tar.gz
# KIBANA_PACKAGE=kibana-7.0.1-linux-x86_64.tar.gz
# 拉取 sebp/elk 镜像, 此次部署版本号为: 7.0.1
docker pull sebp/elk

# 拉取 nginx 镜像, 用于产生日志
docker pull nginx

# 拉取 filebeat 镜像, 如果是 deb 方式部署 filebeat 则不需要下载该镜像
# docker 中 filebeat 版本: FILEBEAT_VERSION=6.2.3
docker pull prima/filebeat

# 查看 镜像对应的 filebeat 版本
docker image inspect prima/filebeat:latest | grep FILEBEAT_VERSION

 

5. 部署 nginx

# 进入 nginx 目录
cd elk/nginx

# 启动 nginx 容器实例
docker-compose -f docker-compose.yaml up -d

# 验证 nginx 服务启动状态. 由于映射的是80端口, 因此无需写端口号
curl http://IP

 

6. 部署 elk

# 启动 elk 容器实例 
docker run -p 7050:9200 -p 7053:5044 -p 7051:5601 -v /data/elk/dockerFile:/data -it -d --name elk sebp/elk

# 查看 elk 容器日志
docker logs -f elk --tail=100

# 验证
# 访问 es
http://10.135.XXX.XXX:7050
http://10.135.XXX.XXX:7050/_search?pretty

# 访问 kibana
http://10.135.XXX.XXX:7051

 

7. 部署 filebeat

7.1 filebeat deb 方式部署

# 下载 filebeat-6.2.4-amd64.deb
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.4-amd64.deb

# 安装 filebeat
sudo dpkg -i ./filebeat-6.2.4-amd64.deb
sudo systemctl daemon-reload

# 验证, 查看 filebeat 版本
filebeat version

# 编辑 filebeat.yml 文件内容, 内容见下面
sudo vim /etc/filebeat/filebeat.yml

# 启动 filebeat 服务
sudo service filebeat start

# 查看 filebeat 日志
sudo tail -f /var/log/filebeat/filebeat

# 进入 elk 容器内部
docker exec -it elk bash

# 修改 02-beats-input.conf 文件, 去掉 ssl 配置
vim /etc/logstash/conf.d/02-beats-input.conf
ssl => true
ssl_certificate => "/etc/pki/tls/certs/logstash-beats.crt"
ssl_key => "/etc/pki/tls/private/logstash-beats.key"

# 重启 elk 容器
docker restart elk

 

7.2 filebeat docker 方式部署

# 注意将宿主机的日志文件挂载到容器内部, 以及 filebeat.yml 文件配置域名时需要在容器内部做域名映射(add-host)  
docker run -d --name filebeat \
-v /data/elk/filebeat/filebeat.yml:/filebeat.yml \
-v ~/elk/filebeat/logs/:/home/logs/ \
-v /data/elk/module:/module \
-v /data/elk/nginx/logs/:/data/elk/nginx/logs/ \
--add-host elk.answer.com:111.XXX.XXX.XXX\
prima/filebeat

# 查看 filebeat 容器实例的日志
docker logs -f filebeat

7.3 filebeat 卸载

#############################################
# deb 方式卸载
#############################################
# 查看
dpkg -l filebeat
# 卸载
dpkg -r filebeat
sudo dpkg --purge filebeat
# 重载配置文件
sudo systemctl daemon-reload

#############################################
# docker 方式卸载
#############################################
# 删除容器
docker rm -f filebeat

# 删除镜像
docker rmi -f prima/filebeat:latest

 

8. 涉及到文件详细内容

8.1 filebeat - filebeat.yml

# sudo vim /etc/filebeat/filebeat.yml
filebeat:
prospectors:
-
# 指定要监控的日志,可以指定具体得文件或者目录
paths:
- /data/elk/nginx/logs/access.log
# 指定文件的输入类型log(默认)或者stdin
input_type: log
enabled: true
# 设定Elasticsearch输出时的document的type字段 可以用来给日志进行分类。Default: log
# document_type: nginx-access
# 如果设置为0s,则Filebeat会尽可能快地感知更新(占用的CPU会变高)。默认是10s
scan_frequency: 10s
# 记录filebeat处理日志文件的位置的文件,默认是在启动的根目录下
registry_file: /var/lib/filebeat/registry
output:
logstash:
# filebeat收集后放到 logstash 里
hosts: ["elk.answer.com:7053"]
enabled: true
index: filebeat

​注意: 此处需要在 /etc/hosts 文件中添加域名映射 127.0.0.1 elk.answer.com​

 

8.2 02-beats-input.conf

input {
beats {
host => "0.0.0.0"
port => 5044
}
}

​注意: 此处关闭 ssl, filebeat.yml 中也必须关掉 ssl, 这个文件在 elk 容器内部, 路径为: /etc/logstash/conf.d/​

  1. docker exec -it elk bash
  2. vim /etc/logstash/conf.d/02-beats-input.conf

 

8.3 nginx - docker-compose.yaml

version: '2'

services:
poc.sdk.nginx:
container_name: aal_nginx
hostname: aal_nginx
image: nginx:latest
environment:
- HOSTNAME=aal_nginx
working_dir: /var/log/nginx
volumes:
- ./logs:/var/log/nginx
- ./conf/index/index.html:/usr/share/nginx/html/index.html:ro
- ./conf/nginx.conf:/etc/nginx/nginx.conf
- /etc/localtime:/etc/localtime:ro
expose:
- 80
ports:
- 80:80
logging:
driver: "json-file"
options:
max-size: "200M"
max-file: "5"

 

8.4 nginx - nginx.conf

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 json '{"@timestamp":"$time_iso8601",
"@version":"1","host":"$server_addr",
"client":"$remote_addr", "size":"$body_bytes_sent",
"responsetime":"$request_time",
"domain":"$host","url":"$uri","status":"$status"}';

access_log /var/log/nginx/access.log json;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;

#gzip on;

include /etc/nginx/conf.d/*.conf;
}

 

8.5 nginx - index.html

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h5>Welcome to nginx, Answer.AL.L!</h1>
</body>
</html>

 

9. Issues

# Questions1 - 如果 filebeat 日志报错, 解决方案: 重启 elk
ERR Failed to publish events caused by: lumberjack protocol error

# Questions1 - 解决方案
# 进入 elk 容器内部
docker exec -it elk bash

# 注释掉 ssl 配置
vim /etc/logstash/conf.d/02-beats-input.conf
# ssl => true
# ssl_certificate => "/etc/pki/tls/certs/logstash-beats.crt"
# ssl_key => "/etc/pki/tls/private/logstash-beats.key"

# 重启 elk 容器
docker restart elk

 

10. kibana 操作图示

elk+ filebeat环境部署(docker 方式)_docker_02

​问题排查原因:​

  1. filebeat.yml 中的域名是否已经完成映射(注意docker部署时需要在容器内部完成映射)
  2. filebeat.yml 中的日志源是否挂载到容器内部

 

​创建索引模式​

elk+ filebeat环境部署(docker 方式)_docker_03

elk+ filebeat环境部署(docker 方式)_nginx_04


 ​​查找日志信息​

elk+ filebeat环境部署(docker 方式)_html_05


 

附录 - 参考网址