kubernetes部署服务后,会不断生成日志最终导致/var/lib/docker下生成很多日志,以及/var/lib/docker/overlay占用很大,导致磁盘存满。一般有两种情况:无用的镜像和容器太多或者容器输出的日志太大

无用镜像和容器太多

#查看具体占用情况
[root@k8s02 ~]# docker system df -v

#用于清理磁盘,删除关闭的容器、无用的数据卷和网络以及无tag的镜像
[root@k8s02 ~]# docker system prune

#可以将没有容器使用Docker镜像都删掉。注意这两个命令会把你暂时关闭的容器以及暂时没有用到的Docker镜像都删掉了
[root@k8s02 ~]# docker system prune -a

docker system prune,该指令默认会清除所有如下资源:

  • 已停止的容器(container)

  • 未被任何容器所使用的卷(volume)

  • 未被任何容器所关联的网络(network)

  • 所有悬空镜像(image)

该指令默认只会清除悬空镜像,未被使用的镜像不会被删除,添加-a或--all参数后,可以一并清除所有未使用的镜像和悬空镜像,可以添加-f或--force参数用以忽略相关告警确认信息,使用时候请根据实际谨慎使用

手工清理

镜像清理

如果通过docker system df分析是镜像占用了过高空间,则可以根据业务情况,评估相关镜像的使用情况,对于悬空和未使用的镜像可以使用如下指令手工清理

#删除所有悬空镜像,但不会删除未使用镜像:
[root@k8s02 ~]# docker rmi $(docker images -f "dangling=true" -q)

#删除所有未使用镜像和悬空镜像
#【说明】:轮询到还在被使用的镜像时会有类似"image is being used by xxx container"的告警信息,所以相关镜像不会被删除,忽略即可
[root@k8s02 ~]# docker rmi $(docker images-q)

卷清理

如果通过docker system df分析,是卷占用了过高空间,则可以根据业务情况评估相关卷的使用情况,对于未被任何容器调用的卷(-v 结果信息中,“LINKS” 显示为 0)可以使用如下指令手工清理

#删除所有未被任何容器关联引用的卷
[root@k8s02 ~]# docker volume rm $(docker volume ls -qf dangling=true)

#也可以直接使用如下指令,删除所有未被任何容器关联引用的卷(但建议使用上面的方式)
#【说明】:轮询到还在使用的卷时,会有类似"volume is in use"的告警信息,所以相关卷不会被删除,忽略即可
[root@k8s02 ~]# docker volume rm $(docker volume ls -q)

容器清理

如果通过docker system df分析,是某个容器占用了过高空间,则可以根据业务情况评估相关容器的业务归属并进行处理,对于已停止或其它异常状态的容器可以结合-f或--filter筛选器,使用类似如下指令来手工清理

#删除所有已退出的容器
[root@k8s02 ~]# docker rm -v $(docker ps -aq -f status=exited)
#删除所有状态为dead的容器
[root@k8s02 ~]# docker rm -v $(docker ps -aq -f status=dead)

容器输出日志太大

容器长时间运行,容器打印了大量的日志未清理,最终导致/var/lib/docker/containers下生成很多日志,占据了大量磁盘空间

脚本处理

编写cleanlog.sh脚本

#!/bin/sh
DISK_USAGE=$(df -h / | awk 'NR==2{print $5}' | cut -d'%' -f1)
if [[ $DISK_USAGE -gt 80 ]]; then
    echo "========= start clean /var/lib/docker/containers/ logs ============"
    logs=$(find /var/lib/docker/containers/ -name *-json.log)
    for log in $logs; do
        echo "clean logs : $log"
        cat /dev/null >$log
    done

    echo "======== end clean /var/lib/docker/containers/ logs ==============="
else
    echo "Disk usage is below 80%."
fi

Docker参数配置

添加log-driver和log-opts,重启docker生效,配置如下:

[root@k8s02 ~]# cat /etc/docker/daemon.json 
{
    "exec-opts": ["native.cgroupdriver=systemd"],
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "100m",
        "max-file": "10"
    },
...
    "storage-opts":["overlay2.override_kernel_check=true"],
    "live-restore": true
}

说明:

"max-size":"100m" 表示一个容器日志大小上限是100M

"max-file":"10" 表示一个容器有十个日志,分别是id+.json、id+1.json...id+10.json

文章作者: 鲜花的主人
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 爱吃可爱多
Docker Docker
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝