
一、背景
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/下日志文件不会切割,日志会持续膨胀。 - 可能原因:
- docker runtime接口不支持
ReopenContainerLog这个rpc调用; - k8s>=1.24 默认开启kubelet内置日志轮转
containerLogMaxSize / containerLogMaxFiles,该功能仅完整支持containerd,docker runtime无法实现reopen,于是抛出这个错误。
- docker runtime接口不支持
注意:这不是容器业务报错,是kubelet日志管理模块和docker的兼容性bug。CentOS7 + docker + k8s1.24出现。
三、解决方案
(临时规避,不改runtime,生产常用)
关闭 kubelet 内置容器日志轮转,交给docker驱动本身做日志轮转。
- 修改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
- 重启kubelet
bash
systemctl daemon-reload
systemctl restart kubelet
设置为0代表禁用kubelet侧日志轮转,不再调用reopen接口,该Error就不会再打印。
日志切割交由docker daemon的log‑driver配置接管。
- 配置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轮转。
- 不要忽略,生产环境会导致节点磁盘被容器日志打满。