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

这篇具有很好参考价值的文章主要介绍了KubeSphere 多行日志采集方案深度探索 。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

采集落盘日志

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

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

fluent bit docker多行日志,k8s,容器平台,kubesphere,云计算

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

fluent bit docker多行日志,k8s,容器平台,kubesphere,云计算

fluent bit docker多行日志,k8s,容器平台,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 中。可参考如下配置:

fluent bit docker多行日志,k8s,容器平台,kubesphere,云计算

---
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 消费者输出完美多行日志块时,脑后传来多巴胺的快感!再看一眼架构图,咱们来做总结!

fluent bit docker多行日志,k8s,容器平台,kubesphere,云计算

总结

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

本文由博客一文多发平台 OpenWrite 发布!文章来源地址https://www.toymoban.com/news/detail-783080.html

到了这里,关于KubeSphere 多行日志采集方案深度探索 的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • fluent-bit日志上传到s3-efs

    在线 JSON 工具,JSON 校验/格式化/压缩/工具 - 在线工具-wetools.com微工具 {     \\\"Version\\\": \\\"2012-10-17\\\",     \\\"Statement\\\": [         {             \\\"Effect\\\": \\\"Allow\\\",             \\\"Action\\\": [                 \\\"elasticfilesystem:ClientMount\\\",                 \\\"elasticfilesystem:ClientWrite\\\"             ]

    2024年02月08日
    浏览(25)
  • KubeSphere 镜像构建器(S2I)服务证书过期解决方案

    目前 KubeSphere 所有 3.x.x 版本,如果开启了 DevOps 模块并使用了镜像构建器功能(S2I)都会遇到证书过期问题。 已开启 DevOps 模块 下载这个更新 S2I 服务证书压缩包,上传到任一可以访问 K8s 集群的节点; 把上传的压缩包解压 进入解压后的目录 执行更新证书的脚本 ./update-s2i

    2024年02月22日
    浏览(44)
  • ELK日志记录——Kibana组件——grok 正则捕获插件、mutate数据修改插件、multiline 多行合并插件、date 时间处理插件

    grok 使用文本片段切分的方式来切分日志事件 内置正则表达式调用 %{SYNTAX:SEMANTIC} ●SYNTAX代表匹配值的类型,例如,0.11可以NUMBER类型所匹配,10.222.22.25可以使用IP匹配。 ●SEMANTIC表示存储该值的一个变量声明,它会存储在elasticsearch当中方便kibana做字段搜索和统计,你可以将一

    2024年02月16日
    浏览(48)
  • 1、电商数仓(用户行为采集平台)数据仓库概念、用户行为日志、业务数据、模拟数据、用户行为数据采集模块、日志采集Flume

    数据仓库( Data Warehouse ),是为企业制定决策,提供数据支持的。可以帮助企业,改进业务流程、提高产品质量等。 数据仓库的输入数据通常包括:业务数据、用户行为数据和爬虫数据等。 业务数据:就是各行业在处理事务过程中产生的数据。比如用户在电商网站中登录、

    2024年02月12日
    浏览(44)
  • Nginx 日志采集与分析

    观测云拥有全面的日志采集能力,包括系统日志、应用日志、安全日志等多种日志类型,通过观测云提供的自定义日志采集器可采集任意日志汇总到观测云进行统一存储和分析;通过观测云提供的文本处理器(Pipeline)可对采集的日志进行自定义切割,并把切割出来的字段作

    2024年02月13日
    浏览(45)
  • loki采集docker日志

    说明 本文通过安装 docker loki plugin 直接采集docker容器日志,并推送至loki。官方文档 插件安装 插件升级 插件卸载 使用 单独为一个容器设置日志驱动 为所有的容器设置默认参数 编辑 /etc/docker/daemon.json 文件(如果没有就新建). 更多如 docker-compose 的用法参考官网文档.

    2024年02月15日
    浏览(30)
  • logstash 采集 docker 日志

    1、nginx容器部署 参考:nginx容器部署 将容器内的nginx日志文件映射到宿主机/home/logs/nginx目录下 注意:并且需要需要将日志的输出格式修改为json  2、编辑vim /opt/logstash-7.4.2/config/nginx-log-es.conf 文件,收集docker nginx容器日志 input{  file{    path = \\\"/home/logs/nginx/access.log\\\"    start_p

    2024年02月13日
    浏览(35)
  • ELK 日志采集使用

    Docker 最新版Version 20.10安装_docker最新版本是多少_猿小飞的博客-CSDN博客 安装docker compose_猿小飞的博客-CSDN博客 1.3.1.编写 docker-compose.yml 脚本启动 ELK 服务 忘记了文件在哪里,可以使用下面命令进行查找    1.3.2.创建对应容器挂载目录 针对微服务,我们不同的服务,会专门设置

    2024年02月08日
    浏览(47)
  • 开源日志监控采集平台ELKF

    ---------------------- Filebeat+ELK 部署 ---------------------- Node1节点(2C/4G):node1/192.168.179.20                    Elasticsearch Node2节点(2C/4G):node2/192.168.179.23                    Elasticsearch Apache节点:apache/192.168.179.25                        Logstash  Kibana  Apache F

    2024年02月07日
    浏览(39)
  • 淘宝爬虫评论数据采集的探索之旅

    随着互联网的普及,淘宝作为中国最大的电商平台,每天都有大量的用户在上面购物。为了更好地了解商品的质量和用户的满意度,许多消费者开始关注商品的评论数据。然而,手动翻阅大量的评论不仅耗时,而且容易遗漏重要的信息。因此,我们需要一种自动化工具来帮助

    2024年01月24日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包