腾讯云容器服务日志采集最佳实践

本文介绍如何利用腾讯云容器服务 TKE 的日志功能对日志进行采集、存储与查询,分析各种功能用法与场景,给出一些最佳实践建议。

: 本文仅适用于 TKE 集群。

如何快速上手 ?

TKE 的日志功能入口在 集群运维-日志规则,更多关于如何为 TKE 集群启用日志采集与基础用法,参考官方文档 日志采集。

技术架构是怎样的 ?

TKE 集群开启日志采集后,tke-log-agent 作为 DaemonSet 部署在每个节点上,负责根据采集规则采集节点上容器的日志,然后上报到 CLS 日志服务,由 CLS 进行统一存储、检索与分析:

img

采集哪里的日志 ?

在 TKE 使用日志采集时,需要在 集群运维-日志规则 里新建日志采集规则,首先需要确定采集的目标数据源是什么,下面介绍支持的 3 种类型数据源及其各自使用场景与建议。

采集标准输出

最简单也是最推荐的方式是将 Pod 内容器的日志输出到标准输出,日志内容就会由容器运行时 (docker, containerd) 来管理,有以下几点好处:

不需要额外挂载 volume。

可以直接通过 kubectl logs 查看日志内容。

业务不需要关心日志轮转,容器运行时会对日志进行存储和自动轮转,避免因个别 Pod 日志量大将磁盘写满。

不需要关心日志文件路径,可以使用比较统一的采集规则,用更少的采集规则数量覆盖更多的工作负载,减少运维复杂度。

采集配置示例:

img

采集容器内的文件

很多时候业务通过写日志文件的方式来记录日志,使用容器跑业务时,日志文件被写到容器内:

如果日志文件所在路径没有挂载 volume,日志文件会被写入容器可写层,落盘到容器数据盘里,通常路径是 /var/lib/docker (建议给此路径挂盘,避免与系统盘混用),容器停止后日志会被清理。

如果日志文件所在路径挂载了 volume,日志文件会落盘到对应 volume 类型的后端存储;通常用 emptydir,容器停止后日志会被清理,运行期间日志文件会落盘到宿主机的 /var/lib/kubelet 路径下,此路径通常没有单独挂盘,也就是会使用系统盘;由于使用了日志采集,有统一存储的能力,不推荐再挂载其它持久化存储来存日志文件(如云硬盘CBS, 对象存储COS, 共享存储CFS)。

许多开源日志采集器需要给 Pod 日志文件路径挂载 volume 才能采集,使用 TKE 的日志采集则不需要,所以如果将日志输出到容器内的文件里,不需要关心是否挂载 volume。

采集配置示例:

img

采集宿主机上的文件

如果业务将日志写入日志文件,但又想容器停止之后还能保留原始日志文件,好有个备份,避免采集异常时导致日志完全丢失,这时可以给日志文件路径挂载 hostPath,日志文件会落盘到宿主机指定目录,并且容器停止后不会清理日志文件。

由于不会自动清理日志文件,有同学就可能会担心日志会被重复采集,比如 Pod 调度走又调度回来,日志文件被写在之前相同路径。是否会重复采集,这里分两种情况:

文件名相同,比如固定文件路径 /data/log/nginx/access.log。此时不会重复采集,因为采集器会记住之前采集过的日志文件的位点,只采集增量部分。

文件名不同,通常是业务用的日志框架会按照一定时间周期自动进行日志轮转,一般是按天轮转,自动为旧日志文件进行重命名,加上时间戳后缀。如果采集规则里使用了 "*" 作为通配符匹配日志文件名,可能就会重复采集,因为日志框架对日志文件重命名后,采集器就会认为匹配到了新写入的日志文件,就又对其进行采集一次。

所以,一般不会重复采集,如果日志框架会对日志进行自动轮转,建议采集规则不要使用通配符 "*" 来匹配日志文件。

采集配置示例:

img

日志吐到哪里 ?

知道了采集哪里的数据之后,我们还需要知道采集到的日志往哪里存。根据前面讲的技术架构可以知道,TKE 日志采集与云上的 CLS 日志服务集成,日志数据也将统一上报到日志服务。日志服务通过日志集和日志主题来对日志进行管理,日志集是 CLS 的项目管理单元,可以包含多个日志主题;一般将同一个业务的日志放在一个同一日志集,同一业务中的同一类的应用或服务使用相同日志主题,在 TKE 中,日志采集规则与日志主题是一一对应的;TKE 创建日志采集规则时选择消费端,就需要指定日志集与日志主题,日志集通常提前创建好,日志主题通常选择自动创建:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjdzy.html