1. Elasticsearch : docker pull docker.elastic.co/elasticsearch/elasticsearch:6.4.2
  2. Logstash : docker pull docker.elastic.co/logstash/logstash:6.4.2
  3. Kibana : docker pull docker.elastic.co/kibana/kibana:6.4.2
[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
  1. 在elasticsearch的docker版本文档中,提到了宿主机vm.max_map_count的值在生产环境最少要设置成262144。设置的方式有两种

① /etc/sysctl.conf文件中添加一行:

vm.max_map_count=262144

② 正在运行的机器执行命令:

sysctl -w vm.max_map_count=262144
  1. 禁用交换内存空间
    交换内存效率太低, 所以不建议使用
    ①临时关闭交换内存的方法
sudo swapoff -a

②修改配置文件关闭交换内存
在/etc/fstab文件中添加

vm.swappiness = 1

为什么不设置为0 ? 因为设置为0在一些Linux版本中会自动杀掉一些进程

  1. 创建ES数据存储目录
    使用docker运行的ES索引等数据默认是保存在docker容器内的, 我们需要把保存的数据目录挂载到宿主机上, 所以在宿主机上创建目录 /usr/share/elk/es/data , 注意该目录情况下ES容器是没有写权限的

  2. 创建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.masternode.data都是true , 
# 这意味着每个ES节点都可以存储数据, master节点宕机的时候每个ES节点都可以竞选为master节点
# 所以, 为了防止脑裂现象的出现, ES集群需要设置一个值, 当候选主节点数少于该值的时候就不进行选举
# 例如我们集群中有11(node.masternode.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"]
  1. 运行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
  1. 安装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做反向代理即可

  1. 运行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会发布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