kubelet 报错如下:docker does not support reopening container log files

一、背景

kubelet 报错如下:docker does not support reopening container log files

k8s v1.28.2

centos7

bash 复制代码
Aug 27 12:52:11 jwdy02 kubelet[72445]: E0827 12:52:11.209556   72445 
container_log_manager.go:268] "Failed to rotate log for container" err="failed to rotate log 
\"/var/log/pods/kuboard_prometheus-adapter-7c86d7c8dc-vj97g_1db0604d-e46f-4ba2-9b42-ba1d76394b2a/prometheus-adapter/7.log\": failed to reopen container log 
\"7e1f76f473b796bf2f3ff8c799fadf07cb2ce9945aed683b85cfdf56f00d760b\": rpc error: code = Unknown desc = docker does not support reopening container log files" 
path="/var/log/pods/kuboard_prometheus-adapter-7c86d7c8dc-vj97g_1db0604d-e46f-4ba2-9b42-ba1d76394b2a/prometheus-adapter/7.log" 
containerID="7e1f76f473b796bf2f3ff8c799fadf07cb2ce9945aed683b85cfdf56f00d760b"

二、报错解析

bash 复制代码
failed to reopen container log files
container_log_manager.go:268 Failed to rotate log for container

K8s v1.28 + docker(我这边用的不是containerd),kubelet 日志轮转逻辑对docker runtime不支持reopen日志文件。

  • 现象:journalctl -u kubelet -f 持续刷这个Error;Pod本身可以正常运行;只是容器日志无法被kubelet做内部轮转 ,/var/log/pods/下日志文件不会切割,日志会持续膨胀。
  • 可能原因:
    1. docker runtime接口不支持ReopenContainerLog这个rpc调用;
    2. k8s>=1.24 默认开启kubelet内置日志轮转 containerLogMaxSize / containerLogMaxFiles,该功能仅完整支持containerd,docker runtime无法实现reopen,于是抛出这个错误。

注意:这不是容器业务报错,是kubelet日志管理模块和docker的兼容性bug。CentOS7 + docker + k8s1.24出现。

三、解决方案

(临时规避,不改runtime,生产常用)

关闭 kubelet 内置容器日志轮转,交给docker驱动本身做日志轮转。

  1. 修改kubelet配置 /var/lib/kubelet/config.yaml
yaml 复制代码
# 关闭kubelet的容器日志轮转
containerLogMaxSize: "0Mi" //单个容器日志文件的最大大小
containerLogMaxFiles: 2 //最多保留 2 个日志文件

查看修改结果:

yaml 复制代码
# 校验添加结果
[root@jwdy02 ~]# grep containerLogMax /var/lib/kubelet/config.yaml
containerLogMaxSize: "0Mi"
containerLogMaxFiles: 2
  1. 重启kubelet
bash 复制代码
systemctl daemon-reload
systemctl restart kubelet

设置为0代表禁用kubelet侧日志轮转,不再调用reopen接口,该Error就不会再打印。

日志切割交由docker daemon的log‑driver配置接管。

  1. 配置docker日志轮转(必须配置,否则容器日志无限增长)
    编辑 /etc/docker/daemon.json,增加log‑opts配置:
json 复制代码
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "5"
  }
}

重启docker生效:

bash 复制代码
systemctl daemon-reload
systemctl restart docker

⚠️ 注意:已经运行的Pod不会自动继承docker新日志配置,需要重建Pod才生效。

四、验证

修改完,观察kubelet日志:

bash 复制代码
journalctl -u kubelet -f

不再出现 docker does not support reopening container log files 这条错误。

五、额外说明

  • 该报错不会直接让Pod崩溃,业务可以跑,但如果不做日志限制,会耗尽磁盘,一定要配置docker json‑file轮转。
  • 不要忽略,生产环境会导致节点磁盘被容器日志打满。

END

相关推荐
TTATTC3 小时前
为什么 Python 做 Agent 总在并发中崩溃?拆解 Blockcell 在 Rust 下的 Host-Cell 隔离与自愈状态机
docker·开源
fb_123455 小时前
K8s存储与配置核心实战
云原生·容器·kubernetes
骑着蜗牛撵大象3275 小时前
N1 小盒子撑起 AI 接口中转层:New-API 接管本地 Ollama,用 Token 分发模型能力
docker·llama·1024程序员节·api网关·飞牛nas·new-api
艸肅5 小时前
Docker 国内镜像源配置
linux·ubuntu·docker·1024程序员节
java_logo5 小时前
Docker 部署 Bililive-go:轻松搭建多平台直播录制
docker·1024程序员节·直播录制·轩辕镜像·bililive-go·chigusa/bililive-go
A-刘晨阳6 小时前
【云原生】nerdctl 部署及使用指南
运维·docker·kubernetes·云计算·1024程序员节·nerdctl
bigbig_ben11 小时前
yearning安装docker
运维·docker·容器
IT小小猪20 小时前
从零搭建K8s 集群
云原生·容器·kubernetes
吴声子夜歌21 小时前
Docker入门与实战——热门镜像介绍
运维·docker·容器