部署环境
CentOS Linux release 7.9.2009 (Core)
ElasticSearch:7.12.0
ElasticSearch-head:5
Kibana:7.12.0
logstash:7.12.0
安装docker
使用yum命令安装docker
yum install -y docker
安装docker-compose
下载docker-compose 执行文件
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
添加执行权限
sudo chmod +x /usr/local/bin/docker-compose
创建软链接
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
查看是否安装成功,查看版本信息
[root@docker ~]# docker-compose --version
docker-compose version 1.29.1, build c34c88b2
拉取镜像
# docker pull docker.elastic.co/elasticsearch/elasticsearch:7.12.0
--elasticsearch
# docker pull docker.elastic.co/kibana/kibana:7.12.0
--kibana
# docker pull docker.elastic.co/logstash/logstash:7.12.0
--logstash
# docker pull mobz/elasticsearch-head:5
--elasticsearch-head
查看拉取镜像列表
docker images
elasticsearch安装
注意ES、Logstash、Kibana版本必须一致,不然会出现各种莫名的问题,比如Kibana连不上ES或者Logstash连不上ES。这里我使用的是7.12.0版本。
参考链接:
https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html
参看官方文档使用docker-compose创建elasticsearch集群
在/opt/docker目录下创建docker-compose.yml文件
docker-compose.yml
version: '2.2'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.12.0
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data01:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- elastic
es02:
image: docker.elastic.co/elasticsearch/elasticsearch:7.12.0
container_name: es02
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data02:/usr/share/elasticsearch/data
networks:
- elastic
es03:
image: docker.elastic.co/elasticsearch/elasticsearch:7.12.0
container_name: es03
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data03:/usr/share/elasticsearch/data
networks:
- elastic
volumes:
data01:
driver: local
data02:
driver: local
data03:
driver: local
networks:
elastic:
driver: bridge
注:
Docker分别命名为data01、data02和data03,用于存储节点数据目录,使数据在重启过程中保持不变。如果它们还不存在,那么在docker-compose创建集群时创建它们。
创建volume
创建volume
docker volume create data01
docker volume create data02
docker volume create data03
参看volume
docker volume ls
查看volume详细信息
docker volume inspect data01
全部都准备完毕,开始创建elasticSearch容器。
创建ElasticSarch集群容器
cd /opt/docker #接入存放docker-compose.yml目录
docker-compose up #创建容器
查看容器是否创建完成
docker ps -a
使用curl命令查看es集群状态
curl -X GET "localhost:9200/_cat/nodes?v=true&pretty"
给elasticsearch容器设置开机启动
docker update --restart=always 13b444cacc91
docker update --restart=always 27224a557c03
docker update --restart=always 35cfa89dabbc
至此elasitcsearch集群部署完成!
遇到的坑
vm.max_map_count
1、创建elasticSearch容器时需要修改Linux vm.max_map_count参数。
max_map_count
指定该进程可以使用的最大内存映射区域数。在大多数情况下,默认 值为65530。如果您需要将更多文件映射到您的应用程序,请增加此值。
检查系统vm.max_map_count设置值
# sysctl -a | grep vm.max_map_count
vm.max_map_count = 65530
修改vm.max_map_count
# sysctl -w vm.max_map_count=262144
vm.max_map_count = 262144
再次检查
# sysctl -a | grep vm.max_map_count
vm.max_map_count = 262144
head插件无法链接到es节点,需要设置跨域访问。
# 参看容器id
docker ps -a
#进入容器内
docker exec -it 容器id /bin/bash
#编辑elasticsearch.yml配置文件
vi /config/elasticsearch.yml
在最后一行添加跨域访问
http.cors.enabled: true
http.cors.allow-origin: "*"
[root@27224a557c03 elasticsearch]# cat config/elasticsearch.yml
cluster.name: "docker-cluster"
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
[root@27224a557c03 elasticsearch]#
重启容器
docker restart 容器id
elasticsearch head插件安装
创建elasticsearch head容器,映射9100端口,--restart=always设置开机自动启动容器
docker run -d -p 9100:9100 --restart=always docker.io/mobz/elasticsearch-head:5
访问head web界面:
参看head插件是否正常启动。
遇到的坑
Docker容器ElasticSearch-Head创建索引无响应406
解决方法:
修改head的 Content-Type 设置,
#参看容器id号
docker ps -a
#进入docker容器内
docker exec -it 容器id /bin/bash
root@b93fa4e29ba2:/usr/src/app# vim _site/vendor.js
1. 6886行 /contentType: "application/x-www-form-urlencoded
改成 contentType: "application/json;charset=UTF-8"
2. 7574行 var inspectData = s.contentType ==`= "application/x-www-form-urlencoded" &&`
改成 var inspectData = s.contentType === "application/json;charset=UTF-8" &&
root@b93fa4e29ba2:/usr/src/app/_site# exit
exit
#重启容器
[root@localhost ~]# docker restart 容器id
Kibana安装
创建Kibana容器
docker run --name elk-kibana -e ELASTICSEARCH_URL=http://172.18.0.4:9200 -p 5601:5601 --restart=always 7a6b1047dd48
-e ELASTICSEARCH_URL=http://172.18.0.4:9200:设置ELASTICSEARCH_URL用于连接es节点
--restart=always:设置开机启动
进入kibana容器内,修改/config/kibana.yml配置文件,添加下述内容
server.name: kibana
server.host: "0"
# 连接es节点
elasticsearch.hosts: [ "http://elk-es01:9200" ]
monitoring.ui.container.elasticsearch.enabled: true
# web界面设置成中文
i18n.locale: "zh-CN"
重启Kibana容器
[root@docker /]# docker exec -it --user=root 7a0b4cb0bca2 /bin/bash
bash: printf: write error: Interrupted system call
[root@7a0b4cb0bca2 kibana]# vi config/kibana.yml
[root@7a0b4cb0bca2 kibana]# cat config/kibana.yml
#
# ** THIS IS AN AUTO-GENERATED FILE **
#
# Default Kibana configuration for docker target
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://elk-es01:9200" ]
monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: "zh-CN"
[root@7a0b4cb0bca2 kibana]# exit
exit
[root@docker /]# docker restart 7a0b4cb0bca2
7a0b4cb0bca2
[root@docker /]#
访问web页面:http://192.168.10.30:5601
logstash安装
创建logstash容器
docker run -it -d -p 5044:5044 -p 5040:5040 --restart=always --name logstash --net=docker_elastic docker.elastic.co/logstash/logstash:7.12.0
--net:指定网络组为docker_elastic
--restart=always:设置开机启动
进入logstash容器内,编辑logstash.yml配置文件添加连接es节点配置。
[root@docker ~]# docker exec -it --user=root b5f3e8eeea13 /bin/bash
[root@b5f3e8eeea13 logstash]# vim config/logstash.yml
[root@b5f3e8eeea13 logstash]# cat config/logstash.yml
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://elk-es01:9200" ]
[root@b5f3e8eeea13 logstash]# exit
exit
[root@docker ~]# docker restart b5f3e8eeea13 //重启logstash容器
b5f3e8eeea13
[root@docker ~]#
通过TCP方式采集web服务日志
1.在logstash/config/路径下创建logstash.conf文件
2.编辑logstash.conf,输入以下配置
#输入
input {
tcp {
mode => "server" #操作模式, server:监听客户端连接, client:连接到服务器
host => "0.0.0.0" #指定监听地址, 默认0.0.0.0
port => 4560 #端口号
codec => json_lines #数据格式,如json,json_lines等
}
}
#输出到ES
output {
elasticsearch {
hosts => "127.0.0.1:9200" #es的地址
action=>"index" #es要执行的动作 index, delete, create, update
index => "index-logstash-%{+YYYY.MM.dd}" #索引名称
}
}
3.修改logstash.yml文件
#指定配置文件路径
path.config: /usr/share/logstash/config/logstash.conf
4.web项目中添加logstash依赖
<!--集成logstash-->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.3</version>
</dependency>
5.创建logback.xml文件,新增appender
<!--输出到logstash的appender-->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!--logstash日志收集端口-->
<destination>127.0.0.1:4560</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<root level="INFO">
<appender-ref ref="LOGSTASH"/>
</root>
6.重启logstash容器
docker restart b5f3e8eeea13
采集多个服务的日志
input {
tcp {
add_field => {"service" => "admin"}
mode => "server"
host => "0.0.0.0"
port => 4560
codec => json_lines
}
tcp {
add_field => {"service" => "auth"}
mode => "server"
host => "0.0.0.0"
port => 4561
codec => json_lines
}
}
output {
if [service] == "admin"{
elasticsearch {
hosts => "127.0.0.1:9200"
index => "admin-logstash-%{+YYYY.MM.dd}"
}
}
if [service] == "auth"{
elasticsearch {
hosts => "127.0.0.1:9200"
index => "auth-logstash-%{+YYYY.MM.dd}"
}
}
}
评论区