Elastic Stack
写在前面:最近在linux搞完elk之后,考虑到以后的可移植性和可操作性,决定改用使用docker容器重新再搞一遍。elasticsearch+elasticsearch-head-logstash+filebeat。
一、了解docker
1、什么是docker
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
2、为什么使用docker
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
2.1、快速,一致地交付您的应用程序
Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
①您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
②他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
③当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
④测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
2.2、响应式部署和扩展
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
2.3、在同一硬件上运行更多工作负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
二、安装ELK
安装前再次理解一下。
elasticsearch:是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Logstash :主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
Filebeat:搜集文件数据
elasticsearch-head:一个插件,相当于简化版的kibana,具有展示并检索elasticsearch中内容的功能。
本次的安装框架如下
1、Elasticsearch
1.1、拉取镜像
①在docker容器库中,搜索elasticsearch,https://hub.docker.com/
②点击下面搜索到的elasticsearch
③点击最新的版本
④拉取镜像
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.14.0
docker.elastic.co/elasticsearch 表示官方地址的镜像,有些地址镜像拉取失败
⑤查看镜像
docker images
1.2、安装
①安装
docker run -d --name es -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” docker.elastic.co/elasticsearch/elasticsearch:7.14.0
*-d 后台应用,如果不加,开启后一会儿然后自动关闭
1、docker容器运行必须有一个前台进程, 如果没有前台进程执行,容器认为空闲,就会自行退出
2、容器运行的命令如果不是那些一直挂起的命令( 运行top,tail、循环等),就是会自动退出
3、这个是 docker 的机制问题②查看容器状态
选项 选项简写 说明
–detach -d 在后台运行容器,并且打印容器id。
–interactive -i 即使没有连接,也要保持标准输入保持打开状态,一般与 -t 连用。
–tty -t 分配一个伪tty,一般与 -i 连用。
docker ps
③检测是否启动成功
curl 127.0.0.1:9200
1.3、修改配置文件
①进入容器
docker exec -it es /bin/bash
或docker exec -it e5ccbd6f1f75 /bin/bash
②复制配置文件到本地
docker cp es:/usr/share/elasticsearch/config /usr/local/docker/elasticsearch/
③修改本地/usr/local/docker/elasticsearch/elasticsearch.yml配置文件
cluster.name: “docker-cluster”
network.host: 0.0.0.0
node.master: true
node.name: node-1
network.publish_host: 192.168.87.142
discovery.seed_hosts: [“127.0.0.1:9300”]
http.cors.enabled: true
http.cors.allow-origin: “*”
④删除并重新建容器
docker run -it -d --name es -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” -v /usr/local/docker/elasticsearch/config:/usr/share/elasticsearch/config docker.elastic.co/elasticsearch/elasticsearch:7.14.0
⑤日志查看(排错必备)
#elasticsearch运行也需要一些时间,日志会持续打印
docker logs -f --tail=30 es
2、Elasticsearch-Head
2.1、拉取镜像
①在docker容器库中,搜索elasticsearch-head,https://hub.docker.com/
②点击下面搜索到的elasticsearch-head
③Overview是空的,点tags
④拉取镜像
docker pull mobz/elasticsearch-head:5(再往下拉会出现5)
⑤查看镜像
docker images
2.2、安装
①安装
docker run -d --name es_head -p 9100:9100 mobz/elasticsearch-head:5
(安装后面那个错误是由于1.4的配置没有完成导致的)
②查看是否运行
docker ps
curl 127.0.0.1:9100
3、Logstash
3.1、拉取镜像
①在docker容器库中,搜索logstash,https://hub.docker.com/
②点击下面搜索到的logstash
③点击最新的版本(要与elasticsearch版本一致)
④拉取镜像
docker pull docker.elastic.co/logstash/logstash:7.14.0
⑤查看镜像
docker images
3.2、安装
①创建容器
docker run -d --name es_logstash -p 5044:5044 docker.elastic.co/logstash/logstash:7.14.0②在工作目录建立一个 docker 目录 并在里面创建了 logstash 目录,用来存放所有配置
mkdir -p /usr/local/docker/logstash③将容器中的配置文件复制到宿主机
docker cp es_logstash:/usr/share/logstash/config /usr/local/docker/logstash/
docker cp es_logstash:/usr/share/logstash/pipeline /usr/local/docker/logstash/④修改/pipeline/logstash.conf文件
input {
file {
path => “/logs/11.log”
codec => “json”
type => “elasticsearch”
start_position => “beginning”
}
}filter{
}output {
stdout {
codec => rubydebug
}
elasticsearch{
hosts => [“192.168.87.142:9200”]
index => “es-%{+YYYY.MM.dd}”
}
}⑤重新创建容器,并挂载上面两个文件夹
停止原有容器,否则无法删除
docker stop d7405af81c00
删除原有容器,使用容器ID删除
docker rm d7405af81c00
创建新容器并挂载目录
docker run -it -d -p 5044:5044 --name es_logstash -v /usr/local/docker/logstash/config:/usr/share/logstash/config -v /usr/local/docker/logstash/pipeline:/usr/share/logstash/pipeline -v /usr/local/docker/log:/logs docker.elastic.co/logstash/logstash:7.14.0⑥日志查看(排错必备)
logstash运行也需要一些时间,日志会持续打印
docker logs -f --tail=30 es_logstash
4、Filebeat
4.1、拉取镜像
①在docker容器库中,搜索filebeat,https://hub.docker.com/
②点击下面搜索到的filebeat
③点击安装说明
④拉取镜像
docker pull store/elastic/filebeat:7.14.0
⑤查看镜像
docker images
4.2、安装
①修改logstash的配置文件并重启
input {
beats {
port => “5044”
}
}
filter{
}
output {
stdout {
codec => rubydebug
}
elasticsearch{
hosts => [“192.168.87.142:9200”]
index => “es-%{+YYYY.MM.dd}”
}
}docker run -it -d -p 5044:5044 --name es_logstash_filebeat -v /usr/local/docker/logstash/config:/usr/share/logstash/config -v /usr/local/docker/logstash/pipeline-filebeat:/usr/share/logstash/pipeline docker.elastic.co/logstash/logstash:7.14.0
②编辑filebeat的配置文件
先运行filebeat
docker run -d --name es_filebeat docker.io/store/elastic/filebeat:7.14.0
然后进入容器并赋值配置文件到本地
docker exec -it es_filebeat /bin/bash
docker cp es_filebeat:/usr/share/filebeat/filebeat.yml /usr/local/docker/filebeat
然后修改本地配置文件:
增加下面的配置 (收集 .log 数据 把数据发送到当前网络5044端口 (logstash 端口) )
这个地方的 .log 要保证有几条测试数据
filebeat.inputs:
• type: log
enabled: true容器内的路径,可以不用修改,映射到这个路径就可以
paths:
• /var/log/nginx/*.log
fields:额外添加的字段
需要排除和包括的行(正则表达式)
exclude_lines: [‘INFO’]
include_lines: [‘ERROR’]
这个是用来处理异常产生多行数据时,将多行数据当作一条日志处理,根据自己的异常日志的格式做修改
multiline.pattern: ‘^[’
multiline.negate: true
multiline.match: after
output.logstash:
hosts: [‘192.168.87.143:5044’]③运行filebeat
请更改下面两个路径
{nginx-path} = 本地的日志文件目录(映射到容器中 作为数据源)
{path} = Filebeat配置文件路径
{ip} = elasticsearch 地址
docker run
–name filebeat
–user=root -d --net somenetwork --volume="{nginx-path}:/var/log/nginx/" --volume="{path}/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro" --volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" --volume="/var/run/docker.sock:/var/run/docker.sock:ro" store/elastic/filebeat:7.1.1docker run --name filebeat -d
-v /usr/local/docker/filebeat/logs/:/var/log/nginx/
-v /usr/local/docker/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
docker.io/store/elastic/filebeat:7.14.0