- 我们首先到ELK官网查找相关版本镜像地址
link
现下载一个最新的版本
- Elasticsearch : docker pull docker.elastic.co/elasticsearch/elasticsearch:6.4.2
- Logstash : docker pull docker.elastic.co/logstash/logstash:6.4.2
- Kibana : docker pull docker.elastic.co/kibana/kibana:6.4.2
- 给下载好的镜像重新命名
下载好的镜像名字太长了, 使用docker tag起个短点的,方便使用
[root@localhost ~]# docker tag docker.elastic.co/logstash/logstash:6.4.2 logstash
[root@localhost ~]# docker tag docker.elastic.co/kibana/kibana:6.4.2 kibana
[root@localhost ~]# docker tag docker.elastic.co/elasticsearch/elasticsearch:6.4.2 elasticsearch
- 安装ElasticSearch
- 在elasticsearch的docker版本文档中,提到了宿主机vm.max_map_count的值在生产环境最少要设置成262144。设置的方式有两种
① /etc/sysctl.conf文件中添加一行:
vm.max_map_count=262144
② 正在运行的机器执行命令:
sysctl -w vm.max_map_count=262144
- 禁用交换内存空间
交换内存效率太低, 所以不建议使用
①临时关闭交换内存的方法
sudo swapoff -a
②修改配置文件关闭交换内存
在/etc/fstab文件中添加
vm.swappiness = 1
为什么不设置为0 ? 因为设置为0在一些Linux版本中会自动杀掉一些进程
创建ES数据存储目录
使用docker运行的ES索引等数据默认是保存在docker容器内的, 我们需要把保存的数据目录挂载到宿主机上, 所以在宿主机上创建目录 /usr/share/elk/es/data , 注意该目录情况下ES容器是没有写权限的创建ES配置文件
创建 /usr/share/elk/es/config/elasticsearch.yml配置文件
# 集群名称, ES是通过该名称区分不同的集群的. 所以同一个集群它们的名称必须一致
cluster.name: "docker-cluster"
# 0.0.0.0表示向外网发布服务, 由于我们docker使用host网络模式, 建议设置为宿主机内网IP
network.host: 0.0.0.0
# 默认配置下node.master和node.data都是true ,
# 这意味着每个ES节点都可以存储数据, 当master节点宕机的时候每个ES节点都可以竞选为master节点
# 所以, 为了防止脑裂现象的出现, ES集群需要设置一个值, 当候选主节点数少于该值的时候就不进行选举
# 例如我们集群中有11个(node.master和node.data都是false的节点除外), 那么可以设置为6
# 集群中的ES节点数可能会经常改变, 该参数也是可以通过RESTFul接口调整的
# 详细解释 https://www.elastic.co/guide/cn/elasticsearch/guide/current/important-configuration-changes.html#unicast
discovery.zen.minimum_master_nodes: 1
# 设置单播模式, 根据不同的网络结构灵活设置, 不要都设置到一个机架或路由上
discovery.zen.ping.unicast.hosts: ["10.211.55.9","10.211.55.10"]
- 运行ES实例
ES_HEAP_SIZE指定ElasticSearch堆内存大小默认值是1G, Lucene使用的是堆外内存, 假设某宿主机有32G内存且只跑一个ES, 建议ES_HEAP_SIZE设置为16G即可. ES_HEAP_SIZE最好不要超过32G否则这会关闭JVM指针压缩, 而且更大的堆内存意味着GC时要检查地方越多.
docker run -d -p 9200:9200 -p 9300:9300 --name elasticsearch -e ES_HEAP_SIZE=2g --net=host \
-v /usr/share/elk/es/data:/usr/share/elasticsearch/data \
-v /usr/share/elk/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
elasticsearch
- 安装Kibana
- 安装ES负载均衡实例
为了提高ES集群的可用性, 我们可以创建一个专门用于做负载均衡的ES节点, 这个节点不会存储数据和选举master.
我们的Logstash和Kibana配置的ELASTICSEARCH_URL可以直接配该节点的IP提升ES集群的灵活性.
根据上面ES搭建方式下在 /usr/share/elk/es/config/elasticsearch.yml配置文件中增加如下配置
node.master: false
node.data: false
假设该负载均衡节点的IP为10.211.55.12, 之后在Kibana和Logstash中的ELASTICSEARCH_URL可以直接使用该IP, 同时若之后的集群再变大可再新增负载均衡节点, 使用并使用nginx做反向代理即可
- 运行Kibana容器 由于index、Visualize、Dashboard等都是保存在ES中, 所以Kibana直接用默认的配置就行了, 注意修改自己ES的服务器IP
docker run -d -p 5601:5601 --name kibana -e ELASTICSEARCH_URL=http://10.211.55.12:9200 --net=host kibana
- 安装Logstash
logstash会发布9600端口, 外网环境注意屏蔽,下面是挂载的两个配置文件的具体配置
①创建/usr/share/elk/logstash/pipeline/logstash.conf
配置logstash的接收管道和发送管道, 我们以消费者的角色从kafka中消费log消息, 并将消息解析成json推送给elasticsearch
input {
kafka {
bootstrap_servers => "10.211.55.2:9092"
topics => ["mylogs1"]
type => "app"
codec => "json"
}
}
filter {
date {
match => [ "time", "UNIX_MS" ]
target => "time"
remove_field => "@version"
}
}
output {
if "_grokparsefailure" in [tags] {
}else{
if [type] == "app"{
elasticsearch {
hosts => ["10.211.55.12:9200"]
index => "logstash-%{type}-%{+YYYY.MM.dd}"
}
}
}
}
②创建/usr/share/elk/logstash/config/logstash.yml
配置logstash的监控地址, 将logstash的状态信息上传至elasticsearch中, 可以在Kibana的Monitoring中看到logstash的信息
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.url: ["http://10.211.55.12:9200"]
xpack.monitoring.elasticsearch.sniffing: true
xpack.monitoring.enabled: true
运行logstash镜像
docker run -it --name logstash -d --net=host \
-v /usr/share/elk/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \
-v /usr/share/elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml \
logstash