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

实际上我之前已经写过一篇不是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有时候也有些错误解决方法也查不出来,还是得混合使用。有问题还是优先看官网文档、社区等等

# ELK 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×