当前位置: 首页 > 工具软件 > docker-elk > 使用案例 >

安装ELK-docker版

法镜
2023-12-01

1、安装ELK

1)ElasticSearch

ELK简介

ELK主要由ElasticSearch、Logstash和Kibana三个开源工具组成,还有其他专门由于收集数据的轻量型数据采集器Beats。

Elasticsearch:分布式搜索引擎。具有高可伸缩、高可靠、易管理等特点。可以用于全文检索、结构化检索和分析,并能将这三者结合起来
Elasticsearch:
是用Java 基于 Lucene 开发,现在使用最广的开源搜索引擎之一,Wikipedia 、StackOverflow、Github等都基于它来构建自己的搜索引擎。在elasticsearch中,所有节点的数据是均等的。

Logstash :
数据收集处理引擎。支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储以供后续使用。

Kibana :
可视化化平台。它能够搜索、展示存储在 Elasticsearch
中索引数据。使用它可以很方便的用图表、表格、地图展示和分析数据。

版本说明:
Elasticsearch、Logstash、Kibana、Filebeat安装的版本号必须全部一致,不然会出现kibana无法显示web页面。

需要注意的是,如果操作系统版本不是很新不要安装最新版本docker,比如我centos7.2安装docker最新版,后面出现 linux 与 docker 版本的兼容性问题,报错”container init exited prematurely“,卸载docker安装较早版本即可。

离线安装与在线基本相同(离线需要自行打包好镜像)

离线思路:
1、在有网环境下下载镜像
2、通过docker save 打包好镜像,拷入u盘
3、将打包好的镜像上传至离线服务器
4、通过docker load 将打包好的镜像导入docker

1、拉取镜像

docker search elasticsearch
docker pull elasticsearch:7.7.1

2、创建挂载目录

mkdir -p /data/elk/es/{config,data,logs}

3、赋予权限

chmod -R 777 /data/elk/es
chmod -R 777 /data/elk/es/config
chmod -R 777 /data/elk/es/data
chmod -R 777 /data/elk/es/logs
#报错挂载目录没权限
"Caused by: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodes",

4、创建挂载es配置

cd /data/elk/es/config
touch elasticsearch.yml
-----------------------配置内容----------------------------------
cluster.name: "my-es"
network.host: 0.0.0.0
http.port: 9200

5、运行elasticsearch

通过镜像,启动一个容器,并将9200和9300端口映射到本机(elasticsearch的默认端口是9200,我们把宿主环境9200端口映射到Docker容器中的9200端口)。此处建议给容器设置固定ip,我这里没设置。

docker run -it  -d -p 9200:9200 -p 9300:9300 --name es -e ES_JAVA_OPTS="-Xms1g -Xmx1g" -e "discovery.type=single-node" --restart=always -v /data/elk/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /data/elk/es/data:/usr/share/elasticsearch/data -v /data/elk/es/logs:/usr/share/elasticsearch/logs elasticsearch:7.7.1

6、验证安装是否成功

[root@elasticsearch home]# curl http://localhost:9200
{
  "name" : "0adf1765ac08",
  "cluster_name" : "my-es",
  "cluster_uuid" : "MpKqrEKySnSdwux0m7AlEA",
  "version" : {
    "number" : "7.7.1",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ad56dce891c901a492bb1ee393f12dfff473a423",
    "build_date" : "2020-05-28T16:30:01.040088Z",
    "build_snapshot" : false,
    "lucene_version" : "8.5.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

elasticsearch启动时遇到的错误

es最大虚拟内存至少262144

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

1、vim /etc/sysctl.conf (需要是root账户)
文件最后添加一行: vm.max_map_count=262144
2、sysctl -p 重启生效

2)kibana

1、下载镜像

docker pull kibana:7.7.1

2、获取elasticsearch容器ip

[root@elasticsearch home]# docker inspect --format '{{ .NetworkSettings.IPAddress }}' es
172.17.0.2

3、新建配置文件

用于docker文件映射。所使用目录需对应新增。(172.17.0.2改成自己的)

vi /data/elk/kibana/kibana.yml

#Default Kibana configuration for docker target
server.name: kibana
server.host: "0"
elasticsearch.hosts: ["http://172.17.0.2:9200"]
xpack.monitoring.ui.container.elasticsearch.enabled: true

4、运行kibana

docker run -d --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 --name kibana -p 5601:5601 -v /data/elk/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:7.7.1

5、访问

浏览器上输入:http://ip:5601,如无法访问进容器检查配置是否生效

6、检查kibana容器配置文件

将配置文件中elasticsearch.hosts地址修改为elasticsearch容器地址。

docker exec -it kibana /bin/bash

vi config/kibana.yml,修改后的配置如下:
((172.17.0.2改成自己的))

#Default Kibana configuration for docker target
server.name: kibana
server.host: "0"
elasticsearch.hosts: ["http://172.17.0.2:9200"]
xpack.monitoring.ui.container.elasticsearch.enabled: true

重启kibana:docker restart kibana

在kibana6.7之后就开始支持中文了,开启也很简单,只需要在kibana.yml配置文件中添加上如下配置,然后重启kibana即可

i18n.locale: “zh-CN”

3)logstash

1、获取logstash镜像

docker pull logstash:7.7.1

2、编辑logstash.yml配置文件

vi /data/elk/logstash/logstash.yml (es-docker内网地址)
(172.17.0.2改成自己的)

http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://172.17.0.2:9200" ]
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: changeme
#path.config: /data/elk/logstash/conf.d/*.conf
path.config: /data/docker/logstash/conf.d/*.conf
path.logs: /var/log/logstash

3、编辑logstash.conf文件

此处先配置logstash直接采集本地数据发送至es

vi /data/elk/logstash/conf.d/syslog.conf (外网地址)
(192.168.200.94改成自己的)

input {
  syslog {
    type => "system-syslog"
    port => 5044
  }
}
output {
  elasticsearch {
    hosts => ["192.168.200.94:9200"]  # 定义es服务器的ip
    index => "system-syslog-%{+YYYY.MM}" # 定义索引
  }
}

4、编辑本地rsyslog配置增加:

(192.168.200.94改成自己的)

vi /etc/rsyslog.conf #增加一行(外网地址)
*.* @@192.168.200.94:5044

5、配置修改后重启服务

systemctl restart rsyslog

6、运行logstash

docker run -d --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 -p 5044:5044 --name logstash -v /data/elk/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml -v /data/elk/logstash/conf.d/:/data/docker/logstash/conf.d/ logstash:7.7.1

7、测试es接收logstash数据

[root@elk logstash]# curl http://localhost:9200/_cat/indices?v
health status index                    uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   .apm-custom-link         WBgbpphkQCS73sfjjIG0-Q   1   0          0            0       208b           208b
green  open   .kibana_task_manager_1   xmBASGi9QheR-r8hG2XLZA   1   0          5            0       28kb           28kb
green  open   .apm-agent-configuration MsvsgveHSCOhBQRCgTnsRg   1   0          0            0       208b           208b
yellow open   system-syslog-2022.02    1Vcjw7Q-TTqVscpknyK7HA   1   1          6            0     20.7kb         20.7kb
green  open   .kibana_1                vJ-B5wakRSmOrwM6ri-xgw   1   0         84            2      115kb          115kb

获取到system-syslog-相关日志,则es已能获取来自logstash的数据,kibana中也同步显示数据。

三、安装kafka

注意:

出现/docker-entrypoint.sh: line 43: /conf/zoo.cfg: Permission denied

一般都是目录没权限,给对应目录添加权限即可

chmod 777 xxx

1、启动zookeeper容器

docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper

docker run -d -p 2181:2181 -p 2888:2888 -p 3888:3888 --privileged=true \
--restart=always --name=zkNode-1 \
-v /data/elk/zookeeper/conf:/conf \
-v /data/elk/zookeeper/data:/data \
-v /data/elk/zookeeper/datalog:/datalog zookeeper:latest

2、启动kafka容器

#修改自己的zookeeper主机地址
docker run  -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.179.168:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.179.168:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -e ALLOW_PLAINTEXT_LISTENER=yes -t wurstmeister/kafka 

#docker 启动参数说明: -d:后台启动,--restart=always:如果挂了总是会重启,--name:设置容器名
#-p: 设置宿主机与容器之间的端口映射,例如:9902:9092,表示将容器中9092端口映射到宿主机的9902端口,当有请求访问宿主机的9902端口时,会被转发到容器内部的9092端口.
#-v:设置宿主机与容器之间的路径或文件映射,例如:/home/kafka/logs:/opt/kafka/logs,表示将容器内部的路径/opt/kafka/logs目录映射到宿主机的/home/kafka/logs目录,可以方便的从宿主机/home/kafka/logs/就能访问到容器内的目录,一般数据文件夹,配置文件均可如此配置,便于管理和数据持久化
#-e 设置环境变量参数,例如-e KAFKA_BROKER_ID=1,表示将该环境变量设置到容器的环境变量中,容器在启动时会读取该环境变量,并替换掉容器中配置文件的对应默认配置(server.properties文件中的 broker.id=1)
# kafka:latest 表示使用docker镜像名称为kafka,并且版本为latest的镜像来启动
docker run -d --restart=always --name kafka \
-p 9092:9092 \
-v /data/elk/kafka/logs:/opt/kafka/logs \
-v /data/elk/kafka/data:/kafka/kafka-logs \
-v /data/elk/kafka/conf:/opt/kafka/config \
-e KAFKA_BROKER_ID=1 \
-e KAFKA_LOG_DIRS="/kafka/kafka-logs" \
-e KAFKA_ZOOKEEPER_CONNECT=10.84.77.10:2181 \
-e KAFKA_DEFAULT_REPLICATION_FACTOR=1 \
-e KAFKA_LOG_RETENTION_HOURS=72 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://10.84.77.10:9092 \
-e ALLOW_PLAINTEXT_LISTENER=yes \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t kafka:latest

3、测试kafka

进入kafka容器的命令行

docker exec -ti kafka /bin/bash

进入kafka所在目录

cd opt/kafka_2.13-2.8.1/
#没有找到就用这个命令搜索
find / -name kafka-topics.sh

创建topic

./bin/kafka-topics.sh --create --bootstrap-server 10.84.77.10:2181 --partitions 1 --replication-factor 1 --topic cloud-log

查看topic list

bin/kafka-topics.sh --zookeeper 10.84.77.10:2181 --list

发送消息

./bin/kafka-console-producer.sh --broker-list 10.84.77.10:9092 --topic cloud-log

接收消息

./bin/kafka-console-consumer.sh --bootstrap-server 10.84.77.10:9092 --topic cloud-log --from-beginning

由于上面并未和kafka产生关联,所以修改logstash安装目录下的配置文件logstash/confg/conf.d/syslog.conf

input {
  #获取kafka信息
  kafka {
  		#自定义话题
        topics_pattern  => "cloud-log"
        #kafka ip+端口
        bootstrap_servers => "10.84.77.10:9092"
        auto_offset_reset => "earliest"
        consumer_threads => 5
        decorate_events => "true"
  }
}
#文本格式过滤
filter {
    date {
      timezone => "Asia/Shanghai"
      match => ["logtime", "yyyy-MM-dd HH:mm:ss,SSS"]
      target => "@timestamp"
      remove_field => [ "logtime" ]
    }
}

output {
  #输出至es
  elasticsearch {
    hosts => ["http://10.84.77.10:9200"]
    index => "%{[@metadata][kafka][topic]}-%{+YYYY-MM-dd}"
  }
  #本地生产文件日志(目录自行创建)
  file {
        path => "/home/logs/%{+yyyy-MM-dd-HH}.log"
   }
}

修改完之后重新启动docker-elk

 类似资料: