前言

在不断更新和进步的的网络时代,相应的各种开发技术都有了较高层次的提升。现在比较流行的是容器集群管理平台(比较出名的是 kubernetes ),在平台上运行着不同编程语言产出的各种应用服务。

在越来越多的应用服务运行后,如果某些服务出现了问题,影响了客户使用,我们如何快速地定位并且修复问题呢?


常见的解决方式

1、将报错信息通过程序捕抓后,记录到数据库。

(缺点:只能记录异常的日志,而且有可能字段过长记录失败)

2、在代码里面打印各种关键信息,然后定位问题,在服务器上找到对应的程序日志文件,查找关键词来看问题。

(缺点:如果做了高可用的话,需要全部副本都看一遍,比较麻烦)

3、通过接入统一的日志系统,利用唯一的标识去查找当时发生的异常。

(优点:较为快速准确地定位到问题)


前提要求

1、部署好 K8S / K3S 集群
2、部署好 Elasticsearch 引擎
3、部署好 kibana 开源分析可视化工具
4、部署好 filebeat 文件内容收集工具
5、对 K8S 基本命令的了解

以上是微服务和日志系统的基本架构,详情的部署方法有兴趣的下期再详细叙述。


应用服务注意点

1、程序日志文件

不管用什么编程语言,最终在 K8S 的体现形式是各个不同的容器服务。

所以我们的关键的步骤是:将应用服务的接口日志,以一个固定格式的 json (比如 json 里面固定有10个字段,不能随意变更字段,因为 ES 的存储索引一旦生成就是固定不变的,如果发送新的数据结构到 ES ,会拒绝写入)存储到一个文件当中,一次请求就一行数据。

接口日志的内容大致如下:

K8S服务轻松对接EFK日志系统_EFK

建议记录一些关键的字段信息,如下:
1、uri(请求路由)
2、method(请求方法POST、GET)
3、get/post(请求参数json)
4、ret(接口是否成功标识,用于第三方判断)
5、result(接口返回值json)
6、errorMsg(异常信息)
7、uuid(本次请求接口的唯一标识,用于快速定位某次请求)
8、startTime(接口开始时间)
9、endTime(接口结束时间)
10、consume(接口耗时)

2、容器打包文件

K8S服务轻松对接EFK日志系统_应用服务_02


在完成一些初始化步骤后,执行服务的启动命令,并且将服务挂到后台,然后使用​tail -f xxx.log​​命令来让容器挂起这个日志文件。


3、部署filebeat搜集信息发送到ES

K8S服务轻松对接EFK日志系统_k8s_03

由于 K8S 的所有应用服务所产生的日志,都会统一放在 node 节点的​/var/log/containers​目录下,名称就是以 pod 来命名的。

然后我们来看看,第二步挂起的文件,在 K8S 集群的形式如下图片:

K8S服务轻松对接EFK日志系统_EFK_04

基本有3个字段(log、stream、time)

其中 log 的内容就是我们挂起的日志文件内容,必须是一行行 json 数据才可以的。

接着,下面对 filebeat 的配置文件进行剖析:

K8S服务轻松对接EFK日志系统_EFK_05

具体的解析如上图所示,值得注意的是,message 的拆解,其实就是将上述的 log 字段里的 json 解析成多个程序自定义的字段,然后统一发送到 ES 中,生成对应的索引数据文件。

最后,如果有新部署的应用服务的话,只需要在 filebeat 的配置文件增加对应的匹配条件即可直接对接到 EFK 日志系统。


4、可视化日志系统查询

万事俱备,数据的生成、收集、存储都完成了,现在只差关键的一步,那就是查询。

K8S服务轻松对接EFK日志系统_日志系统_06

具体 kibana 的使用指南大家可以摸索一下,比较简单易用,查询速度也是杠杠的~

以上就是本期分享,如果大家对此感兴趣,欢迎各位关注、留言,大家的支持就是我的动力!