共计 5176 个字符,预计需要花费 13 分钟才能阅读完成。
概述
本文介绍如何利用腾讯云容器服务 TKE 的日志性能对日志进行采集、存储与查问,剖析各种性能用法与场景,给出一些最佳实际倡议。
注 : 本文仅实用于 TKE 集群。
如何疾速上手 ?
TKE 的日志性能入口在 集群运维 - 日志规定
,更多对于如何为 TKE 集群启用日志采集与根底用法,参考官网文档 日志采集。
技术架构是怎么的 ?
TKE 集群开启日志采集后,tke-log-agent 作为 DaemonSet 部署在每个节点上,负责依据采集规定采集节点上容器的日志,而后上报到 CLS 日志服务,由 CLS 进行对立存储、检索与剖析:
采集哪里的日志 ?
在 TKE 应用日志采集时,须要在 集群运维 - 日志规定
里新建日志采集规定,首先须要确定采集的指标数据源是什么,上面介绍反对的 3 种类型数据源及其各自应用场景与倡议。
采集规范输入
最简略也是最举荐的形式是将 Pod 内容器的日志输入到规范输入,日志内容就会由容器运行时 (docker, containerd) 来治理,有以下几点益处:
- 不须要额定挂载 volume。
- 能够间接通过
kubectl logs
查看日志内容。 - 业务不须要关怀日志轮转,容器运行时会对日志进行存储和主动轮转,防止因个别 Pod 日志量大将磁盘写满。
- 不须要关怀日志文件门路,能够应用比拟对立的采集规定,用更少的采集规定数量笼罩更多的工作负载,缩小运维复杂度。
采集配置示例:
采集容器内的文件
很多时候业务通过写日志文件的形式来记录日志,应用容器跑业务时,日志文件被写到容器内:
- 如果日志文件所在门路没有挂载 volume,日志文件会被写入容器可写层,落盘到容器数据盘里,通常门路是
/var/lib/docker
(倡议给此门路挂盘,防止与系统盘混用),容器进行后日志会被清理。 - 如果日志文件所在门路挂载了 volume,日志文件会落盘到对应 volume 类型的后端存储;通常用 emptydir,容器进行后日志会被清理,运行期间日志文件会落盘到宿主机的
/var/lib/kubelet
门路下,此门路通常没有独自挂盘,也就是会应用系统盘;因为应用了日志采集,有对立存储的能力,不举荐再挂载其它长久化存储来存日志文件 (如云硬盘 CBS, 对象存储 COS, 共享存储 CFS)。
许多开源日志采集器须要给 Pod 日志文件门路挂载 volume 能力采集,应用 TKE 的日志采集则不须要,所以如果将日志输入到容器内的文件里,不须要关怀是否挂载 volume。
采集配置示例:
采集宿主机上的文件
如果业务将日志写入日志文件,但又想容器进行之后还能保留原始日志文件,好有个备份,防止采集异样时导致日志齐全失落,这时能够给日志文件门路挂载 hostPath,日志文件会落盘到宿主机指定目录,并且容器进行后不会清理日志文件。
因为不会主动清理日志文件,有同学就可能会放心日志会被反复采集,比方 Pod 调度走又调度回来,日志文件被写在之前雷同门路。是否会反复采集,这里分两种状况:
- 文件名雷同,比方固定文件门路
/data/log/nginx/access.log
。此时不会反复采集,因为采集器会记住之前采集过的日志文件的位点,只采集增量局部。 - 文件名不同,通常是业务用的日志框架会依照肯定工夫周期主动进行日志轮转,个别是按天轮转,主动为旧日志文件进行重命名,加上工夫戳后缀。如果采集规定里应用了 “*” 作为通配符匹配日志文件名,可能就会反复采集,因为日志框架对日志文件重命名后,采集器就会认为匹配到了新写入的日志文件,就又对其进行采集一次。
所以,个别不会反复采集,如果日志框架会对日志进行主动轮转,倡议采集规定不要应用通配符 “*” 来匹配日志文件。
采集配置示例:
日志吐到哪里 ?
晓得了采集哪里的数据之后,咱们还须要晓得采集到的日志往哪里存。依据后面讲的技术架构能够晓得,TKE 日志采集与云上的 CLS 日志服务集成,日志数据也将对立上报到日志服务。日志服务通过日志集和日志主题来对日志进行治理,日志集是 CLS 的项目管理单元,能够蕴含多个日志主题;个别将同一个业务的日志放在一个同一日志集,同一业务中的同一类的利用或服务应用雷同日志主题,在 TKE 中,日志采集规定与日志主题是一一对应的;TKE 创立日志采集规定时抉择生产端,就须要指定日志集与日志主题,日志集通常提前创立好,日志主题通常抉择主动创立:
创立好后能够依据状况对主动创立的日志主题进行重命名,不便后续检索时找到日志所在的日志主题:
如何配置日志格局解析 ?
有了日志的原始数据,咱们还须要通知日志服务如何去解析日志,以不便后续对其进行检索。在创立日志采集规定时,须要配置日志的解析格局,上面针对各项配置给出剖析与倡议。
应用哪种抓取模式 ?
首先,咱们须要确定日志的抓取模式,反对 5 种:单行文本、JSON、分隔符、多行文本和齐全正则。
举荐应用 JSON,因为 JSON 格局自身就将日志给结构化了,日志服务能够提取 JSON 的 key 作为字段名,value 作为对应的字段值,不再须要依据业务日志输入格局配置简单的匹配规定,日志示例:
{"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"}
应用 JSON 抓取模式的前提是业务的日志自身是以 JSON 格局输入的,如果不是 JSON 格局,但切换到应用 JSON 格局输入老本不大,就倡议进行切换,如果切实不好切换,再思考其它抓取模式。
如果日志内容是以固定格局输入的单行文本,思考应用 “ 分隔符 ” 或 “ 齐全正则 ” 抓取模式。” 分隔符 ” 实用简略格局,日志中每个字段值都以固定的字符串分隔开,比方用 “:::” 隔开,某一条日志内容是:
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.*
如何过滤掉不须要的内容 ?
有些不重要或不关怀的日志能够抉择将其过滤掉,降低成本。
如果应用 “JSON”、” 分隔符 ” 或 “ 齐全正则 ” 的抓取模式,日志内容会进行结构化解决,能够通过指定字段来对要保留的日志进行正则匹配:
对于 “ 单行文本 ” 和 “ 多行文本 ” 抓取模式,因为日志内容没有进行结构化解决,无奈指定字段来过滤,通常间接应用正则来对要保留的残缺日志内容进行含糊匹配:
须要留神的是,匹配内容肯定记住是用正则而不是残缺匹配,比方想只保留 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 等,不便检索时指定这些字段进行检索。
查问示例:
如何将日志投递到其它中央 ?
日志服务反对将日志投递到 COS 对象存储和 Ckafka (腾讯云托管的 Kafka),能够在日志主题里设置投递:
能够用在以下场景:
- 对日志数据进行长期归档存储。日志集默认存储 7 天的日志数据,能够调整时长,但数据量越大,老本就越高,通常只保留几天的数据,如果须要将日志存更长时间,能够投递到 COS 进行低成本存储。
- 须要对日志进行进一步解决 (如离线计算),能够投递到 COS 或 Ckafka,由其它程序生产来解决。
参考资料
- TKE 日志采集用法指引: https://cloud.tencent.com/doc…
- 日志服务配置工夫格局: https://cloud.tencent.com/doc…
- 日志服务投递 COS: https://cloud.tencent.com/doc…
- 日志服务投递 Ckafka: https://cloud.tencent.com/doc…
【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!!