GKE中Fluentbit报‘cannot adjust chunk size’错误的排查与解决
GKE集群Fluentbit Pod持续重启报错排查与解决
问题现象
Fluentbit以DaemonSet部署在GKE集群,搭配Fluentd做日志聚合,初期运行正常,现在Pod持续报错重启,核心错误信息如下:
Fluentbit日志
[2023/07/18 08:08:22] [error] [storage] cannot adjust chunk size '/fluent-bit/buffer//emitter.3/1-1689072144.132487045.flb' to 4096 bytes [lib/chunkio/src/cio_file_unix.c:528 errno=28] No space left on device [lib/chunkio/src/cio_file.c:1116 errno=28] No space left on device ... [2023/07/18 08:08:22] [error] [sqldb] error=disk I/O error [2023/07/18 08:08:22] [error] [input:tail:tail.0] db: could not create 'in_tail_files' table [2023/07/18 08:08:22] [error] failed initialize input tail.0 [2023/07/18 08:08:22] [error] [lib] backend failed
Pod事件
> kubectl describe po fluent-bit-xmkj6 ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Pulling 51m (x1718 over 6d3h) kubelet Pulling image "cr.fluentbit.io/fluent/fluent-bit:2.0.5" Warning BackOff 96s (x43323 over 6d3h) kubelet Back-off restarting failed container
错误分析
从日志中的errno=28 No space left on device可明确:Fluentbit使用的磁盘空间耗尽,引发连锁问题:
- 无法调整buffer目录下的chunk文件大小,存储功能失效
- Tail插件无法创建/打开日志跟踪数据库
/fluent-bit/buffer/logs.db,输入插件初始化失败 - Fluentbit引擎启动失败,触发kubelet的BackOff重启机制
磁盘耗尽的核心诱因:
- Fluentbit的buffer目录(
/fluent-bit/buffer/)使用节点本地存储(如emptyDir)或未限制大小的PVC,持续堆积未发送的日志chunk - 输出端Fluentd异常(宕机、处理速度慢),导致Fluentbit无法正常发送日志,buffer不断累积
- rewrite_tag插件使用
filesystem存储策略,生成大量emitter chunk文件占用空间
解决步骤
临时应急恢复
清理磁盘空间
- 进入异常Pod清理buffer目录旧文件:
kubectl exec -it fluent-bit-xmkj6 -- rm -rf /fluent-bit/buffer/* - 若使用emptyDir,直接删除Pod重建(emptyDir会自动清空):
kubectl delete po fluent-bit-xmkj6 - 检查GKE节点磁盘占用,清理冗余文件(如旧镜像、过期日志):
kubectl debug node/<node-name> -it --image=ubuntu # 进入节点后执行df -h查看磁盘,清理无用文件
- 进入异常Pod清理buffer目录旧文件:
临时调整存储策略
将rewrite_tag的存储改为memory,避免磁盘堆积:
修改fluent-bit.conf中两个rewrite_tag插件配置:[FILTER] Name rewrite_tag ... Emitter_Storage.type memory重启Fluentbit DaemonSet:
kubectl rollout restart daemonset fluent-bit
长期优化方案
配置存储大小限制
在[SERVICE]段添加存储限制参数,避免buffer无限占用空间:[SERVICE] ... storage.max_chunks_size 1G # 设置buffer总大小上限 storage.expire_time 24h # 自动删除24小时前的chunk文件优化rewrite_tag插件配置
- 若允许丢失部分日志,将
Emitter_Storage.type设为memory;若需持久化,添加大小限制:[FILTER] Name rewrite_tag ... Emitter_Storage.type filesystem Emitter_Storage.limit_size 500M # 设置每个emitter的存储上限 - 调整匹配规则,避免重复处理同一条日志:
[FILTER] Name rewrite_tag Match kube.** !dev.service.* # 只匹配未被第一个rewrite_tag处理的日志 ...
- 若允许丢失部分日志,将
检查输出端Fluentd状态
- 确认Fluentd Pod运行状态:
kubectl get po -n <fluentd-namespace> - 查看Fluentd日志,排查连接错误、处理瓶颈:
kubectl logs <fluentd-pod-name> -n <fluentd-namespace>
- 确认Fluentd Pod运行状态:
调整Fluentbit存储卷配置
- 使用PVC挂载buffer目录,设置合适存储大小(如10G):
# DaemonSet的volumeMounts配置 volumeMounts: - name: fluentbit-buffer mountPath: /fluent-bit/buffer volumes: - name: fluentbit-buffer persistentVolumeClaim: claimName: fluentbit-buffer-pvc - 若使用emptyDir,添加sizeLimit限制:
volumes: - name: fluentbit-buffer emptyDir: sizeLimit: 5Gi
- 使用PVC挂载buffer目录,设置合适存储大小(如10G):
配置节点日志轮转
通过DaemonSet部署logrotate,配置/var/log/containers/目录的日志轮转规则,避免原生日志文件过大占用空间。
内容的提问来源于stack exchange,提问作者Ellisein
相关产品推荐
相关产品推荐

