这次的es的部署是在同一个工作负载中,启动了3个容器。
-
首先准备一个es的pv和pvc,有需要的可以参考我之前的rancher中pv和pvc的使用。
- 创建pv
- 创建pvc,绑定pv
- 创建pv
-
创建一个工作负载
-
给pod配置上面准备的pv。
-
在网络配置中,做一个host的映射,因为logstash和kibana默认都是指向http:elasticsearch:9200,我们将这个elasticsearch的映射到指定的ip就不需要配置了。
-
创建一个es的容器
-
创建一个kibana容器
-
创建一个logstash容器
配置到这里基本上就告一段落了,起来应该是没有问题的,但是可能要等待一些时间,还需要下载镜像。虽然是能够运行起来了,但是结合项目通过logstash将数据写入到es中才是我们最终的目的,这个先不在这一节中写了
下面是一些部署过程中的一些思路和遇到的问题,各位大佬请随意。
本来是想在实际操作过程中,实时记录下来的每一个想法和步骤。之前直接使用docker-compose来部署过一次elk,想来在rancher中应该也是类似的,不过说实话,事情虽然看上去简单,实际上却是出现了不少问题。
之前docker-compose的方式部署的elk应该是最简单的了, 如果不想折腾的话,就直接cv一下完事了,但是进来应该也是有点想法的。
先说说大概思路:
- ELK三个组件中,我们需要优先部署的是es服务,因为logstash和kibana都是基于es的,一个写,一个读。
- 部署es的话肯定是需要挂载一下容器中的数据文件的,不然一不小心误操作导致数据丢失就GG了。我这里使用的是nfs来挂载,rancher使用nfs的相关文章有需要的话可以参考一下:http://t.csdnimg.cn/pyPKt
- 准备一下,logstash和kibana相关的配置文件,以及挂载需要使用的pv及pvc,pv的话可以使用同一个,也可以分开,我这里直接使用同一个了。但是处于安全性考虑的话,最好是一对一会比较好一点,不会被其他pod误使用,因为我是使用的自动分配端口,所以这个我在部署好了es之后再配置,这样不用自己去管理端口。
下面说一下遇到的一些问题:
- 一开始部署es的时候,镜像名称写错了,elasticsearch:7.17.15我直接从docker-compose中复制过来有一些前缀,导致一直卡在那里,删也很慢折腾也挺久的。
- 后面镜像使用正确了,服务是能跑了,但是一直报错geoip服务链接超时。后面打算把这个功能关掉,但是实际上刚好7.14.0这个版本就还存在这个关不掉的问题。后面找了不少别人的案例,才在某一个回复中发现7.14.0之后的版本就修复了这个问题,我直接切换成当前7版本的最后一版本7.17.15。这个问题还不是那么好找的。
- 本来是打算每个组件部署在不同的工作负载,其实我之前尝试过这种方式,但是时间比较长也忘记了,就想试试把elk三个组件放到同一个工作负载中。然后我也了解到,在同一个pod中的话,logstash和kibana可以直接配置localhost来访问es,虽然可以直接配置localhost,但是实际上也还是需要去修改配置文件的,这个时候我又需要影射2个配置文件,而2个配置文件又需要配置2个pv和pvc,我就想能不能通过环境变量来指定es的地址。后面搜了一些发现也是行不通的。
- 接下来我就发现,报错都是提示连接http://elasticsearch:9200连不上,后面我就想到,既然我不能通过环境变量修改这个主机名称,那么我就像修改hosts映射一样去将elasticsearch这个名称映射为127.0.0.1不就行了。果然一试就成功了。这个时候我就只配置了一个es的数据目录就把整个elk在一个工作负载中跑起来了。
- 即使到了这一步,最终我将日志发送到logstash的时候还是出了问题,因为我以前是挂载配置文件的方式,这个配置文件还多了一个输入的编码格式的指定,而我现在是没有指定的,所以到了logstash就报错了。
- 之前使用docker-compose的时候,logstash等其他的配置文件还是使用挂载配置文件的方式来实现的,现在我又不想用挂载,感觉又显得复杂了,后面决定用configmap的方式来实现,确实也方便了不少。