• docker安装ELK详细步骤(冒着被老板开的风险,生产试验,适用所有版本)


    在这里插入图片描述

    该文档适用所有版本的安装

    前言

    公司新项目是DDD+微服务架构,部署采用Kubesphere,用过的小伙伴都知道,这日志真™用着难受。因此,公司要求集成elk,进行日志的统一管理~

    生产环境:前端采用nginx进行的部署,后端则是通过kubesphere的一键式部署。

    再此,就记录一下ELK搭建过程,分享给小伙伴们,避免时间的浪费

    简介

    ELK主要由ElasticSearchLogstashKibana三个开源软件组成。

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

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

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

    安装ELK

    版本说明:Elasticsearch、Logstash、Kibana、Filebeat安装的版本号必须全部⼀致,不然会出现kibana⽆法显示web⻚⾯。

    Elasticsearch与JDK版本要求:https://www.elastic.co/cn/support/matrix#matrix_jvm

    镜像版本:https://hub.docker.com/_/elasticsearch

    哪个版本?直接最新,反正领导发话了,我丝毫不慌。问题来了,那是生产环境,如果真出问题了,我小命还有不,算了不管了

    温馨提示:如果操作系统版本不是很新不要安装最新版本docker,⽐如我centos7安装docker最新版,后⾯出现 linux 与 docker 版本的兼容性问题,报错”container init exited prematurely“,卸载docker安装较早版本即可。

    安前须知之直接部署

    • 不能使用root用户登录,需要是用root 之外的用户登录到系统。
    • Linux 的内核必须3.0 以上。
    • elasticsearch 、 logstash 、kibana 版本号必须统一 ~ Linux安装JDK并配置环境变量
    • centos系统 运行内存不能小于2G,若低于2G需要修改jvm。

    vi {jvm_home}/config/jvm.options

    -Xms512m

    -xmx512m

    安前须知之docker方式部署

    • 问题排查以及解决方法
    #获取该docker容器的CONTAINER ID 或者 NAMES
    docker logs CONTAINER ID/NAMES
    
    • 1
    • 2

    ❀ 看日志排查问题,如果docker是前段界面,正常的话是不会有日志的,但是如果一直 Restarting 会有详细报错的日志 ,后台日志也都有日志可以查看.

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

    ERROR: [1] bootstrap checks failed
    [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

    image-20220726184701425

    顾名思义,es最⼤虚拟内存⾄少262144

    # (需要是root账户)
    vim /etc/sysctl.conf
    #⽂件最后添加⼀⾏: vm.max_map_count=262144
    sysctl -p 重启⽣效
    
    • 1
    • 2
    • 3
    • 4

    ❀ 需要在启动elasticsearch之前执行

    • latest ≠ 最新版

    下图是我下的latest版,因为公认latest就是最新版。当时一下子就启起来了,兴奋不已,一看我去这版本什么鬼,脸都黑了…

    image-20220726174759219

    ❀ latest不一定是最新版,建议指定版本拉取

    • Could not create the Java Virtual Machine

    image-20220726195021465

    问题排查思路,问题是JVM不能正常创建,但我们要查的是导致不能创建的原因。

    …截图小了,就是上面一行,排查出问题是logs读写权限。

    #logs目录赋予权限
    chmod 777 /data/elk/es/logs
    
    • 1
    • 2

    ❀ 命令是chmod而不是chown。chmod是赋予读写权限,而chown是用户权限

    • error downloading geoip database [GeoLite2-ASN.mmdb]

    image-20220728085019993

    #elasticsearch.yml
    #关闭geoip数据库的更新
    ingest.geoip.downloader.enabled: false
    
    • 1
    • 2
    • 3
    • FileSystemException: Device or resource busy

    image-20220729104957340

    image-20220729105230816

    ❀ 挂载点泄漏是内核3.10的bug,在后续内核版本得到修复,可以通过升级内核。生产环境,因此只能退一步海阔天空了,8版折磨了我很久,换个7版几下搞定~

    • cannot upgrade a node from version [7.7.1] directly to version [8.3.2], upgrade to version [7.17.0] first.

    image-20220729093222251

    ❀ 顾名思义了,之前安装过7.7.1然后基于原来挂载的文件安装8.3.2,把之前文件删了即可

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

      ❀ ⼀般都是⽬录没权限,给对应⽬录添加权限即可

      chmod 777 xxx

    • FileNotFoundException: /opt/kafka 2. 13-2. 8. 1/bin/,./config/ tools-log4j. properties (No such file or directory)

    QQ图片20220730183800

    ❀ 顾名思义,在指定位置创建指定文件即可

    • 创建topic,kafka连zookeeper出现连接超时

    QQ图片20220730190430

    ❀ 首先查看zk容器是否启动成功docker logs zk,其次查看IP是对应上,再者查看命令是否有问题

    ./bin/kafka-topics.sh --create --zookeeper 10.175.127.155:2181 --partitions 1 --replication-factor 1 --topic cloud-log

    或者

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

    • 其他未提及的问题,前往留言,小编会及时回复哦~

    ElasticSearch

    ❀ 温馨提示:安装前必须看安前须知,并且安装过程根据步骤来

    1、创建挂载⽬录

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

    2、 创建挂载es配置

    vi /data/elk/es/config/elasticsearch.yml
    -----------------------配置内容----------------------------------
    cluster.name: "my-es"
    network.host: 0.0.0.0
    http.port: 9200
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3**、赋予权限**

    chmod 777 /data/elk
    chmod 777 /data/elk/es
    chmod 777 /data/elk/es/config
    chmod 777 /data/elk/es/data
    chmod 777 /data/elk/es/logs
    #报错挂载⽬录没权限
    "Caused by: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodes",•
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4**、运⾏**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.17.5
    
    • 1
    • 2

    ❀ 指定好自个需要的版本,并确保镜像仓库存在所指定的版本

    6**、验证安装是否成功**

    image-20220729111648859

    kibana

    1、获取ip

    #获取elasticsearch容器ip
    docker inspect --format '{{ .NetworkSettings.IPAddress }}' es
    
    • 1
    • 2

    image-20220729142229536

    2、新建配置⽂件

    ❀ ⽤于docker⽂件映射

    温馨提示:不存在⽬录需对应新增

    #创建kibana.yml
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3、运⾏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.17.5
    
    • 1

    4、访问

    浏览器上输⼊:http://ip:5601

    image-20220729143345743

    logstash

    1、编辑logstash.yml配置⽂件

    #IP为es-docker内⽹ip地址
    vi /data/elk/logstash/logstash.yml
    -----------------------------------------------------------------
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2、编辑logstash.conf⽂件

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

    #IP该服务器的ip
    vi /data/elk/logstash/conf.d/syslog.conf
    --------------------------------------------------------------------
    input {
     syslog {
     type => "system-syslog"
     port => 5044
     }
    }
    output {
     elasticsearch {
     hosts => ["IP:9200"] # 定义es服务器的ip
     index => "system-syslog-%{+YYYY.MM}" # 定义索引
     }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3、编辑本地rsyslog

    #IP该服务器的ip
    vi /etc/rsyslog.conf
    ---------------------------------------------------------------------
    *.* @@IP:5044
    
    • 1
    • 2
    • 3
    • 4

    4、配置修改后重启服务

    systemctl restart rsyslog
    
    • 1

    5、运⾏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/ --privileged=true logstash:7.17.5
    
    • 1

    6、测试es接收logstash数据

    [root@Server-148a8793-5c2b-466f-9c0e-8da870ed6105 ~]# curl http://localhost:9200/_cat/indices?v
    health status index                           uuid                   pri rep docs.count docs.deleted store.size pri.store.size
    green  open   .geoip_databases                VF7a6tzVSYOaEBXKeblVbg   1   0         40            0     37.6mb         37.6mb
    green  open   .kibana_7.17.5_001              DRcdoBqdRQmkoSajuGGiXg   1   0         19           30      2.3mb          2.3mb
    green  open   .apm-custom-link                zxQpJVrXQmmSQrzZ_gP2_g   1   0          0            0       226b           226b
    green  open   .apm-agent-configuration        iia52tRnS-aDLFOjWLj97A   1   0          0            0       226b           226b
    green  open   .kibana_task_manager_7.17.5_001 6DY-ncFMTr-QweAjaFpSGA   1   0         17         1314    240.8kb        240.8kb
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    image-20220729145624270

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

    安装kafka

    ❀ 温馨提示:

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

    ⼀般都是⽬录没权限,给对应⽬录添加权限即可

    chmod 777 xxx

    1、启动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 wurstmeister/zookeeper
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、启动kafka容器

    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 wurstmeister/zookeeper
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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)

    3、测试kafka

    #进⼊kafka容器的命令⾏
    docker exec -it kafka /bin/bash
    #进⼊kafka所在⽬录
    cd /opt/kafka_2.13-2.8.1/
    #没有找到就⽤这个命令搜索
    find / -name kafka-topics.sh
    #创建topic
    ./bin/kafka-topics.sh --create --zookeeper 10.175.127.155:2181 --partitions 1 --replication-factor 1 --topic cloud-log
    #发送消息
    ./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic cloud-log
    #接收消息
    ./bin/kafka-console-consumer.sh --zookeeper localhost:9092 --topic cloud-log --from-beginning
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    ❀ 由于上⾯并未和kafka产⽣关联,所以修改logstash安装⽬录下的配置⽂件

    vi /data/elk/logstash/conf.d/syslog.conf

    input {
     #获取kafka信息
     kafka {
     #⾃定义话题
     topics_pattern => "cloud-log"
     #kafka ip+端⼝
     bootstrap_servers => "10.175.127.155: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.175.127.155:9200"]
     index => "%{[@metadata][kafka][topic]}-%{+YYYY-MM-dd}"
     }
     #本地⽣产⽂件⽇志(⽬录⾃⾏创建)
     file {
     path => "/home/logs/%{+yyyy-MM-dd-HH}.log"
     }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    ❀ 修改完之后重新启动elk

    image-20220730184726955

    大功告成!!!

  • 相关阅读:
    springboot毕设项目超市收银与会员管理系统6l826(java+VUE+Mybatis+Maven+Mysql)
    如何提升量化投研效率?来自辰钰投资的案例分享
    基于JavaWeb的疫情期间社区出入管理系统设计与实现
    一个关于proto 文件的经验分享 :gRPC 跨语言双端通信显示错误码:12 UNIMPLEMENTED (附赠gRPC错误码表)
    HTML5期末考核大作业——学生网页设计作业源码HTML+CSS+JavaScript 中华美德6页面带音乐文化
    windows打包uniapp应用p12证书和证书profile文件的制作方法
    Linux系统100条命令:关于Ubuntu和 CentOS 7 相同功能的不同的终端操作命令
    FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法(3)
    kafka消费/发送消息,消息过大报错解决whose size is larger than the fetch size 1048576
    神经网络的三种训练方法,神经网络训练速度
  • 原文地址:https://blog.csdn.net/Sunshine_Mr_Sun/article/details/126076588