docker搭建elk stack部署(三种形式)

第一Part:Docker搭建ELK单机单节点部署笔记(需要看)

一、镜像下载运行

1、pull镜像

docker pull elasticsearch:7.5.0
docker pull logstash:7.5.0
docker pull kibana:7.5.0
docker pull elastic/filebeat:7.5.0 filebeat作为客户端工具,在linux每个节点利用rpm安装部署。

2、先普通run,copy容器数据改了配置再重新run
(1)elasticsearch,单节点
  1. 普通run:docker run -d --name elasticsearch -p 9200:9200 -e “discovery.type=single-node” elasticsearch:7.5.0

  2. 可能出现的错误:

    1. max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
    2. 解决方法(临时方案):在宿主机执行:sysctl -w vm.max_map_count=262144
    3. 解决方法(永久方案):在宿主机 /etc/sysctl.conf文件最后添加一行 vm.max_map_count=262144 然后执行 sysctl -p
  3. 查看日志看是否成功:docker logs -f elasticsearch 可以通过访问ip:9200来查看是否成功。然后ctrl+c退出日志窗口。

  4. 复制配置文件夹:docker cp elasticsearch:/usr/share/elasticsearch/config /home/elasticsearch/es/config

  5. 停止并删除容器:docker stop elasticsearch -> docker rm elasticsearch 或者直接 docker rm -f elasticsearch

  6. 创建数据卷(挂载容器的data):docker volume create elasticsearch

  7. 修改配置文件(这里我选择不修改)后通过-v挂载重新启动容器:docker run -d --name elasticsearch -v /home/elasticsearch/es/config:/usr/share/elasticsearch/config -v elasticsearch:/usr/share/elasticsearch/data -p 9200:9200 -e “discovery.type=single-node” -d elasticsearch:7.5.0

(2)kibana
  1. 普通run:docker run -d --name kibana --link elasticsearch:elasticsearch -p 5601:5601 -d kibana:7.5.0
  2. 查看日志看是否成功:docker logs -f kibana 可以通过访问ip:5601来查看是否成功。然后ctrl+c退出日志窗口。
  3. 复制配置文件夹:docker cp kibana:/usr/share/kibana/config /home/kibana/config
  4. 停止并删除容器:docker stop kibana-> docker rm kibana 或者直接 docker rm -f kibana
  5. 创建数据卷:docker volume create kibana
  6. 修改配置文件(这里我选择不修改)后通过-v挂载重新启动容器:docker run -d --name kibana --link elasticsearch:elasticsearch -v /home/kibana/config:/usr/share/kibana/config -v kibana:/usr/share/kibana/data -p 5601:5601 -d kibana:7.5.0
(3)logstash,这里职责只做数据的转换和过滤,传输给elasticsearch
  1. 普通run:docker run -d --name logstash --link elasticsearch:elasticsearch -p 5044:5044 -d logstash:7.5.0

  2. 查看日志看是否成功:docker logs -f logstash 。然后ctrl+c退出日志窗口。

  3. 复制配置文件夹:docker cp logstash:/usr/share/logstash/config /home/logstash/config

  4. 停止并删除容器:docker stop logstash-> docker rm logstash或者直接 docker rm -f logstash

  5. 修改配置文件(详细看下面第二章配置文件):

    1. logstash-sample.conf

        input{
          beats{
            port=>5044
          }
        }
        filter{
        	if "java-logs" in [tags] {
        		grok {
        			match => {
        				"message" => "(?>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.\d{3})\s%{DATA:thread}\s%{DATA:level}\s%{DATA:class}\-(?>.*)"
        			}
        			remove_field => ["message"]
        		}
        		if [level] !~ "(DEBUG|ERROR|WARN|INFO)" {
        			drop {}
        		}
            }
        }
        output{	
        	elasticsearch{
        		hosts => ["http://elasticsearch:9200"]
        	}
        	#控制台输出
        	stdout{ }
        }
      
    2. pipeline.yml

        # This file is where you define your pipelines. You can define multiple.
        # For more information on multiple pipelines, see the documentation:
        #   https://www.elastic.co/guide/en/logstash/current/multiple-pipelines.html
        
        - pipeline.id: main
          path.config: "/usr/share/logstash/config/*.conf"
          pipeline.workers: 1
        #  path.config: "/usr/share/logstash/pipeline"
      
  6. 创建数据卷:docker volume create logstash

  7. 通过-v挂载数据卷重新启动容器:docker run -d --name logstash --link elasticsearch:elasticsearch -v /home/logstash/config:/usr/share/logstash/config -v logstash:/usr/share/logstash/data -p 5044:5044 -p 9600:9600 -d logstash:7.5.0

(4)filebeat,这里职责是采集数据传输给logstash,demo放的是log文件 (这里只是演示filebeat的容器化部署,filebeat作为客户端,需要灵活采集数据,linux可以通过rpm安装部署(详细看下面)。)
  1. 普通run:docker run -d --name filebeat --link logstash:logstash -d elastic/filebeat:7.5.0

  2. 查看日志看是否成功:docker logs -f filebeat 。然后ctrl+c退出日志窗口。

  3. 复制配置文件:docker cp filebeat:/usr/share/filebeat/filebeat.yml /home/filebeat/filebeat.yml

  4. 停止并删除容器:docker stop filebeat-> docker rm filebeat或者直接 docker rm -f filebeat

  5. 修改配置文件 filebeat.yml,这是docker安装的

     filebeat.inputs:
    - type: log
      #开启监视,不开不采集
      enable: true
      # 采集日志的路径这里是容器内的path
      paths:  
        - /var/log/demo/*.log
      # 为每个项目标识,或者分组,可区分不同格式的日志
      tags: ["java-logs"]
      # 这个文件记录日志读取的位置,如果容器重启,可以从记录的位置开始取日志
      registry_file: /usr/share/filebeat/data/registry
    
    output.logstash:
      enable: true
      # 输出到logstash中,logstash更换为自己的ip,这里是使用容器名称
      hosts: "logstash:5044"
      max_retries: 3
      worker: 1
      
    #output.console:
      # 输出到console
    #  enabled: true
      #Configure JSON encoding
    #  codec.json:
      #Pretty-print JSON event
    #    pretty: false
    
  6. 创建数据卷:docker volume create filebeat

  7. 通过-v挂载数据卷重新启动容器:docker run -d --name filebeat --link logstash:logstash -v /home/filebeat/log/demo:/var/log/demo -v /home/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml -v filebeat:/usr/share/filebeat/data -d elastic/filebeat:7.5.0

  8. 可能报错:

    1. 如果没有赋予权限,下面启动会报错:Exiting: error loading config file: open filebeat.yml: permission denied
    2. 如果赋予777权限,也会报错:Exiting: error loading config file: config file (“filebeat.yml”) can only be writable by the owner but the permissions are “-rwxrwxrwx” (to fix the permissions use: ‘chmod go-w /usr/share/filebeat/filebeat.yml’)
  9. 解决方法:chmod 755 /home/filebeat/filebeat.yml

  10. 修改后直接启动 docker start filebeat

(5)在linux通过rpm安装filebeat
  1. 下载filebeat-7.5.0-x86_64.rpm。

    1. curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.5.0-x86_64.rpm
      sudo rpm -vi filebeat-7.5.0-x86_64.rpm
      
    2. 由于某些网络原因可能无法通过curl下载,可以先本地下载好再copy到linux。官网下载地址:https://elasticsearch.cn/download/

    3. 这里选择filebeat的7.5.0版本:https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.5.0-x86_64.rpm ,我已经分享到网盘,可以自助下载:链接:https://pan.baidu.com/s/16237ynfY2k-gq2ZxmCzt-Q 提取码:xbm8 。copy到linux后执行以下命令:

      sudo rpm -vi filebeat-7.5.0-x86_64.rpm
      
    4. 查看安装的目录

      cd /etc/filebeat  #配置文件的目录
      cd /usr/share/filebeat  #安装的目录,bin等
      cd /var/lib/filebeat  #数据缓存的目录,registry等
      
  1. 修改配置文件 filebeat.yml,这是rpm安装的

    filebeat.inputs:
    - type: log
      #开启监视,不开不采集
      enable: true
      # 采集日志的路径这里是主机内的path
      paths:  
        - /home/filebeat/log/demo/*.log
      # 为每个项目标识,或者分组,可区分不同格式的日志
      tags: ["java-logs"]
      # 这个文件记录日志读取的位置,如果重启,可以从记录的位置开始取日志
      registry_file: /var/lib/filebeat/registry
    
    output.logstash:
      enable: true
      # 输出到logstash中,logstash更换为自己的ip
      hosts: "192.168.88.80:5044"
      max_retries: 3
      worker: 1
      
    #output.console:
      # 输出到console
    #  enabled: true
      #Configure JSON encoding
    #  codec.json:
      #Pretty-print JSON event
    #    pretty: false
    
  2. 启动 filebeat 。

    启动filebeat
    systemctl start filebeat.service
    查看filebeat状态
    systemctl status filebeat.service
    
(6)成功结果的显示
  1. 查看logstash的日志:docker logs -f logstash 可以看到数据输出到控制台。
    docker搭建elk stack部署(三种形式)_第1张图片

  2. 通过kibana可视化查看elasticsearch的数据,操作步骤在下面第三章。

(7)附录:进入容器命令

docker exec -it elasticsearch bash
docker exec -it kibana bash
docker exec -it logstash bash
docker exec -it filebeat bash

二、核心配置文件

1、elasticsearch.yml,这是单节点。不推荐。
network.host: 0.0.0.0
http.port: 9200
discovery.type: "single-node"
2、elasticsearch.yml,这是多节点配置,不同的节点需要修改小细节。
#集群名称
cluster.name: "es-cluster"
network.host: 0.0.0.0
#节点名称
node.name: elasticsearch01
#是不是有资格主节点
node.master: true
#是否存储数据
node.data: true
#最⼤集群节点数
node.max_local_storage_nodes: 2
# 设置其它结点和该结点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址
# 如果是docker安装节点的IP将会是配置的IP而不是docker网管ip
network.publish_host: 192.168.88.80
#端⼝
http.port: 9200
#内部节点之间沟通端⼝
transport.tcp.port: 9300
#es7.x 之后新增的配置,写⼊候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["192.168.88.80:9300","192.168.88.81:9300"]
#es7.x 之后新增的配置,初始化⼀个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["elasticsearch01", "elasticsearch02"]

# 解决跨域问题
# http.cors.enabled: true
# http.cors.allow-origin: "*"
2、kibana.yml (参考默认的,注意elasticsearch的hosts是否是集群的)
#
# ** THIS IS AN AUTO-GENERATED FILE **
#
# Default Kibana configuration for docker target
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
#elasticsearch.hosts: [ "http://elasticsearch:9200","http://192.168.88.80:9200","http://192.168.88.81:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true
3、logstash.yml (参考默认的,注意elasticsearch的hosts是否是集群的)
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]
#xpack.monitoring.elasticsearch.hosts: [ "http://192.168.88.80:9200","http://192.168.88.81:9200"]

4、pipelines.yml(关键是path.config)
# This file is where you define your pipelines. You can define multiple.
# For more information on multiple pipelines, see the documentation:
#   https://www.elastic.co/guide/en/logstash/current/multiple-pipelines.html

- pipeline.id: main
  path.config: "/usr/share/logstash/config/*.conf"
  pipeline.workers: 1
#  path.config: "/usr/share/logstash/pipeline"

5、logstash-*.conf (配置输入、过滤、输出等信息),其中grok语法需要了解和调试
input{
  beats{
    port=>5044
  }
}
filter{
	if "java-logs" in [tags] {
		grok {
			match => {
				"message" => "(?>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.\d{3})\s%{DATA:thread}\s%{DATA:level}\s%{DATA:class}\-(?>.*)"
			}
			remove_field => ["message"]
		}
		if [level] !~ "(DEBUG|ERROR|WARN|INFO)" {
			drop {}
		}
    }
}
output{
	elasticsearch{
		hosts => ["http://elasticsearch:9200"]
	}
	#控制台输出
	stdout{ }
}

PS: 建议在调试器上逐步匹配测试编写,如果不匹配会导致logstash没有反应,网络上的调试器如下:
- http://grokdebug.herokuapp.com
- http://grokconstructor.appspot.com

ES官方grok调试器:

  • 自ES 6.3版本,原先X-Pack的功能免费开放,其中kibana 6.3版本提供Grok调试器,位于Dev(开发工具)页面中最后一个选项 Grok Debugger(Grok调试器)。
    docker搭建elk stack部署(三种形式)_第2张图片
6、filebeat.yml (docker安装的,参考filebeat.reference.yml)
#filebeat.config:
#  modules:
#    path: ${path.config}/modules.d/*.yml
#    reload.enabled: false
#
#processors:
#- add_cloud_metadata: ~
#- add_docker_metadata: ~
#
#output.elasticsearch:
#  hosts: '${ELASTICSEARCH_HOSTS:elasticsearch:9200}'
#  username: '${ELASTICSEARCH_USERNAME:}'
#  password: '${ELASTICSEARCH_PASSWORD:}'

filebeat.inputs:
- type: log
  #开启监视,不开不采集
  enable: true
  # 采集日志的路径这里是容器内的path
  paths:  
    - /var/log/demo/*.log
  # 日志多行合并采集
  #multiline.pattern: '^\['
  #multiline.negate: true
  #multiline.match: after
  # 为每个项目标识,或者分组,可区分不同格式的日志
  tags: ["java-logs"]
  # 这个文件记录日志读取的位置,如果容器重启,可以从记录的位置开始取日志
  registry_file: /usr/share/filebeat/data/registry

output.logstash:
  enable: true
  # 输出到logstash中,logstash更换为自己的ip
  hosts: "logstash:5044"
  max_retries: 3
  worker: 1
  
#output.console:
  #Boolean flag to enable or disable the output module.
#  enabled: true
  #Configure JSON encoding
#  codec.json:
  #Pretty-print JSON event
#    pretty: false

7、filebeat.yml (rpm安装的,参考filebeat.reference.yml)
filebeat.inputs:
- type: log
  #开启监视,不开不采集
  enable: true
  # 采集日志的路径这里是主机内的path
  paths:  
    - /home/filebeat/log/demo/*.log
  # 为每个项目标识,或者分组,可区分不同格式的日志
  tags: ["java-logs"]
  # 这个文件记录日志读取的位置,如果重启,可以从记录的位置开始取日志
  registry_file: /var/lib/filebeat/registry

output.logstash:
  enable: true
  # 输出到logstash中,logstash更换为自己的ip
  hosts: "192.168.88.80:5044"
  max_retries: 3
  worker: 1
  
#output.console:
  # 输出到console
#  enabled: true
  #Configure JSON encoding
#  codec.json:
  #Pretty-print JSON event
#    pretty: false
8、我收集的log文件格式(项目中生成的)
2019-11-18 10:01:23.899 [restartedMain] INFO  com.mics.datahub.MicsDatahubSystemApplication - Started MicsDatahubSystemApplication in 14.663 seconds (JVM running for 21.768)

9、可能碰到的问题

[1] 因为grok的语法问题不匹配,导致filebeat连接了logstash并且传输数据,可是通过查看logstash的日志(docker logs -f logstash)发现没有反应,也没有报错。

三、kibana查看结果

1、运行kibana(ip:5601)

docker搭建elk stack部署(三种形式)_第3张图片

2、命令查看

docker搭建elk stack部署(三种形式)_第4张图片

3、在management创建索引匹配,在discover查看数据

docker搭建elk stack部署(三种形式)_第5张图片

docker搭建elk stack部署(三种形式)_第6张图片

四、通过docker-compose安装部署

PS:这是单节点,前提是已经copy容器里面的配置文件到宿主机,同时某些目录文件需要权限。如果不使用docker安装filebeat,需要删除对应的部分内容,包括filebeat的volume。

0、离线安装docker-compose(可忽略)
#网盘下载docker-compose:链接: https://pan.baidu.com/s/1xEsqOjn03LuYdxvzxBGtfA 提取码: s7ju
sudo mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose -v
1、docker-compose.yml
version: '3'
services:
  elasticsearch:                    # 服务名称
    image: elasticsearch:7.5.0      # 使用的镜像
    container_name: elasticsearch   # 容器名称
    restart: always                 # 失败自动重启策略
    environment:                                    
      - network.host=0.0.0.0                # 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0,即本机
      - http.port=9200  #端⼝
      - "discovery.type=single-node"  #单节点启动
      - bootstrap.memory_lock=true  # 内存交换的选项,官网建议为true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 设置内存,如内存不足,可以尝试调低点
    ulimits:        # 栈内存的上限
      memlock:
        soft: -1    # 不限制
        hard: -1    # 不限制
    volumes:
      - /home/elasticsearch/es/config:/usr/share/elasticsearch/config  # 将容器中es的配置文件映射到本地
      - es:/usr/share/elasticsearch/data  # 存放数据的文件
      - /etc/localtime:/etc/localtime #时间同步
    ports:
      - 9200:9200    # http端口,可以直接浏览器访问

  kibana:                    # 服务名称
    depends_on:
      - elasticsearch
    image: kibana:7.5.0      # 使用的镜像
    container_name: kibana   # 容器名称
    restart: always                 # 失败自动重启策略
    links:
      - elasticsearch
    environment:                                    
      - server.name= kibana
      - server.host= "0"
      - elasticsearch.hosts= "http://elasticsearch:9200"
      - xpack.monitoring.ui.container.elasticsearch.enabled= true
    volumes:
      - /home/kibana/config:/usr/share/kibana/config  
      - kibana:/usr/share/kibana/data 
      - /etc/localtime:/etc/localtime #时间同步
    ports:
      - 5601:5601    # http端口,可以直接浏览器访问 
  
  logstash:                    # 服务名称
    depends_on:
      - elasticsearch
    links:
      - elasticsearch
    image: logstash:7.5.0      # 使用的镜像
    container_name: logstash   # 容器名称
    restart: always                 # 失败自动重启策略
    environment:                                    
      - http.host= "0.0.0.0"
      - xpack.monitoring.elasticsearch.hosts= "http://elasticsearch:9200"
    volumes:
      - /home/logstash/config:/usr/share/logstash/config
      - logstash:/usr/share/logstash/data 
      - /etc/localtime:/etc/localtime #时间同步
    ports:
      - 5044:5044
      - 9600:9600      
      
  filebeat:                    # 服务名称
    depends_on:
      - logstash
    image: elastic/filebeat:7.5.0     # 使用的镜像
    container_name: filebeat   # 容器名称
    restart: always                 # 失败自动重启策略
    links:
      - logstash
    volumes:
      - /home/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml
      - /home/filebeat/log/demo:/var/log/demo
      - filebeat:/usr/share/filebeat/data 
      - /etc/localtime:/etc/localtime #时间同步
      
volumes:
  es:
    driver: local    # 会生成一个对应的目录和文件
  kibana:
    driver: local    # 会生成一个对应的目录和文件
  logstash:
    driver: local    # 会生成一个对应的目录和文件
  filebeat:
    driver: local    # 会生成一个对应的目录和文件
    
2、启动
docker-compose up -d

第二Part:Docker搭建ELK单机多节点部署笔记(伪集群)

一、准备阶段

1、本Part目标

在一个主机用docker部署一个包含两个elasticsearch容器节点(elasticsearch01、elasticsearch02)的集群,kibana和logstash还是一个容器即可。filebeat可以docker安装,也可以rpm安装,参考上面内容。

2、把需要用到的配置文件目录先在宿主机创建好(主要用于容器挂载),并且copy好配置文件(注意:配置文件夹(config)里面的文件一定要齐全),参考第一Part。
/home/elasticsearch/es01/config
/home/elasticsearch/es02/config
/home/kibana/kibana01/config
/home/logstash/logstash01/config
3、参考上面rpm安装filebeat。

二、核心配置文件

1、elasticsearch.yml,这是elasticsearch01节点。
cluster.name: "es-cluster"
network.host: 0.0.0.0
#节点名称
node.name: elasticsearch01
#是不是有资格主节点
node.master: true
#是否存储数据
node.data: true
#最⼤集群节点数
node.max_local_storage_nodes: 2
# 设置其它结点和该结点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址
# 如果是docker安装节点的IP将会是配置的IP而不是docker网管ip
network.publish_host: 192.168.88.80
#端⼝
http.port: 9201
#内部节点之间沟通端⼝
transport.tcp.port: 9301
#es7.x 之后新增的配置,写⼊候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["192.168.88.80:9301","192.168.88.80:9302"]
#es7.x 之后新增的配置,初始化⼀个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["elasticsearch01", "elasticsearch02"]

# 解决跨域问题
# http.cors.enabled: true
# http.cors.allow-origin: "*"
2、elasticsearch.yml,这是elasticsearch02节点。
cluster.name: "es-cluster"
network.host: 0.0.0.0
#节点名称
node.name: elasticsearch02
#是不是有资格主节点
node.master: true
#是否存储数据
node.data: true
#最⼤集群节点数
node.max_local_storage_nodes: 2
# 设置其它结点和该结点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址
# 如果是docker安装节点的IP将会是配置的IP而不是docker网管ip
network.publish_host: 192.168.88.80
#端⼝
http.port: 9202
#内部节点之间沟通端⼝
transport.tcp.port: 9302
#es7.x 之后新增的配置,写⼊候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["192.168.88.80:9301","192.168.88.80:9302"]
#es7.x 之后新增的配置,初始化⼀个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["elasticsearch01", "elasticsearch02"]

# 解决跨域问题
# http.cors.enabled: true
# http.cors.allow-origin: "*"
3、kibana.yml,这是kibana01节点。(注意elasticsearch是集群)
#
# ** THIS IS AN AUTO-GENERATED FILE **
#

# Default Kibana configuration for docker target
server.name: kibana01
server.host: "0"
# elasticsearch.hosts: [ "http://elasticsearch:9200" ]
elasticsearch.hosts: [ "http://elasticsearch01:9201","http://elasticsearch02:9202" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true
4、logstash.yml,这是logstash01节点。(注意elasticsearch是集群)
http.host: "0.0.0.0"
# xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch01:9201","http://elasticsearch02:9202" ]

5、pipelines.yml(关键是path.config)
# This file is where you define your pipelines. You can define multiple.
# For more information on multiple pipelines, see the documentation:
#   https://www.elastic.co/guide/en/logstash/current/multiple-pipelines.html

- pipeline.id: main
  path.config: "/usr/share/logstash/config/*.conf"
  pipeline.workers: 1
#  path.config: "/usr/share/logstash/pipeline"
6、logstash-*.conf (参考上面的配置)
input{
  beats{
    port=>5044
  }
}
filter{
	if "java-logs" in [tags] {
		grok {
			match => {
				"message" => "(?>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.\d{3})\s%{DATA:thread}\s%{DATA:level}\s%{DATA:class}\-(?>.*)"
			}
			remove_field => ["message"]
		}
		if [level] !~ "(DEBUG|ERROR|WARN|INFO)" {
			drop {}
		}
    }
}
output{	
	elasticsearch{
		hosts => ["http://elasticsearch01:9201","http://elasticsearch02:9202"]
	}
	stdout{ }
}

7、filebeat.yml (rpm安装的,参考filebeat.reference.yml)
filebeat.inputs:
- type: log
  #开启监视,不开不采集
  enable: true
  # 采集日志的路径这里是主机内的path
  paths:  
    - /home/filebeat/log/demo/*.log
  # 为每个项目标识,或者分组,可区分不同格式的日志
  tags: ["java-logs"]
  # 这个文件记录日志读取的位置,如果重启,可以从记录的位置开始取日志
  registry_file: /var/lib/filebeat/registry

output.logstash:
  enable: true
  # 输出到logstash中,logstash更换为自己的ip
  hosts: "192.168.88.80:5044"
  max_retries: 3
  worker: 1
  
#output.console:
  # 输出到console
#  enabled: true
  #Configure JSON encoding
#  codec.json:
  #Pretty-print JSON event
#    pretty: false

三、docker-compose安装部署

1、docker-compose.yml。大体上与上面一样,只是修改小细节,类似ip地址以及名称。
version: '3'
services:
  elasticsearch01:                    # 服务名称
    image: elasticsearch:7.5.0      # 使用的镜像
    container_name: elasticsearch01   # 容器名称
    restart: always                 # 失败自动重启策略
    environment:                                    
      - node.name=elasticsearch01                   # 节点名称,集群模式下每个节点名称唯一
      - network.publish_host=192.168.88.80  # 用于集群内各机器间通信,对外使用,其他机器访问本机器的es服务,一般为本机宿主机IP
      - network.host=0.0.0.0                # 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0,即本机
      - discovery.seed_hosts= 192.168.88.80:9301,192.168.88.80:9302         # es7.0之后新增的写法,写入候选主节点的设备地址,在开启服务后,如果master挂了,哪些可以被投票选为主节点
      - cluster.initial_master_nodes=elasticsearch01,elasticsearch02   # es7.0之后新增的配置,初始化一个新的集群时需要此配置来选举master
      - cluster.name=es-cluster     # 集群名称,相同名称为一个集群, 三个es节点须一致
      - http.port=9201  #端⼝
      - transport.tcp.port=9301 #内部节点之间沟通端⼝
      
      # - http.cors.enabled=true    # 是否支持跨域,是:true // 这里设置不起作用,但是可以将此文件映射到宿主机进行修改,然后重启,解决跨域
      # - http.cors.allow-origin="*" # 表示支持所有域名      // 这里设置不起作用,但是可以将此文件映射到宿主机进行修改,然后重启,解决跨域
      - bootstrap.memory_lock=true  # 内存交换的选项,官网建议为true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 设置内存,如内存不足,可以尝试调低点
    ulimits:        # 栈内存的上限
      memlock:
        soft: -1    # 不限制
        hard: -1    # 不限制
    volumes:
      - /home/elasticsearch/es01/config:/usr/share/elasticsearch/config  # 将容器中es的配置文件映射到本地
      - es01:/usr/share/elasticsearch/data  # 存放数据的文件
      - /etc/localtime:/etc/localtime #时间同步
    ports:
      - 9201:9201    # http端口,可以直接浏览器访问
      - 9301:9301    # es集群之间相互访问的端口,jar之间就是通过此端口进行tcp协议通信,遵循tcp协议。
      
  elasticsearch02:                    # 服务名称
    image: elasticsearch:7.5.0      # 使用的镜像
    container_name: elasticsearch02   # 容器名称
    restart: always                 # 失败自动重启策略
    environment:                                    
      - node.name=elasticsearch02                   # 节点名称,集群模式下每个节点名称唯一
      - network.publish_host=192.168.88.80  # 用于集群内各机器间通信,对外使用,其他机器访问本机器的es服务,一般为本机宿主机IP
      - network.host=0.0.0.0                # 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0,即本机
      - discovery.seed_hosts=192.168.88.80:9301,192.168.88.80:9302        # es7.0之后新增的写法,写入候选主节点的设备地址,在开启服务后,如果master挂了,哪些可以被投票选为主节点
      - cluster.initial_master_nodes=elasticsearch01,elasticsearch02   # es7.0之后新增的配置,初始化一个新的集群时需要此配置来选举master
      - cluster.name=es-cluster     # 集群名称,相同名称为一个集群, 三个es节点须一致
      - http.port=9202  #端⼝
      - transport.tcp.port=9302 #内部节点之间沟通端⼝
      
      # - http.cors.enabled=true    # 是否支持跨域,是:true // 这里设置不起作用,但是可以将此文件映射到宿主机进行修改,然后重启,解决跨域
      # - http.cors.allow-origin="*" # 表示支持所有域名      // 这里设置不起作用,但是可以将此文件映射到宿主机进行修改,然后重启,解决跨域
      - bootstrap.memory_lock=true  # 内存交换的选项,官网建议为true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 设置内存,如内存不足,可以尝试调低点
    ulimits:        # 栈内存的上限
      memlock:
        soft: -1    # 不限制
        hard: -1    # 不限制
    volumes:
      - /home/elasticsearch/es02/config:/usr/share/elasticsearch/config  # 将容器中es的配置文件映射到本地
      - es02:/usr/share/elasticsearch/data  # 存放数据的文件
      - /etc/localtime:/etc/localtime #时间同步
    ports:
      - 9202:9202    # http端口,可以直接浏览器访问
      - 9302:9302    # es集群之间相互访问的端口,jar之间就是通过此端口进行tcp协议通信,遵循tcp协议。

  kibana01:                    # 服务名称
    depends_on:
      - elasticsearch01
      - elasticsearch02
    image: kibana:7.5.0      # 使用的镜像
    container_name: kibana01   # 容器名称
    restart: always                 # 失败自动重启策略
    links:
      - elasticsearch01
      - elasticsearch02
    environment:                                    
      - server.name= kibana01
      - server.host= "0"
      - elasticsearch.hosts= "http://elasticsearch01:9201","http://elasticsearch02:9202"
      - xpack.monitoring.ui.container.elasticsearch.enabled= true
    volumes:
      - /home/kibana/kibana01/config:/usr/share/kibana/config  
      - kibana01:/usr/share/kibana/data 
      - /etc/localtime:/etc/localtime #时间同步
    ports:
      - 5601:5601    # http端口,可以直接浏览器访问 
  
  logstash01:                    # 服务名称
    depends_on:
      - elasticsearch01
      - elasticsearch02
    links:
      - elasticsearch01
      - elasticsearch02 
    image: logstash:7.5.0      # 使用的镜像
    container_name: logstash01   # 容器名称
    restart: always                 # 失败自动重启策略
    environment:                                    
      - http.host= "0.0.0.0"
      - xpack.monitoring.elasticsearch.hosts= "http://elasticsearch01:9201","http://elasticsearch02:9202"
    volumes:
      - /home/logstash/logstash01/config:/usr/share/logstash/config
      - logstash01:/usr/share/logstash/data 
      - /etc/localtime:/etc/localtime #时间同步
    ports:
      - 5044:5044
      - 9600:9600      
      
volumes:
  es01:
    driver: local    # 会生成一个对应的目录和文件
  es02:
    driver: local    # 会生成一个对应的目录和文件
  kibana01:
    driver: local    # 会生成一个对应的目录和文件
  logstash01:
    driver: local    # 会生成一个对应的目录和文件
    

第三Part:Docker搭建ELK多机多节点部署笔记

一、准备阶段

1、本Part目标

在两个主机(192.168.88.80、192.168.88.81)用docker部署ELK。其中一个主机包含一个elasticsearch、kibana和logstash。filebeat只需要在一台主机安装,可以docker安装,也可以rpm安装,参考上面内容。

2、把需要用到的配置文件目录先在两台宿主机创建好(主要用于容器挂载),并且copy好配置文件(注意:配置文件夹(config)里面的文件一定要齐全),参考第一Part。
/home/elasticsearch/elasticsearch/config
/home/kibana/kibana/config
/home/logstash/logstash/config
3、参考上面rpm安装filebeat,只需要安装一个。
4、集群说明

filebeat收集的数据会通过logstash过滤、转换到elasticsearch集群。

二、核心配置文件

1、elasticsearch.yml,这是192.168.88.80节点。
cluster.name: "es-cluster"
network.host: 0.0.0.0
#节点名称
node.name: elasticsearch01
#是不是有资格主节点
node.master: true
#是否存储数据
node.data: true
#最⼤集群节点数
node.max_local_storage_nodes: 2
# 设置其它结点和该结点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址
# 如果是docker安装节点的IP将会是配置的IP而不是docker网管ip
network.publish_host: 192.168.88.80
#端⼝
http.port: 9200
#内部节点之间沟通端⼝
transport.tcp.port: 9300
#es7.x 之后新增的配置,写⼊候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["192.168.88.80:9300","192.168.88.81:9300"]
#es7.x 之后新增的配置,初始化⼀个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["elasticsearch01", "elasticsearch02"]

# 解决跨域问题
# http.cors.enabled: true
# http.cors.allow-origin: "*"
2、elasticsearch.yml,这是192.168.88.81节点。
cluster.name: "es-cluster"
network.host: 0.0.0.0
#节点名称
node.name: elasticsearch02
#是不是有资格主节点
node.master: true
#是否存储数据
node.data: true
#最⼤集群节点数
node.max_local_storage_nodes: 2
# 设置其它结点和该结点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址
# 如果是docker安装节点的IP将会是配置的IP而不是docker网管ip
network.publish_host: 192.168.88.81
#端⼝
http.port: 9200
#内部节点之间沟通端⼝
transport.tcp.port: 9300
#es7.x 之后新增的配置,写⼊候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["192.168.88.80:9300","192.168.88.81:9300"]
#es7.x 之后新增的配置,初始化⼀个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["elasticsearch01", "elasticsearch02"]

# 解决跨域问题
# http.cors.enabled: true
# http.cors.allow-origin: "*"
3、kibana.yml,(所有节点一样)
#
# ** THIS IS AN AUTO-GENERATED FILE **
#

# Default Kibana configuration for docker target
server.name: kibana
server.host: "0"
# elasticsearch.hosts: [ "http://elasticsearch:9200" ]
elasticsearch.hosts: [ "http://192.168.88.80:9200","http://192.168.88.81:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true
4、logstash.yml,(所有节点一样)
http.host: "0.0.0.0"
# xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]
xpack.monitoring.elasticsearch.hosts: [ "http://192.168.88.80:9200","http://192.168.88.81:9200" ]

5、pipelines.yml,(所有节点一样)
# This file is where you define your pipelines. You can define multiple.
# For more information on multiple pipelines, see the documentation:
#   https://www.elastic.co/guide/en/logstash/current/multiple-pipelines.html

- pipeline.id: main
  path.config: "/usr/share/logstash/config/*.conf"
  pipeline.workers: 1
#  path.config: "/usr/share/logstash/pipeline"
6、logstash-*.conf ,(所有节点一样)
input{
  beats{
    port=>5044
  }
}
filter{
	if "java-logs" in [tags] {
		grok {
			match => {
				"message" => "(?>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.\d{3})\s%{DATA:thread}\s%{DATA:level}\s%{DATA:class}\-(?>.*)"
			}
			remove_field => ["message"]
		}
		if [level] !~ "(DEBUG|ERROR|WARN|INFO)" {
			drop {}
		}
    }
}
output{	
	elasticsearch{
		hosts => ["http://192.168.88.80:9200","http://192.168.88.81:9200"]
	}
	stdout{ }
}

7、filebeat.yml (rpm安装的,(只安装一次))
filebeat.inputs:
- type: log
  #开启监视,不开不采集
  enable: true
  # 采集日志的路径这里是主机内的path
  paths:  
    - /home/filebeat/log/demo/*.log
  # 为每个项目标识,或者分组,可区分不同格式的日志
  tags: ["java-logs"]
  # 这个文件记录日志读取的位置,如果重启,可以从记录的位置开始取日志
  registry_file: /var/lib/filebeat/registry

output.logstash:
  enable: true
  # 输出到logstash中,logstash更换为自己的ip
  hosts: ["192.168.88.80:5044","192.168.88.81:5044"]
  max_retries: 3
  worker: 1
  
#output.console:
  # 输出到console
#  enabled: true
  #Configure JSON encoding
#  codec.json:
  #Pretty-print JSON event
#    pretty: false

三、docker-compose安装部署

两台主机基本上一样,只是修改小细节,类似ip地址以及node名称

1、docker-compose.yml (192.168.88.80)
version: '3'
services:
  elasticsearch:                    # 服务名称
    image: elasticsearch:7.5.0      # 使用的镜像
    container_name: elasticsearch   # 容器名称
    restart: always                 # 失败自动重启策略
    environment:                                    
      - node.name=elasticsearch01                   # 节点名称,集群模式下每个节点名称唯一
      - network.publish_host=192.168.88.80  # 用于集群内各机器间通信,对外使用,其他机器访问本机器的es服务,一般为本机宿主机IP
      - network.host=0.0.0.0                # 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0,即本机
      - discovery.seed_hosts= 192.168.88.80:9300,192.168.88.81:9300         # es7.0之后新增的写法,写入候选主节点的设备地址,在开启服务后,如果master挂了,哪些可以被投票选为主节点
      - cluster.initial_master_nodes=elasticsearch01,elasticsearch02   # es7.0之后新增的配置,初始化一个新的集群时需要此配置来选举master
      - cluster.name=es-cluster     # 集群名称,相同名称为一个集群, 三个es节点须一致
      - http.port=9200  #端⼝
      - transport.tcp.port=9300 #内部节点之间沟通端⼝
      
      # - http.cors.enabled=true    # 是否支持跨域,是:true // 这里设置不起作用,但是可以将此文件映射到宿主机进行修改,然后重启,解决跨域
      # - http.cors.allow-origin="*" # 表示支持所有域名      // 这里设置不起作用,但是可以将此文件映射到宿主机进行修改,然后重启,解决跨域
      - bootstrap.memory_lock=true  # 内存交换的选项,官网建议为true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 设置内存,如内存不足,可以尝试调低点
    ulimits:        # 栈内存的上限
      memlock:
        soft: -1    # 不限制
        hard: -1    # 不限制
    volumes:
      - /home/elasticsearch/elasticsearch/config:/usr/share/elasticsearch/config  # 将容器中es的配置文件映射到本地
      - elasticsearch:/usr/share/elasticsearch/data  # 存放数据的文件
      - /etc/localtime:/etc/localtime #时间同步
    ports:
      - 9200:9200    # http端口,可以直接浏览器访问
      - 9300:9300    # es集群之间相互访问的端口,jar之间就是通过此端口进行tcp协议通信,遵循tcp协议。

  kibana:                    # 服务名称
    depends_on:
      - elasticsearch
    image: kibana:7.5.0      # 使用的镜像
    container_name: kibana   # 容器名称
    restart: always                 # 失败自动重启策略
    links:
      - elasticsearch
    environment:                                    
      - server.name= kibana
      - server.host= "0"
      - elasticsearch.hosts= "http://192.168.88.80:9200","http://192.168.88.81:9200"
      - xpack.monitoring.ui.container.elasticsearch.enabled= true
    volumes:
      - /home/kibana/kibana/config:/usr/share/kibana/config  
      - kibana:/usr/share/kibana/data 
      - /etc/localtime:/etc/localtime #时间同步
    ports:
      - 5601:5601    # http端口,可以直接浏览器访问 
  
  logstash:                    # 服务名称
    depends_on:
      - elasticsearch
    links:
      - elasticsearch
    image: logstash:7.5.0      # 使用的镜像
    container_name: logstash   # 容器名称
    restart: always                 # 失败自动重启策略
    environment:                                    
      - http.host= "0.0.0.0"
      - xpack.monitoring.elasticsearch.hosts= "http://192.168.88.80:9200","http://192.168.88.81:9200"
    volumes:
      - /home/logstash/logstash/config:/usr/share/logstash/config
      - logstash:/usr/share/logstash/data 
      - /etc/localtime:/etc/localtime #时间同步
    ports:
      - 5044:5044
      - 9600:9600      
      
      
volumes:
  elasticsearch:
    driver: local    # 会生成一个对应的目录和文件
  kibana:
    driver: local    # 会生成一个对应的目录和文件
  logstash:
    driver: local    # 会生成一个对应的目录和文件
    
2、docker-compose.yml (192.168.88.81)
version: '3'
services:
  elasticsearch:                    # 服务名称
    image: elasticsearch:7.5.0      # 使用的镜像
    container_name: elasticsearch   # 容器名称
    restart: always                 # 失败自动重启策略
    environment:                                    
      - node.name=elasticsearch02                   # 节点名称,集群模式下每个节点名称唯一
      - network.publish_host=192.168.88.81  # 用于集群内各机器间通信,对外使用,其他机器访问本机器的es服务,一般为本机宿主机IP
      - network.host=0.0.0.0                # 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0,即本机
      - discovery.seed_hosts= 192.168.88.80:9300,192.168.88.81:9300         # es7.0之后新增的写法,写入候选主节点的设备地址,在开启服务后,如果master挂了,哪些可以被投票选为主节点
      - cluster.initial_master_nodes=elasticsearch01,elasticsearch02   # es7.0之后新增的配置,初始化一个新的集群时需要此配置来选举master
      - cluster.name=es-cluster     # 集群名称,相同名称为一个集群, 三个es节点须一致
      - http.port=9200  #端⼝
      - transport.tcp.port=9300 #内部节点之间沟通端⼝
      
      # - http.cors.enabled=true    # 是否支持跨域,是:true // 这里设置不起作用,但是可以将此文件映射到宿主机进行修改,然后重启,解决跨域
      # - http.cors.allow-origin="*" # 表示支持所有域名      // 这里设置不起作用,但是可以将此文件映射到宿主机进行修改,然后重启,解决跨域
      - bootstrap.memory_lock=true  # 内存交换的选项,官网建议为true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 设置内存,如内存不足,可以尝试调低点
    ulimits:        # 栈内存的上限
      memlock:
        soft: -1    # 不限制
        hard: -1    # 不限制
    volumes:
      - /home/elasticsearch/elasticsearch/config:/usr/share/elasticsearch/config  # 将容器中es的配置文件映射到本地
      - elasticsearch:/usr/share/elasticsearch/data  # 存放数据的文件
      - /etc/localtime:/etc/localtime #时间同步
    ports:
      - 9200:9200    # http端口,可以直接浏览器访问
      - 9300:9300    # es集群之间相互访问的端口,jar之间就是通过此端口进行tcp协议通信,遵循tcp协议。

  kibana:                    # 服务名称
    depends_on:
      - elasticsearch
    image: kibana:7.5.0      # 使用的镜像
    container_name: kibana   # 容器名称
    restart: always                 # 失败自动重启策略
    links:
      - elasticsearch
    environment:                                    
      - server.name= kibana
      - server.host= "0"
      - elasticsearch.hosts= "http://192.168.88.80:9200","http://192.168.88.81:9200"
      - xpack.monitoring.ui.container.elasticsearch.enabled= true
    volumes:
      - /home/kibana/kibana/config:/usr/share/kibana/config  
      - kibana:/usr/share/kibana/data 
      - /etc/localtime:/etc/localtime #时间同步
    ports:
      - 5601:5601    # http端口,可以直接浏览器访问 
  
  logstash:                    # 服务名称
    depends_on:
      - elasticsearch
    links:
      - elasticsearch
    image: logstash:7.5.0      # 使用的镜像
    container_name: logstash   # 容器名称
    restart: always                 # 失败自动重启策略
    environment:                                    
      - http.host= "0.0.0.0"
      - xpack.monitoring.elasticsearch.hosts= "http://192.168.88.80:9200","http://192.168.88.81:9200"
    volumes:
      - /home/logstash/logstash/config:/usr/share/logstash/config
      - logstash:/usr/share/logstash/data 
      - /etc/localtime:/etc/localtime #时间同步
    ports:
      - 5044:5044
      - 9600:9600      
      
      
volumes:
  elasticsearch:
    driver: local    # 会生成一个对应的目录和文件
  kibana:
    driver: local    # 会生成一个对应的目录和文件
  logstash:
    driver: local    # 会生成一个对应的目录和文件
    

你可能感兴趣的:(ELK,Stack)