其他
腾讯云容器服务日志采集最佳实践
概述
注: 本文仅适用于 TKE 集群。
如何快速上手 ?
集群运维-日志规则
,更多关于如何为 TKE 集群启用日志采集与基础用法,参考TKE日志采集产品文档: https://cloud.tencent.com/document/product/457/36771。技术架构是怎样的 ?
采集哪里的日志 ?
集群运维-日志规则
里新建日志采集规则,首先需要确定采集的目标数据源是什么,下面介绍支持的 3 种类型数据源及其各自使用场景与建议。采集标准输出
不需要额外挂载 volume。 可以直接通过 kubectl logs
查看日志内容。业务不需要关心日志轮转,容器运行时会对日志进行存储和自动轮转,避免因个别 Pod 日志量大将磁盘写满。 不需要关心日志文件路径,可以使用比较统一的采集规则,用更少的采集规则数量覆盖更多的工作负载,减少运维复杂度。
采集容器内的文件
如果日志文件所在路径没有挂载 volume,日志文件会被写入容器可写层,落盘到容器数据盘里,通常路径是 /var/lib/docker
(建议给此路径挂盘,避免与系统盘混用),容器停止后日志会被清理。如果日志文件所在路径挂载了 volume,日志文件会落盘到对应 volume 类型的后端存储;通常用 emptydir,容器停止后日志会被清理,运行期间日志文件会落盘到宿主机的 /var/lib/kubelet
路径下,此路径通常没有单独挂盘,也就是会使用系统盘;由于使用了日志采集,有统一存储的能力,不推荐再挂载其它持久化存储来存日志文件(如云硬盘CBS, 对象存储COS, 共享存储CFS)。
采集宿主机上的文件
文件名相同,比如固定文件路径 /data/log/nginx/access.log
。此时不会重复采集,因为采集器会记住之前采集过的日志文件的位点,只采集增量部分。文件名不同,通常是业务用的日志框架会按照一定时间周期自动进行日志轮转,一般是按天轮转,自动为旧日志文件进行重命名,加上时间戳后缀。如果采集规则里使用了 "*" 作为通配符匹配日志文件名,可能就会重复采集,因为日志框架对日志文件重命名后,采集器就会认为匹配到了新写入的日志文件,就又对其进行采集一次。
日志吐到哪里 ?
如何配置日志格式解析 ?
使用哪种抓取模式 ?
{"remote_ip":"10.135.46.111","time_local":"22/Jan/2019:19:19:34 +0800","body_sent":23,"responsetime":0.232,"upstreamtime":"0.232","upstreamhost":"unix:/tmp/php-cgi.sock","http_host":"127.0.0.1","method":"POST","url":"/event/dispatch","request":"POST /event/dispatch HTTP/1.1","xff":"-","referer":"http://127.0.0.1/my/course/4","agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0","response_code":"200"}
10.20.20.10 ::: [Tue Jan 22 14:49:45 CST 2019 +0800] ::: GET /online/sample HTTP/1.1 ::: 127.0.0.1 ::: 200 ::: 647 ::: 35 ::: http://127.0.0.1/
10.135.46.111 - - [22/Jan/2019:19:19:30 +0800] "GET /my/course/1 HTTP/1.1" 127.0.0.1 200 782 9703 "http://127.0.0.1/course/explore?filter%5Btype%5D=all&filter%5Bprice%5D=all&filter%5BcurrentLevelId%5D=all&orderBy=studentNum" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0" 0.354 0.354
(\S+)[^\[]+(\[[^:]+:\d+:\d+:\d+\s\S+)\s"(\w+)\s(\S+)\s([^"]+)"\s(\S+)\s(\d+)\s(\d+)\s(\d+)\s"([^"]+)"\s"([^"]+)"\s+(\S+)\s(\S+).*
()
捕获组来区分每个字段,我们还需要为每个字段设置字段名,配置示例:10.20.20.10 - - [Tue Jan 22 14:24:03 CST 2019 +0800] GET /online/sample HTTP/1.1 127.0.0.1 200 628 35 http://127.0.0.1/group/1
Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0 0.310 0.310
\d+\.\d+\.\d+\.\d+\s-\s.*
如何过滤掉不需要的内容 ?
a.test.com
域名的日志,匹配的表达式应该写 a\.test\.com
而不是 a.test.com
。日志时间戳如何自定义 ?
time
字段作为时间戳,其中一条日志 time
的值为 2020-09-22 18:18:18
,时间格式就可以设置为 %Y-%m-%d %H:%M:%S
, 示例:如何查询日志 ?
日志服务-检索分析
中查询日志了,支持 Lucene 语法,但前提是需要开启索引,有以下 3 类索引:全文索引。用于模糊搜索,不用指定字段。 键值索引。索引结构化处理过的日志内容,可以指定日志字段进行检索。
元字段索引。上报日志时额外自动附加的一些字段,比如 pod 名称、namespace 等,方便检索时指定这些字段进行检索。
如何将日志投递到其它地方 ?
对日志数据进行长期归档存储。日志集默认存储 7 天的日志数据,可以调整时长,但数据量越大,成本就越高,通常只保留几天的数据,如果需要将日志存更长时间,可以投递到 COS 进行低成本存储。 需要对日志进行进一步处理 (如离线计算),可以投递到 COS 或 Ckafka,由其它程序消费来处理。
参考资料
TKE 日志采集用法指引: https://cloud.tencent.com/document/product/457/36771 日志服务配置时间格式: https://cloud.tencent.com/document/product/614/38614 日志服务投递 COS: https://cloud.tencent.com/document/product/614/37908 日志服务投递 Ckafka: https://cloud.tencent.com/document/product/614/33342
回答问题拿礼物啦
当当当~首先恭喜翻到最后的小伙伴
今日学习任务圆满达成!!!
为了帮助你巩固本次学习
作者大大精心准备了以下几个问题
正在等待你的回答
留言板评论【问题编号+你的答案】
每个问题将会由作者评选出一名最佳答主
并送上QQ公仔一只
还等什么,快来挑个问题回答吧~
问题1:采集容器内的文件是否需要挂载 volume ?
问题2:如果要根据 Pod 名称过滤日志,需要在日志服务开启什么索引 ?
问题3:如果还需要将日志进行一些复杂的离线计算(分析统计),应该怎么做 ?
截止时间:2020年10月20日18点