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有时候也有些错误解决方法也查不出来,还是得混合使用。有问题还是优先看官网文档、社区等等
PS:
1、欢迎访问我的个人站点:小白求学进阶
2、欢迎访问我的CSDN博客:小白求学进阶