docker-compose部署elk并设置账户密码

发布时间 2023-03-25 20:43:01作者: 白码一号

docker-compose部署elk并设置账户密码系列

最近因为在搭建微服务环境所以要用到elk首先介绍一下什么是elk,以及负责的功能模块(部署的过程比较坎坷我尽量把遇到的坑,以及如何排查问题的方式顺便介绍一下)

ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称(但是后期出现的filebeat(beats中的一种)可以用来替代logstash的数据收集功能,比较轻量级)。市面上也被成为Elastic Stack。

  • Filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或 Logstash进行索引。Filebeat的工作方式如下:启动Filebeat时,它将启动一个或多个输入,这些输入将在为日志数据指定的位置中查找。对于Filebeat所找到的每个日志,Filebeat都会启动收集器。每个收集器都读取单个日志以获取新内容,并将新日志数据发送到libbeat,libbeat将聚集事件,并将聚集的数据发送到为Filebeat配置的输出。
  • Logstash是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。Logstash能够动态地采集、转换和传输数据,不受格式或复杂度的影响。利用Grok从非结构化数据中派生出结构,从IP地址解码出地理坐标,匿名化或排除敏感字段,并简化整体处理过程。
  • Elasticsearch是Elastic Stack核心的分布式搜索和分析引擎,是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。Elasticsearch为所有类型的数据提供近乎实时的搜索和分析。无论您是结构化文本还是非结构化文本,数字数据或地理空间数据,Elasticsearch都能以支持快速搜索的方式有效地对其进行存储和索引。
  • Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示。并且可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以汇总、分析和搜索重要数据日志。还可以让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪表板(dashboard)实时显示Elasticsearch查询动态

接下来看一下架构图,看明白之后更容易理解部署的过程,以及以后可以朝那些方向去做扩展

从架构图上看:

1.kibana是个客户端工具主要跟es进行交互

2.es可以做集群扩展(为了您的es安全,请避免es裸奔——账户密码设置)

3.logsstash主要是用来做日志采集(目前主流的两种方式 1.走通讯协议 2.走消息队列)

4.Filebeat用来监视指定的日志文件或位置,收集日志事件

搭建背景:这里部署采用的es单机没做集群,日志使用的是kafka进行日志收集

接下来先开始部署kafka.yml 

version: '2'
services:
   zookeeper:
     image: wurstmeister/zookeeper
     container_name: intelligentremotepatrol_zookeeper
     restart: always
     ports:
       - "2181:2181"

   # 消息组件
   kafka:
     image: wurstmeister/kafka
     container_name: kafka
     restart: always
     ports:
       - "9092:9092"
     environment:
       KAFKA_ADVERTISED_HOST_NAME: xxx.xx.xx.184
       KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
       KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://xxx.xx.xx.x:9092
       KAFKA_CREATE_TOPICS: "deepstream:1:1"
     volumes:
       - /var/run/docker.sock:/var/run/docker.sock
       - ./data/kafka:/kafka
     # depends_on:
     #   - zookeeper

   # Kafka Web UI
   # 基于Java开发,内存占用太大,非必要请勿使用
   kafdrop:
     image: obsidiandynamics/kafdrop
     container_name: intelligentremotepatrol_kafdrop
     restart: always
     mem_limit: 400m
     ports:
       - "9080:9000"
     environment:
       KAFKA_BROKERCONNECT: kafka:9092
       JVM_OPTS: "-Xms32M -Xmx64M"
       SERVER_SERVLET_CONTEXTPATH: "/"
     depends_on:
       - kafka

然后执行:docker-compose -f kafka.yml up -d 把容器拉起来,访问ip:9080查看kafka是否正常

然后开始部署elk服务,我的文件夹结构是这样的,可以按自己的方式来(这里的方式决定了一会yml文件的挂载路径) 在这些文件的最外面还有一个Elk文件夹

---es

                config

                             elasticsearch.yml

cluster.name: "es"
network.host: 0.0.0.0
http.port: 9200
# 开启es跨域
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,Content-Type
# 开启安全控制
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

 

--filebeat

      filebeat.yml

filebeat.config:
  modules:
    path: ${path.config}/modules.d/*.yml
    reload.enabled: false

processors:
  - add_cloud_metadata: ~
  - add_docker_metadata: ~

filebeat.inputs:
- type: log
  paths:
    - /usr/share/filebeat/logs/*.log
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
  multiline.negate: true
  multiline.match: after
  multiline.timeout: 10s
  
output.logstash:
  hosts: ["logstash:5044"]

 

--kibana

 

      kibana.yml

server.name: kibana
server.host: "0.0.0.0"
elasticsearch.hosts: [ "http://elasticsearch:9200" ] # 修改为自己的ip 
xpack.monitoring.ui.container.elasticsearch.enabled: true
elasticsearch.username: "elastic"  # es账号
elasticsearch.password: "hzs888"   # es密码
i18n.locale: zh-CN # 中文

 

--logstash

      conf

                             logstash

                                           logstash.yml

            logstash-simple.conf

 这个是yml

http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]
xpack.monitoring.enabled: true
path.config: /usr/share/logstash/config/*.conf
path.logs: /usr/share/logstash/logs

这个是conf

input {
  kafka {
    id => "kafkaLogs"
    group_id => "Logs"
    bootstrap_servers => "xxx.xx.xx.xxx:9092"
    topics => ["logs"]
    auto_offset_reset => "latest"
  }
}
filter {

    date {
       match => ["timestamp","yyyy-MM-dd'T'HH:mm:ss,sss"]
       remove_field => "timestamp"
       target => "@timestamp"
    }

}
output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    #index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
    #user => "elastic"
    #password => "changeme"
  }
}

 

这个 filter 也可做更多扩展,这里先不一一介绍,感兴趣可以自己进行扩展 

下面是正式部署

version: '3'

# 网桥es -> 方便相互通讯
networks:
  es:

services:
  elasticsearch:
    image: elastic/elasticsearch:7.17.2
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - TZ=Asia/Shanghai
      - LANG= en_US.UTF-8
      - ELASTIC_PASSWORD= "hzs888" # elastic账号密码 这个地方设置完后,在容器启动后发现密码失败根本登录不进去的情况要进入到容器内部设置,一会细说
    volumes:
      - ./es/data/esdata:/usr/share/elasticsearch/data
      - ./es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    hostname: elasticsearch
    restart: always
    ports:
      - 9200:9200
      - 9300:9300
    networks:
      - es


  kibana:
    image: elastic/kibana:7.17.2
    container_name: kibana
    volumes:
      - ./kibana/kibana.yml:/usr/share/kibana/config/kibana.yml
    hostname: kibana
    depends_on:
      - elasticsearch
    links: # 这里用了links 所以 kibana.yml 配置es的时候就不用指定ip
      - elasticsearch
    restart: always
    ports:
      - "5601:5601"
    networks:
      - es

  logstash:
    image: elastic/logstash:7.17.2
    container_name: logstash
    hostname: logstash
    restart: always
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./logstash/conf/logstash:/usr/share/logstash/config
      - ./logstash/log:/usr/share/logstash/logs
    depends_on:
      - elasticsearch
    ports:
      - 9600:9600
      - 5044:5044


  filebeat:
    image: elastic/filebeat:7.17.2
    hostname: filebeat
    restart: always
    depends_on:
      - logstash
    user: root
    volumes:
      - ./filebeat/data/filebeat:/usr/share/filebeat/data
      - ./filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml
      - ./filebeat/log:/usr/share/filebeat/logs
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - TZ=Asia/Shanghai
    command: ["--strict.perms=false"]
这个es可以做多个集群方式有兴趣可以自己扩展,我这里资源有限就不做演示了

这里弄完后有很重要的两步操作避免在容器挂在yml文件时无权限

 

 

1.文件所属必须为root

2.文件必须要有777权限

chown -R root ElK/

chmod 777 -R ElK/

执行docker-compose -f elk.yml up -d 挂载完毕后如下

 

 然后访问 ip:9200

 

登录成功后显示

 

 

这时输入账户密码 elastic hzs888  如果现在发现输入正确配置的账户密码无效后进行如下操作(登录进去就跳过)

执行如下命令进入容器

docker exec -it 容器id /bin/bash bin/elasticsearch-setup-passwords interactive

然后依次输入密码(需要输入很多很多次,别挣扎了,输入吧!)

 

 再回过头来进行登录Ip:9200 和 ip:5601(友情提示要是网页无法访问,检查云服务器端口是否开放,不像我sb找了半天问题)

登录成功后如果kibana无法访问,试着重启下容器

如果遇到(Kibana server is not ready yet)查看容器的日志看是哪儿的问题,多半是因为无法读取到es导致的

 

kibana这个页面就正常了

 

 

目前部署完后,各访问正常,但是还没进行kafka消息写入,后面测试完后,再做补充有问题再做调整

本文参考连接 都是东拼西凑一点都因为场景问题参考的都不全

 https://blog.csdn.net/qq_36778532/article/details/114121085

https://www.cnblogs.com/csts/p/14674141.html

https://juejin.cn/post/6992757838758182919

https://www.cnblogs.com/leozhanggg/p/12390850.html

https://blog.51cto.com/riverxyz/3154605

https://www.cnblogs.com/kebibuluan/p/13900497.html