一次生产 KubeSphere 日志无法正常采集事件解决记录

作者:宇轩辞白,运维研发工程师,目前专注于云原生、Kubernetes、容器、Linux、运维自动化等领域。

前言

2023 年 11 月 7 号下午,研发同事反馈,项目线上日志平台某个服务无法查看近期的日志。我登上 KubeSphere 平台进行查看,发现日志收集展示停留在 10 月 15 号那天,而其它的服务是正常的。

问题跟踪定位分析

结合已有的经验积累,我做了如下猜想:

  • 一种原因,是不是日志系统对应的 PVC 存储卷被打满了,导致日志索引被锁定,间接影响服务的日志采集呢?
  • 另一种原因,日志采集工具 Fluent Bit 缓冲区资源配置无法满足当前的日志输出量,也会导致该问题的出现。

为了验证上述的猜想,我展开了详细排查:

  • 把 es 的接口放开,查询索引状态,看看有没有被锁定的。
  • 确认无法收集日志容器所在的 node 节点,并找与之对应同 node 节点的 Fluent Bit 容器服务,查看 Fluent Bit 日志输出是否存在异常信息。

登录到 node 节点查看 Fluent Bit 服务日志信息,关键信息如下:

[2023/07/23 00:15:37][ warn] [http_client] cannot increase buffer: current=512000 requested=544768 max=512000
{"log":"[2023/11/08 10:26:33][ warn] [input] tail.2 paused (mem buf overlimit)\n","stream":"stderr","time":"2023-11-08T10:26:33.406030339Z"}

报错问题分析 1

tail.2 paused (mem buf overlimit) 表示 tail 输入插件在 Fluent Bit 中的实例 tail.2 因为内存缓冲区超出限制而被暂停。 这个告警信息意味着 Fluent Bit 的内存缓存区超过了先前设置的"memBuflimit"限制的大小,导致插件被暂停。之后,存储缓冲区超过限制时被恢复,这可能代表着 Fluent Bit 尝试将一些缓冲数据写入目标存储介质。

这通常是由于日志产生的速度过快,而内存缓冲区无法及时处理并写入到输出目标中,结合问题现象来看,那就不难说明日志为啥在 10 月 25 号之后就没有采集展示了。

报错问题分析 2

根据日志信息中 [ warn] [http_client] cannot increase buffer: current=32000 requested=64768 max=32000 可知,在 HTTP 客户端无法增加缓冲区大小。当前的缓冲区大小为 32000B(也就是默认大小为 32KB 字节),无法满足请求。由于项目是初期建设,日志平台参数都没有进行优化调整,都保持默认值,因此当日志量级达到一定的级别就会出现该问题,且无法动态调整。

解决方案

针对上述问题,这里可以尝试通过以下方案去解决该问题:

  • 增加 memBufLimit 的值,调整内存缓冲区大小:根据具体情况,可以增加 memBufLimit 的大小,以提供更多内存缓冲区空间处理更多的日志。但需要注意,增加内存缓冲区的大小可能会占用更多的内存资源,因此需要确保系统有足够的内存资源。另外可以调整存储缓冲区大小。根据告警信息,存储缓冲区大小为 128KB,可以考虑增加存储缓冲区大小,以适应更大的数据负载。

  • 调整 Buffer_Size 的值,调整缓冲区大小:根据实际具体情况,适当增加 Buffer_Size 的大小。

  • 优化日志收集和处理过程:评估当前的日志收集和处理流程,查找可能导致日志快速增长的原因,并采取相应的措施来优化日志生成和处理速度。例如,限制日志的输出频率,对日志进行压缩或者聚合等。

  • 调整日志处理的配置:结合实际情况,调整 Fluent Bit 的配置来更好地适应日志生成和处理需求。例如,可以使用更快的输出插件,调整日志过滤器或者解析器的配置等。

参数剖析

在 Fluent Bit(日志收集和转发工具)的场景中,memBufLmitbuffer_size 是两个相关但是不同的参数。

  • memBufLmit(内存缓冲区限制):

memBufLimit 是 Fluent Bit 中内存缓冲区大小限制,它定义了 Fluent Bit 在内存中分配给缓冲区的最大空间,当缓冲区达到这个限制时,后续的数据将不再接受和处理。

memBufLimit 可以用来限制 Fluent Bit 处理大量日志所使用的内存大小,以防止它过度消耗系统资源,配合合理的 memBufLimit 值可以帮助确保 Fluent Bit 在接受的内存范围内运行,并避免因内存不足导致性能下降或者崩溃。

  • buffer_size(缓冲区大小):

buffer_size 是 Fluent Bit 在输出插件中使用的一个参数,用于定义缓冲区的大小,缓冲区用于将日志数据暂存在内存中,以便在一次性批量处理/传输到目标存储或者服务时提高效率。

buffer_size 可以影响日志数据的传输和内存的消耗,较大的缓冲区可以减少传输的次数,提高效率,但也会占用更多的内存,较小的缓冲区可能会导致更频繁的传输,但会减少内存的消耗。根据具体情况调整缓冲区大小可以平衡传输速度和内存占用。

总结来说,在 Fluent Bit 场景中,memBufLimitbuffer_size 的作用如下:

  • memBufLimit 用于限制 Fluent Bit 整体内存缓冲区的大小,以确保其在合理的内存范围内运行。

  • buffer_size 用于控制输出插件的缓冲区大小,以提高传输效率和内存消耗。

问题解决

在"定制资源定义(CRD)"->input->"tail" 修改 memBufLimit 参数限制大小,可参考下图:

在"定制资源定义(CRD)"->Output->"es" 修改 bufferSize 参数大小,可参考下图:

修改完毕之后,随后进行验证日志是否正常展示。参数大小一定要根据自己生产环境的配置进行调整,如果服务器节点性能配置不是很高,那么参数调整之后会严重影响业务,造成 Node 节点负载过高,本人因为这个调整被狠狠地坑过一次。下方截图是当时触发了告警,因为参数调整之后,大量的日志疯狂的刷新,导致节点流量带宽以及负载暴涨。

此时可以查看下 Fluent Bit 容器输出日志是否正常。

参考文档信息

  • https://docs.fluentbit.io/manual/v/1.8/administration/buffering-and-storage
  • https://docs.fluentbit.io/manual/v/1.8/administration/scheduling-and-retries
  • https://docs.fluentbit.io/manual/v/1.8/pipeline/outputs/elasticsearch
  • https://docs.fluentbit.io/manual/v/1.8/pipeline/filters/kubernetes
  • https://docs.fluentbit.io/manual/v/1.8/pipeline/inputs/tail

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

StarRocks Awards 2023 年度贡献人物

2023 年行将结束。这一年,StarRocks 继续全方位大步向前迈进,在 300 贡献者的辛勤建设下,社区先后发布了 50 版本,并完成了从全场景 OLAP 到云原生湖仓的进化。 贡献者们的每一行代码、每一场布道,推动着 StarRocks 社…

亲测,Chatgpt4.0充值(虚拟卡充值)

一、准备工作: 1、一个ChatGPT3.5账号 2、一张支持ChatGPT4.0的虚拟卡 二、流程【网页版充值】 充值前请先确认以下三点: 1,ChatGPT账户正常登陆。 2,充值过程中始终保持美区环境,且开启全局模式。 3&#xff0…

【数据库原理】(21)查询处理过程

关系型数据库系统的查询处理流程是数据库性能的关键,该流程涉及到将用户的查询请求转化成有效的数据检索操作。通常可以分为四个阶段:查询分析、查询处理、查询优化和查询执行,如图所示。 第一步:查询分析 这个阶段是整个查询处理的起点。数…

实现多级缓存(Redis+Caffeine)

文章目录 多级缓存的概述多级缓存的优势 多级缓存的概述 在高性能的服务架构设计中,缓存是一个不可或缺的环节。在实际的项目中,我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中,只有当缓存的访问没有命中时再查询数据库。在…

读《Mixtral of Experts》

摘要 稀疏混合专家(SMoE) 语言模型Mixtral 8x7B(那大概可以理解成他是一个缝合怪,把所有的任务模型缝合到一起,然后有一个类似打分投票的路由机制来针对输入问题选择任务子模型从而得到针对性的结果。)。Mi…

尝试添加服务器中正在运行的docker容器时报错:当前用户没有运行“docker”的权限

尝试添加服务器中正在运行的docker容器时报错:当前用户没有运行“docker”的权限 环境 1,通过vscode ssh到服务器的 2,服务器端有一个contianer,但是无法通过vscode的Dev contianer组件将服务器中正在运行的contianer添加过来 3…

python爬虫实战(9)--获取澎pai热榜

1. 需要的类包 import pandas as pd import requests2. 请求地址 通过分析,数据可以直接从接口获取,无需解析页面标签,直接取出我们需要的数据即可。 def fetch_hot_news(api_url):response requests.get(api_url)if response.status_cod…

设计模式——解释器模式

更多内容,前往IT-BLOG 在软件开发中,会遇到有些问题多次重复出现,而且有一定的相似性和规律性。如果将它们归纳成一种简单的表达式(例如:正则表达式等),那么这些问题实例将是该表达式的一些句子…

yolov5_master的下载、环境搭建、数据处理及训练全过程

本文借用了以下微博的文章,觉得写的比较全,所以照抄了过来,并且搭建了一遍可以正常训练,在这里作为笔记以后用的时候方便找,这个yolov5_master的使用可以将pth模型文件转换为onnx文件,进而转换为rknn文件&a…

Hotspot源码解析-第十七章-虚拟机万物创建(三)

17.4 Java堆空间内存分配 分配Java堆内存前,我们先通过两图来了解下C堆、Java堆、内核空间、native本地空间的关系。 1、从图17-1来看,Java堆的分配其实就是从Java进程运行时堆中选中一块内存区域来映射 2、从图17-2,可以看中各内存空间的…

HTTPS详解及openssl简单使用

OpenSSL 中文手册 | OpenSSL 中文网 本文介绍https传输协议中涉及的概念,流程,算法,如何实现等相关内容。 HTTP传输过程 HTTP 之所以被 HTTPS 取代,最大的原因就是不安全,至于为什么不安全,看了下面这张图…

200行C++代码写一个QT串口助手

前言 今天分享一个用QT写的串口助手,关键代码会直接在文章的对应位置贴出,完整的工程文件(用的VS 2019)可以进入我的主页免费下载,也可以关注我的公众号“折途想要敲代码” 回复关键词“qt串口助手”免费获取。 …