欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

elk日志系统,docker-compose部署,以及给elk加个安全保障所遇到的种种问题

程序员文章站 2022-07-06 19:58:07
...

实际上我之前已经写过一篇不是docker容器部署的,说实话真的很麻烦,配置相关的东西真的不少~~~上了docker容器,是真的香,当然这个过程还是挺曲折的。

docker 安装

网上教程一大堆,最重要的是看官网就对了。我是在Ubuntu服务器上搭建的,所以进入官网 https://docs.docker.com/engine/install/ubuntu/

docker-compose 安装

访问官网 https://docs.docker.com/compose/install/

系统mmap设置

官方原话:Elasticsearch mmapfs默认使用目录来存储其索引。默认的操作系统对mmap计数的限制可能太低,这可能会导致内存不足异常。官方说法 https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html

设置命令

sysctl -w vm.max_map_count=262144

相关文件创建(默认用root用户操作)

创建elasticsearch数据挂载路径;并授权;创建插件挂载路径

mkdir -p /elk/elasticsearch/data
chmod 777 /elk/elasticsearch/data
mkdir -p /elk/elasticsearch/plugins

创建logstash配置文件夹,并创建配置文件

mkdir -p /elk/logstash

vi /elk/logstash/logstash.conf
#内容如下:
input {
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4560
    codec => json_lines
  }
}
output {
  elasticsearch {
    hosts => "es:9200"
    index => "logstash-%{+YYYY.MM.dd}"
  }
}

创建docker-compose文件,相关的配置资料可以去看菜鸟教程https://www.runoob.com/docker/docker-compose.html

vi /elk/docker-compose.yml
#内容如下,路径都是你上面配置的,用3的话要注意docker-compose的版本,以下是我版本
#Docker version 18.09.7, build 2d0083d
#docker-compose version 1.25.5, build 8a1c60f6

version: '3'
services:
  elasticsearch:
    image: elasticsearch:7.5.1
    container_name: elasticsearch
    environment:
      - "cluster.name=elasticsearch" #集群名称为elasticsearch
      - "discovery.type=single-node" #单节点启动
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m" #jvm内存分配为512MB
    volumes:
      - /elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins
      - /elk/elasticsearch/data:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
  kibana:
    image: kibana:7.5.1
    container_name: kibana
    links:
      - elasticsearch:es #配置elasticsearch域名为es
    depends_on:
      - elasticsearch #在elasticsearch后启动
    environment:
      - "elasticsearch.hosts=http://es:9200" #因为上面配置了域名,所以这里可以简写为http://es:9200
    ports:
      - 5601:5601
  logstash:
    image: logstash:7.5.1
    container_name: logstash
    volumes:
      - /elk/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
    depends_on:
      - elasticsearch
    links:
      - elasticsearch:es
    ports:
      - 4560:4560

启动容器

在/elk/docker-compose.yml所在目录启动以下命令,第一次会比较慢,因为要拉取elk镜像。这时候在启动前可以去配置镜像仓库,参考https://zhuanlan.zhihu.com/p/109083850;我复制关键的过来;这样拉取的速度就会快很多了

官方仓库
# 添加 Docker 官方的 GPG **(为了确认所下载软件包的合法性,需要添加软件源的 GPG **)
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# 设置稳定版本的apt仓库地址
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

阿里云仓库
$ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

$ sudo add-apt-repository \
     "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
     $(lsb_release -cs) \
     stable"

启动容器(第一次的话拉取并启动)

docker-compose up -d

安装插件

进入logstash容器,https://www.elastic.co/guide/en/logstash/current/plugins-codecs-json_lines.html

docker exec -it logstash /bin/bash

进入bin,执行

./logstash-plugin install logstash-codec-json_lines

效果

如果你将服务器5601的端口开放之后,实际上你可以看到Kibana的管理端口了。
如果你将日志往你服务器logstash输入的话,你就可以在Kibana建立相关的索引看到相关的数据了,这里就不着重讲了,参考资料一大把。

安全性问题

不用说,现在是直接通过ip加端口就可以访问,这根本是不能被允许的,这些日志的东西不可能直接就这样暴露在公网,非常的不安全。因此我去搜了Kibana加密访问,实际上找到了很多没有的资料,对着那些资料操作了很多次,都不行,甚至在重启容器的时候,直接重启失败了。所以还是得看官网的内容

  • 安全配置

起初基本上是参考这篇博客的https://my.oschina.net/u/4312590/blog/3267130,后面官网的配置对比他这篇来说,相对更简单点https://www.elastic.co/cn/blog/getting-started-with-elasticsearch-security。可以直接参考官网的。按照官网的相关配置后,容器一直启动不了,通过docker-compose logs命令,才出现了一些问题,然后逐一解决,最后才成功启动的。步骤我就不复制了,可以去官网看

遇到的问题以及解决方法

  • 配置好相关的配置文件,elasticsearch启动不了

查看日志,报了如下的错误

 OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
elasticsearch    | 2020-04-26 01:51:53,849 main ERROR No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2
elasticsearch    | Exception in thread "main" SettingsException[elasticsearch.yaml was deprecated in 5.5.0 and must be renamed to elasticsearch.yml]
elasticsearch    | 	at org.elasticsearch.node.InternalSettingsPreparer.prepareEnvironment(InternalSettingsPreparer.java:72)
elasticsearch    | 	at org.elasticsearch.cli.EnvironmentAwareCommand.createEnv(EnvironmentAwareCommand.java:100)
elasticsearch    | 	at org.elasticsearch.cli.EnvironmentAwareCommand.createEnv(EnvironmentAwareCommand.java:91)
elasticsearch    | 	at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)
elasticsearch    | 	at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:125)
elasticsearch    | 	at org.elasticsearch.cli.Command.main(Command.java:90)
elasticsearch    | 	at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:115)
elasticsearch    | 	at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92)

按我的做法,当然是一顿复制粘贴,搜了一下,很快就找到了答案https://github.com/elastic/elasticsearch/issues/43911,就说jvm环境分配的内容的问题,很奇怪的是,如果我不修改配置文件,用容器的方式启动,是没问题。按照我之前手动安装elasticsearch的时候,也遇到了这个问题,需要修改环境配置,主要是服务器配置低。那就是说,elasticsearch启动的时候分配的内存必须拥有,但为什么没有修改配置文件的情况下,用容器启动就能正常运行呢?这个方面我也没找到答案,望知道的可以告知一声

  • 访问Kibana出现Kibana server is not ready yet

字面意思就是Kibana服务没有准备好,但是已经是正常启动了,然后elasticsearch但是有个错误日志

org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: failed to load plugin class [org.elasticsearch.xpack.core.XPackPlugin]

资料https://discuss.elastic.co/t/failed-to-load-plugin-class-org-elasticsearch-xpack-core-xpackplugin/120627意思就是没有权限,生成的证书用了root用户,但是应用那些却是其他用户组,这时候我又把容器删除,重新来过,这次生成证书前,我切换成elasticsearch用户

#进入容器
docker exec -it elasticsearch /bin/bash
#查看用户组
cat /etc/passwd

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
elasticsearch:x:1000:1000::/usr/share/elasticsearch:/bin/bash

#切换用户
su elasticsearch
  • 注意的是,用户组生成密码的时候,用户名早就决定好了,在Kibana的配置的时候需要注意

结语

说实话,经历过这次,容器是真的香,增删太方便了,操作失误,直接把建好的容器删除就行了。要学的东西还有很多,排查解决问题也很关键。不能完全依靠百度,Google有时候也有些错误解决方法也查不出来,还是得混合使用。有问题还是优先看官网文档、社区等等

PS:

1、欢迎访问我的个人站点:小白求学进阶

2、欢迎访问我的CSDN博客:小白求学进阶

相关标签: ELK 学习