前言
利用Docker容器搭建ELK集群
由于在下载包时很有可能因为网络原因失败,因此我已上传百度网盘资源请自行选择下载
链接:https://pan.baidu.com/s/1v4QAG6-y21-tPXudhJoszw
提取码:23c6
一、安装docker
1、下载docker源
yum install -y yum-utils device-mapper-persistent-data lvm2 git
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2、安装
查看版本
yum list docker-ce --showduplicates
安装最新版
yum -y install docker-ce
二、安装docker-compose
下载安装
curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
修改为可执行权限
chmod +x /usr/local/bin/docker-compose
验证安装
$ docker-compose version
docker-compose version 1.27.4, build 40524192
docker-py version: 4.3.1
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
安装docker-compose命令补全工具
yum install bash-completion
curl -L https://raw.githubusercontent.com/docker/compose/1.27.4/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
之后断开重连或切换终端生效
三、编写docker-compose.yml文件
创建elastic 文件夹
# yum -y install tree
# tree elastic/
elastic/
├── docker-compose.yml
├── filebeat
│ ├── filebeat_to_logstash.yml
│ └── nginx_access_app.log
└── logstash
├── config
│ └── logstash.yml
└── pipeline
└── logstash.conf
4 directories, 6 files
docker-compose.yml
version: '3.8'
services:
# 用于连接到集群,查看集群信息
cerebro:
image: lmenezes/cerebro:0.8.4
# 浏览器中访问宿主机的 9000 端口即可
# 访问到集群的信息
ports:
- "9000:9000"
command:
# 用于此容器访问elasticsearch 集群的节点 es01
- -Dhosts.0.host=http://es01:9200
networks:
- es7net
kibana:
image: docker.elastic.co/kibana/kibana:7.10.0
environment:
# 设置为中文环境
I18N_LOCALE: zh-CN
# 链接到 elasticsearch 集群的节点 es01
ELASTICSEARCH_URL: http://es01:9200
ELASTICSEARCH_HOSTS: http://es01:9200
ports:
- "5601:5601"
networks:
- es7net
logstash7:
image: docker.elastic.co/logstash/logstash:7.10.0
volumes:
- type: bind
# 映射的配置文件
source: ./logstash/config/logstash.yml
target: /usr/share/logstash/config/logstash.yml
read_only: true
- type: bind
# 映射的输入输出配置文件
source: ./logstash/pipeline
target: /usr/share/logstash/pipeline
read_only: true
ports:
# 映射端口到宿主机,这样的话无论 filebeat 是否使用了容器
# 都可以通过访问宿主机的 5044 端口,
# 把日志输入到 logstash
- "5044:5044"
environment:
# 设置 JVM 的堆内存,两个数据要一致
# 生产环境设置为物理内存的一半即可
LS_JAVA_OPTS: "-Xmx512m -Xms512m"
networks:
- es7net
# logstash 容器依赖于下面的几个容器
depends_on:
- es01
- es02
- es03
filebeat:
image: docker.elastic.co/beats/filebeat:7.10.0
environment:
# 此配置主要为了处理多行日志而设置的,
# 比如 java 程序日志中的错误异常,往往会打印
# 出多行。设置这个参数后,就会自动把他们合并
# 到一行进行处理
- co.elastic.logs/multiline.*
volumes:
# filebeat 的配置文件,这里设置的从哪里搜集日志
# 和把搜集后的日志输出到哪里
- type: bind
source: ./filebeat/filebeat_to_logstash.yml
target: /usr/share/filebeat/filebeat.yml
read_only: true
# 示例日志而已
# 生产环境假如使用容器实现 filebeat,那么可以把宿主机中
# 的日志映射到 filebeat 的容器中。
- type: bind
source: ./filebeat/nginx_access_app.log
target: /nginx_access_app.log
networks:
- es7net
depends_on:
- logstash7
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
environment:
# 集群的名称
- cluster.name=elk-cluster
# 此容器在集群中的名称,成为节点名称
- node.name=es7_01
# 锁定物理内存,禁止物理内存和虚拟内存 swap 进行交换
# 假如交换的话,会造成性能低下
- bootstrap.memory_lock=true
# 设置堆内存,生产环境需要设置为物理内存大小的一半
# 或者一半以下,并且总体大小不要超过 30 G
# 即使您限制对容器的内存访问,也必须配置堆大小。
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
# 关于集群互相发现的设置
- discovery.seed_hosts=e01,es02,es03
# 集群中参与 master 选举的节点成员
- cluster.initial_master_nodes=es7_01,es7_02,es7_03
ulimits:
memlock:
soft: -1
hard: -1
nproc: 65535
nofile: 65535
volumes:
# 此容器中的数据,存放到 Docker 数据卷中
- es7data1:/usr/share/elasticsearch/data
ports:
- "9200:9200"
networks:
- es7net
es02:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
environment:
- cluster.name=elk-cluster
- node.name=es7_02
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- discovery.seed_hosts=e01,es02,es03
- cluster.initial_master_nodes=es7_01,es7_02,es7_03
ulimits:
memlock:
soft: -1
hard: -1
nproc: 65535
nofile: 65535
volumes:
- es7data2:/usr/share/elasticsearch/data
networks:
- es7net
es03:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
environment:
- cluster.name=elk-cluster
- node.name=es7_03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- discovery.seed_hosts=es7_01,es7_02,es7_03
- cluster.initial_master_nodes=es7_01,es7_02,es7_03
ulimits:
memlock:
soft: -1
hard: -1
nproc: 65535
nofile: 65535
volumes:
- es7data3:/usr/share/elasticsearch/data
networks:
- es7net
volumes:
# 声明的 Docker 本地数据卷
es7data1:
driver: local
es7data2:
driver: local
es7data3:
driver: local
networks:
# 声明的网络网桥名称
es7net:
driver: bridge
name: vhost_xiuyun_net
logstash.yml
# 监听所有 IP,用于其他主机通过本机(或者此容器的 IP) 访问 logstash
http.host: "0.0.0.0"
logstash.conf
input {
# 监听 5044 端口,用于接收 filebeat 输出的日志数据
beats {
port => 5044
}
}
# 把处理好的数据输出到指定的目标中
output {
# 把接受的信息输出到标准输出,也就是屏幕上
stdout {
codec => rubydebug }
}
启动项目
# cd elastic/
# docker-compose up -d
查看启动状态,这里需要一些启动时间
# docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------
elastic_cerebro_1 /opt/cerebro/bin/cerebro - ... Up 0.0.0.0:9000->9000/tcp
elastic_es01_1 /tini -- /usr/local/bin/do ... Up 0.0.0.0:9200->9200/tcp, 9300/tcp
elastic_es02_1 /tini -- /usr/local/bin/do ... Up 9200/tcp, 9300/tcp
elastic_es03_1 /tini -- /usr/local/bin/do ... Up 9200/tcp, 9300/tcp
elastic_filebeat_1 /usr/local/bin/docker-entr ... Up
elastic_kibana_1 /usr/local/bin/dumb-init - ... Up 0.0.0.0:5601->5601/tcp
elastic_logstash7_1 /usr/local/bin/docker-entr ... Up 0.0.0.0:5044->5044/tcp, 9600/tcp
验证集群是否有效
访问宿主机9000端口
部署filebeat
在日志所在的机器部署
下载安装
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.10.2-linux-x86_64.tar.gz
tar -xf filebeat-7.10.2-linux-x86_64.tar.gz -C /usr/local/
编辑filebeat.yml文件
# grep -Pv '^[ ]*#|^[ ]*$' filebeat.yml
filebeat.inputs:
- type: log
enabled: false
paths:
- /var/log/*.log
- type: filestream
enabled: false
paths:
- /var/log/*.log
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 1
setup.kibana:
# 这里能连接到 kibana 的 IP 或者主机名
host: "192.168.122.127:5601"
output.elasticsearch:
# 连接到 elasticsearch 的主机名或者 IP
hosts: ["es01:9200"]
processors:
- add_host_metadata:
when.not.contains.tags: forwarded
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~
运行 filebeat,并使用 --dashboards 选项,以便推出 仪表盘 模板到 kibana
filebeat setup --dashboards
这将会推出如下目录下所有以 .json 结尾的模板
# ls kibana/7/dashboard/
成功加载模板和仪表板后,您将看到如下消息
# ./filebeat setup --dashboards
Loading dashboards (Kibana must be running and reachable)
Loaded dashboards
访问宿主机端5601端口
启用要执行的模块
# ./filebeat modules enable nginx
运行 setup 命令并使用指定的 --pipelines 和 --modules 选项,目的时为已启用的模块加载提取管道。此步骤还需要连接到Elasticsearch。如果要使用Logstash管道而不是摄取节点来解析数据,请跳过此步骤
# ./filebeat -e setup --pipelines --modules nginx
配置 Filebeat 将日志发送到 Logstash
#output.elasticsearch:
#hosts: ["localhost:9200"]
output.logstash:
# The Logstash hosts
hosts: ["192.168.122.127:5044"]
启动filebeat
nohup ./filebeat &
启动Logstash 并创建管道
# cat logstash/pipeline/logstash.conf
input {
# 监听 5044 端口,用于接收 filebeat 输出的日志数据
beats {
port => 5044
}
}
output {
if [@metadata][pipeline] {
elasticsearch {
hosts => ["es01:9200","es02:9200","es03:9200"]
manage_template => false
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
pipeline => "%{[@metadata][pipeline]}"
}
} else {
elasticsearch {
hosts => ["es01:9200","es02:9200","es03:9200"]
manage_template => false
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
}
}
}
重新启动logstash
# docker-compose restart logstash
等待一会儿 再次访问 9000 端口的,所应添加完毕
后面的操作主要就是页面的设置 这里就结束了
附带二进制包下载链接
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.0-linux-x86_64.tar.gz
https://artifacts.elastic.co/downloads/kibana/kibana-7.10.2-linux-x86_64.tar.gz
https://artifacts.elastic.co/downloads/logstash/logstash-7.11.1-linux-x86_64.tar.gz
https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.10.2-linux-x86_64.tar.gz