KubeSphere 多行日志采集方案深度探索

news2024/11/26 4:31:17

作者:大飞哥,视源电子运维工程师,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: log
  enabled: true
  paths:
  {{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: logging
    logging.kubesphere.io/enabled: "true"
  name: kafka-flux-wms
  namespace: kubesphere-logging-system
spec:
  tail:
    db: /fluent-bit/tail/pos.db
    dbSync: Normal
    memBufLimit: 5MB
    path: /var/log/containers/flux-wms-*.log
    refreshIntervalSeconds: 10
    tag: fluxwms.*
---
apiVersion: logging.kubesphere.io/v1alpha2
kind: Output
metadata:
  annotations:
    kubesphere.io/creator: admin
  labels:
    logging.kubesphere.io/component: logging
    logging.kubesphere.io/enabled: "true"
  name: kafka-flux-wms
  namespace: kubesphere-logging-system
spec:
  kafka:
    brokers: xxx.xxx.xxx.xxx:9092
    topics: my-topic
  match: 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: logging
    logging.kubesphere.io/enabled: "true"
  name: kafka-flux-wms
  namespace: kubesphere-logging-system
spec:
  tail:
    db: /fluent-bit/tail/pos.db
    dbSync: Normal
    memBufLimit: 5MB
    path: /var/log/containers/flux-wms-*.log
    multiline: true
    parserFirstline: kafka-flux-wms
    refreshIntervalSeconds: 10
    tag: fluxwms.*
---
apiVersion: logging.kubesphere.io/v1alpha2
kind: Parser
metadata:
  labels:
    logging.kubesphere.io/component: logging
    logging.kubesphere.io/enabled: "true"
  name: kafka-flux-wms
  namespace: kubesphere-logging-system
spec:
  regex:
    regex: '^\/data\/business-logs\/[^\s]*'

配置 Filebeat 支持多行日志

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

filebeat.inputs:
- type: log
  enabled: true
  paths:
  {{range .Paths}}
  - {{.}}
  {{end}}
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
  multiline.negate: true
  multiline.match: after
  multiline.max_lines: 100
  multiline.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: log
  enabled: true
  paths:
  {{range .Paths}}
  - {{.}}
  {{end}}
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
  multiline.negate: true
  multiline.match: after
  multiline.max_lines: 100
  multiline.timeout: 10s
output.kafka:
  enabled: true
  hosts:
    - XXX.XXX.XXX.XXX:9092
  topic: sycx-cmes-app
## output.console:
##   codec.format:
##     string: '%{[log.file.path]} %{[message]}'
logging.level: warning

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

总结

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/46761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React Server Component: 混合式渲染

作者:谢奇璇 React 官方对 Server Comopnent 是这样介绍的: zero-bundle-size React Server Components。 这是一种实验性探索,但相信该探索是个未来 React 发展的方向,与 React Server Component 相关的周边生态正在积极的建设当中。 术语…

R语言主成分分析可视化(颜值高,很详细)

文章目录PCA特征值可视化提取变量结果变量结果可视化变量和主成分的cos2可视化变量对主成分的贡献可视化Dimension description提取样本结果样本结果可视化样本的cos2可视化样本对主成分的贡献可视化biplot参考资料网络上很多R语言教程都是基于R语言实战进行修改,今…

Mysql密码忘记后怎么重置密码,mysql8之后有改动

mysql8之前的修改方式: 1.管理员身份打开cmd:然后关闭mysql,停止MySQL服务,输入 net stop mysql 停止服务 2.切换到MySQL的bin文件下,输入mysqld --console --skip-grant-tables --shared-memory。 3上个窗口保留不要…

四种类型自编码器AutoEncoder理解及代码实现

自编码器(AE) 自编码器的结构和思想 结构 自编码器是一种无监督的数据压缩和数据特征表达方法。自编码器是神经网络的一种,经过训练后的能尝试将输入复制到输出。自编码器由编码器和解码器组成。如下图所示: 自编码器指的是试图…

电脑键盘功能基础知识,快速入门,抓住这份详细教程

在互联网生活发达的今天,电脑已经成为了学习工作的必备工具。而用来操作电脑的关键,就是我们经常使用的键盘和鼠标。最近有不少的小伙伴来私信小编,希望小编做一个电脑键盘功能基础知识介绍的详细教程。这不,小编应大家要求&#…

视频编解码 - RTP 与 RTCP

目录 RTP 实时传输协议 RTCP协议 将H264 RTP打包 RTP 实时传输协议 音视频数据传输,先将原始数据经过编码压缩后,将码流打包成一个个RTP包,再将码流传输到接收端。 打包的作用 接收端要正确地使用这些音视频编码数据,不仅仅需…

深度学习之路=====12=====>>MNasNet(tensorflow2)

简介 原文: MnasNet: Platform-Aware Neural Architecture Search for Mobile 来源: CVPR2019 作者: Google (Mingxing Tan, Bo Chen, Ruoming Pang, Vijay Vasudevan, Mark Sandler, Andrew Howard, Quoc V. Le) 摘要: 使用神经结构搜索(neural archit…

界面控件DevExpress WPF的主题设计器,可轻松完成应用主题研发

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress WPF的The…

一文详解|高校到底如何开展数据分类分级?

数据安全是高校的生命线,在数据安全合规要求不断升级的大背景下,加强数据有效保护,确保数据安全共享应用,已成为高校信息化建设的前线。 安全高楼平地起,作为数据安全建设的基础工作,通过数据分类分级&…

1541_AURIX_TriCore内核架构_内核调试控制器CDC

全部学习汇总: GitHub - GreyZhang/g_tricore_architecture: some learning note about tricore architecture. 这一份笔记可能会是我近段时间来最后的一份内核学习笔记了。我看了下内核手册分为上下两部分,而下卷主要的内容其实是讲解指令集&#xff0c…

如何用CSS画一个三角形?

hello,大家好,最近在看前端的八股,里面有这样一道题,如何用CSS画出三角形?我想以这个题为例,仔细讲一下这个题的技巧,以及对这道题拓展一下,即如何画出圆形和椭圆形? 首…

GFS分布式

GFS是什么? 1.1 简单介绍 这个问题说大也大,说小也小。GFS是Google File System的缩写,字面意义上就是Google的文件系统,技术层面上来讲,GFS是Google在2003年前后创建的可扩展分布式文件系统 ,用来满足 Goo…

SpringBoot 接收客户端提交数据/参数会使用到相关注解

目录 一.基本介绍 二.接收参数相关注解应用实例 1.需求: 2.应用实例演示 2.1演示PathVariable 使用 2.2.演示RequestHeader 使用 2.3演示RequestParam 使用 2.4演示CookieValue 使用 2.5演示RequestBody 使用 2.6演示RequestAttribute,SessionAttribute 使…

C语言基础知识

目录 第一章 C语言概述 第二章 数据类型 运算符 表达式 第三章 简单的C程序设计 第四章 选择循环结构 第五章 数组 ​第六章 函数 第七章 编译预处理 第八章 指针 第九章 结构体与共用体 第一章 C语言概述 C语言的特点: 语言简洁、紧凑;使用…

安卓实训作孽之Linux命令手册

文章目录前言演示效果项目地址实现UI进度条实现读取文件获取路径进度条刷新总结前言 开局之前先吐槽一句,NC学校,以及NC老师,还要搞两个作品,上午上课下午实训真牛皮(XS)。好了废话不多说我们开始吧&#…

进阶自动化测试,你一定要知道的...

自动化测试指软件测试的自动化,在预设状态下运行应用程序或系统,预设条件包括正常和异常,最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程。 自动化测试框架一般可以分为两个层次,上层是管理整个自动化测试的开发&a…

[Spring]第二篇:IOC控制反转

简单的说就是,创建对象的权利,或者是控制的位置,由JAVA代码转移到spring容器,由spring的容器控制对象的创建,就是控制反转. spring创建对象时,会读取配置文件,配置文件中主要配置接口和实现类的关系,每个接口对相应一个实现类,使用<bean>标签配置,<bean中的id可以随便…

微软S2C2F框架已被OpenSSF开源安全体系采用

近日&#xff0c;微软发布“安全供应链消费框架(Secure Supply Chain Consumption Framework&#xff0c;简称S2C2F)”1.1版本。该框架已被OpenSSF供应链完整性工作组采用。至此&#xff0c;OpenSSF开源软件评价相关的项目和指南已覆盖使用安全、关键性、基础设施安全、漏洞披露…

机器人导航必备的栅格地图数学模型及使用

机器人导航必备的栅格地图数学模型及使用占据栅格地图&#xff08;Occupancy Grid Map&#xff09;占用栅格地图基础概念占据栅格地图的数学模型ROS中使用OccupancyGrid占据栅格地图&#xff08;Occupancy Grid Map&#xff09; 占用栅格地图基础概念 上图就是一个ROS中的占据…

复旦大学-华盛顿大学EMBA项目位列全球第9,学术研究连续3年亚洲第一

2022年10月17日&#xff0c;英国《金融时报》&#xff08;FT&#xff09;发布全球EMBA项目排名&#xff0c;复旦大学-华盛顿大学EMBA项目位列全球第9位&#xff0c;学术研究连续3年亚洲第一&#xff0c;毕业生薪酬水平全球第六。    复旦大学-华盛顿大学EMBA项目是中国大陆…