KubeSphere 多行日志采集方案深度探索
创始人
2024-03-01 03:04:26
0

作者:大飞哥,视源电子运维工程师,KubeSphere 用户委员会广州站站长

采集落盘日志

日志采集,通常使用 EFK 架构,即 ElasticSearch,Filebeat,Kibana,这是在主机日志采集上非常成熟的方案,但在容器日志采集方面,整体方案就会复杂很多。我们现在面临的需求,就是要采集容器中的落盘日志。

容器日志分为标准输出日志和落盘日志两种。应用将日志打印在容器标准输出 STDOUT 中,由容器运行时(Docker 或 Containerd)把标准输出日志写入容器日志文件中,最终由采集器导出。这种日志打印采集是业界推荐方案。但对于不打印标准输出而直接将日志落盘的情况,业界最常用见的方案是,使用 Sidecar 采集落盘日志,把落盘日志打印到容器标准输出中,再利用标准输出日志的采集方式输出。

对于 KubeSphere 用户,只需要两步即可:第一在项目中开启收集卷上日志,第二在工作负载中配置落盘文件路径。具体操作见下图所示。

上述两个步骤,会自动在容器中注入 Filebeat Sidecar 作为 logging-agent,将落盘日志打印输出在容器标准输出中。Filebeat 配置可通过 ConfigMap 修改。

$ kubectl get cm -n kubesphere-logging-system logsidecar-injector-configmap -o yaml
## Filebeat 配置
filebeat.inputs:
- type: logenabled: truepaths:{{range .Paths}}- {{.}}{{end}}
output.console:codec.format:string: '%{[log.file.path]} %{[message]}'
logging.level: warning

接入第三方日志服务

默认 KubeSphere 将日志采集到集群内置 Elasticsearch 中,数据保存周期为 7 天,这对于生产服务动辄 180 天的日志存储需求,显然无法满足。企业运维团队都会建立集中化的日志服务,将集群内日志接入到第三方日志服务中,已是必然选择。我们来看如何操作。

上文说到,容器运行时会将标准输出日志,落盘写入到集群节点的日志文件中,Linux 系统默认在 /var/log/containers/*.log。KubeSphere 使用 FluentBitDemonSet 形式在各集群节点上采集日志,由 FluentBit 输出给 ElasticSearch 服务。具体配置可参考如下两个配置:

$ kubectl get Input -n kubesphere-logging-system tail -o yaml
$ kubectl get Output -n kubesphere-logging-system es -o yaml

我们把日志导出到第三方日志服务,那就需要定制 FluentBit 输入输出。使用 tail 插件采集 /var/log/containers/flux-wms-*.log 文件中的日志,输出到 Kafka 中。可参考如下配置:

---
apiVersion: logging.kubesphere.io/v1alpha2
kind: Input
metadata:labels:logging.kubesphere.io/component: logginglogging.kubesphere.io/enabled: "true"name: kafka-flux-wmsnamespace: kubesphere-logging-system
spec:tail:db: /fluent-bit/tail/pos.dbdbSync: NormalmemBufLimit: 5MBpath: /var/log/containers/flux-wms-*.logrefreshIntervalSeconds: 10tag: fluxwms.*
---
apiVersion: logging.kubesphere.io/v1alpha2
kind: Output
metadata:annotations:kubesphere.io/creator: adminlabels:logging.kubesphere.io/component: logginglogging.kubesphere.io/enabled: "true"name: kafka-flux-wmsnamespace: kubesphere-logging-system
spec:kafka:brokers: xxx.xxx.xxx.xxx:9092topics: my-topicmatch: fluxwms.*

值得注意的是,目前 FluentBit 不支持 Kafka 认证。

多行日志的尴尬

原本以为至此就可万事大吉,没想到消费 kafka 日志时突然看到,某些日志被拆得七零八碎,不忍入目。为了支持多行日志,直观的想法,就是逐个组件往前排查。

前方有坑,请小心阅读。

配置 FluentBit 支持多行日志

FluentBit 对多行日志的支持,需要配置 Parser,并通过 parserFirstline 指定日志 Parser,用以解析出多行日志块的第一行。官方参考文档,Parser 正则表达式,根据 Filebeat 日志输出格式而定,可参考上文或直接看这段:string: '%{[log.file.path]} %{[message]}'

---
apiVersion: logging.kubesphere.io/v1alpha2
kind: Input
metadata:labels:logging.kubesphere.io/component: logginglogging.kubesphere.io/enabled: "true"name: kafka-flux-wmsnamespace: kubesphere-logging-system
spec:tail:db: /fluent-bit/tail/pos.dbdbSync: NormalmemBufLimit: 5MBpath: /var/log/containers/flux-wms-*.logmultiline: trueparserFirstline: kafka-flux-wmsrefreshIntervalSeconds: 10tag: fluxwms.*
---
apiVersion: logging.kubesphere.io/v1alpha2
kind: Parser
metadata:labels:logging.kubesphere.io/component: logginglogging.kubesphere.io/enabled: "true"name: kafka-flux-wmsnamespace: kubesphere-logging-system
spec:regex:regex: '^\/data\/business-logs\/[^\s]*'

配置 Filebeat 支持多行日志

查看 kakfka 消息,多行日志仍然被拆分。难道 Filebeat 没有支持多行日志吗?整个落盘日志采集链条中,只要有一个环节不支持多行日志,就会导致结果不及预期。查看项目原始日志文件,发现多行日志以时间格式开头,于是 Filebeat 增加如下配置:

filebeat.inputs:
- type: logenabled: truepaths:{{range .Paths}}- {{.}}{{end}}multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'multiline.negate: truemultiline.match: aftermultiline.max_lines: 100multiline.timeout: 10s
output.console:codec.format:string: '%{[log.file.path]} %{[message]}'
logging.level: warning

进入 Sidecar 容器,使用如下命令测试 Filebeat 输出,确认正确分割多行日志。

$ filebeat -c /etc/logsidecar/filebeat.yaml

不可忽视的容器运行时

按理说,FluentBit 和 Filebeat 都支持了多行日志,kafka 应该可以正确输出多行日志,但结果令人失望。肯定还有哪个环节被遗漏了,在登录集群节点主机查看容器标准输出日志时,这个被忽视的点被发现啦!

## 此处直接查看你的项目容器
$ tail -f /var/log/containers/*.log

你会发现,日志都是 JSON 格式,并且日志是逐行输出的,也就是说,没有支持多行日志块。本地 kubernetes 集群使用 Docker 作为容器运行时,来查看它的配置:

{"log-driver": "json-file","log-opts": {"max-size": "100m","max-file": "3"},"max-concurrent-downloads": 10,"max-concurrent-uploads": 10,"bip": "192.168.100.1/24","storage-driver": "overlay2","storage-opts": ["overlay2.override_kernel_check=true"]
}

log-driver配置为json-file, 这也是官方默认配置,可参考官方说明,除 json 格式外,还支持如下格式:

  • local
  • gelf
  • syslog
  • fluentd
  • loki

显然其他格式也并不理想,而且对于生产环境,切换容器运行时日志格式,影响还是蛮大的。探索至此,这条路子难度偏大风险过高,暂时先搁置,待到身心惬意时接着玩。

去掉中间商,直达 kafka

既然上面的路子走不通,那就换个思路。Filebeat 也是 logging-agent,是支持输出日志到 Kafka 的,为何不省去中间环节,直奔主题呢?

$ kubectl edit cm -n kubesphere-logging-system logsidecar-injector-configmap
filebeat.inputs:
- type: logenabled: truepaths:{{range .Paths}}- {{.}}{{end}}multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'multiline.negate: truemultiline.match: aftermultiline.max_lines: 100multiline.timeout: 10s
output.kafka:enabled: truehosts:- XXX.XXX.XXX.XXX:9092topic: sycx-cmes-app
## output.console:
##   codec.format:
##     string: '%{[log.file.path]} %{[message]}'
logging.level: warning

当看到 Kafka 消费者输出完美多行日志块时,脑后传来多巴胺的快感!再看一眼架构图,咱们来做总结!

总结

最初我去 KubeSphere 社区论坛搜索日志采集相关帖子时,有朋友说无法实现。看到他的回复,心底一阵绝望。如今看来,某种角度上说,他的回答没错,他只是说那条路走不通,但他没说那条路能走通。

本文由博客一文多发平台 OpenWrite 发布!

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...