日志如何进行持久存储?
因为 TKE Serverless 即用即消的特性,导致如果想要查看日志,必须当且仅当 Pod 还在 Running 状态时查看。一旦 Pod 状态变为 Completed ,将会出现如下报错:
Error from server (InternalError): Internal error occurred: can not found connection to pod ***
以下为您介绍能将日志持久存储的方法:
重定向
重定向方法最为简单,只需将 kubectl logs
输出到终端的 stdout 转向输出到文件中即可持久化存储。执行命令如下:
kubectl logs -f tf-cnn >> info.log
但使用重定向方法时需要注意,输出流不会流向终端,也就是说在终端上将无法看到日志滚到哪一步。如果在将命令输出保存到文件中的同时,还需要将内容也输出到屏幕,有如下两种方法:
使用管道 + tee
命令,执行命令如下:
kubectl logs -f tf-cnn |tee info.log
使用 logsave
命令,也可以做到将命令输出保存到文件的同时将内容页输出到屏幕中,执行命令如下:
logsave [-asv] info.log kubectl logs -f tf-cnn
说明:
logsave
相较于tee
的好处是,logsave
每次输入会记录下时间,并制造间隔,观感上也更便于查找某一段日志。
上述三条命令同时存在弊端,因为都是基于 kubectl logs
输出的重定向,使用时必须在 Running 状态时运行,起到的作用只是在 Completed 后依然能查看日志。重定向方法可适用于少量的日志,不存在大量的日志输出和检索需求的场景下。如果您的需求不高,那么推荐您使用重定向方法。
在 TKE Serverless 集群中,可以通过环境变量和自定义资源(CRD)两种方式配置日志采集。
2. 如果使用密钥授权,可以新建一个 Opaque 类型的 Secret ,创建两个 key(SecretId 和 SecretKey),值分别是在 API 密钥 中获得的 SecretId 和 SecretKey 3. 即可在开启日志采集中找到创建的 Secret ,并关联 SecretId 和 SecretKey 。
4. 在控制台得到原始日志,切换表格展示并将 JSON 格式化。
使用此方法将会出现一个问题,TKE Serverless 开启日志采集功能的原理,是将采集到的日志以 JSON 的形式发送到指定的消费端。而采集提供的 JSON 时间戳是秒级。
将导致在控制台上查看的日志时间的粒度也是秒级,在检索分析端上看到的日志只能按秒级时间顺序,而更小尺度不能实现顺序输出。而有时候日志会在短时间大量输出,通常需要微秒级的精度。因此我们更推荐使用 CRD 配置方式。
2. 开启日志采集后,新建如下图所示日志规则:
在检索分析端可以看到,时间粒度为毫秒级,而更小尺度也按顺序输出。 说明:
CRD 配置的日志采集还支持通过正则划分原始日志,更自由,但相较于环境变量配置更麻烦。
配置日志采集可能遇到的问题
如果选择 CRD 配置日志采集,请选择 Chrome 内核的浏览器(最新版 Edge、Chrome 浏览器)进行配置,而不是旧版 Edge 等。因为前端已经可能不支持旧版内核,会出现日志样例无法正常显示、正则表达式自动生成无法正常框取等问题。
在用 CRD 配置日志采集后,在新建 Pod 时无需其他操作,会自动获取输出的 log 。如果未采集到,考虑是否存在机器组已满的问题。使机器组额度有空余后,重启 cls-provisioner 的 Pod 即可。
本页内容是否解决了您的问题?