配置定时任务清理多余的镜像和容器文件

k8s集群运行久了,难免会产生大量无用的镜像和容器文件,因此需要经常进行清理。

一般而言,docker容器默认的本地数据存储路径位于/var/lib/docker路径下,通过df -h /var/lib/docker命令,可以查看其占用情况。如果高于80%,则意味着需要清理了。

一、清理命令

与清理容器多余数据相关的命令有两条,分别是:

docker image prune -af
docker system prune -f

其中,第一条命令是仅仅清除没有被容器使用的镜像文件,第二条命令是清除多余的数据,包括停止的容器、多余的镜像、未被使用的volume等等,比第一条命令包含的内容多。

以上两条命令可以通过一个脚本clean.sh统一执行:

#! /bin/bash 

need_clean() {
    used=`df -h /var/lib/docker | awk -F"[ %]+" '/dev/{print $5}'`
    if [[ $used -ge 80 ]]; then
        return 0
    fi
    
    return 1

}

if need_clean; then
    docker image prune -af
    if need_clean; then
        docker system prune -f
    fi
fi

这里通过awk获取df -h的结果中的占用比例那一栏。-F"[ %]+"的意思是指定若干个空格或%为分隔符,从而将百分数中的%剔除。

只有当占用比例大于80%时才执行清除命令。如果执行第一条命令后降到了80%以下,则不用再执行下一条命令。

二、创建定时任务

脚本写完了,但是我们希望机器能自动在合适的时间运行它。这就需要定时任务了。

linux中创建定时任务其实很简单。系统中如果运行了crond程序,则只需要在/var/spool/cron目录下创建一个以用户名命名的文件,crond即可自动在合适的时间运行它。

比如我们以root用户管理机器,就在/var/spool/cron目录下创建一个root文件:

@daily   bash /usr/local/bin/clean.sh

将脚本拷贝到/usr/local/bin目录下(当然也可以是别的目录),那么crond就会在每天的午夜零点执行这个脚本。

三、添加文件锁

有一种可能的情况是,如果将运行脚本的时间设定为每分钟执行,则有可能出现上一个命令还没执行完,下一个命令就来了。这时就会造成混乱。为了应对这种情况,需要通过flock命令,为文件添加锁。于是上面的root文件可以改写为:

@daily  flock -n /tmp/.cleanlock -c "bash /usr/local/bin/clean.sh"

其中,/tmp/.cleanlock可以随便指定。-n的意思是如果没有获得锁,则不进行操作。当然,设定为每天执行的话,由于周期较长,可以不用加文件锁。

通过以上操作,系统就会在每天的夜里零点自动检查是否需要清理多余的数据,确保集群运行的资源充足。

posted @ 2020-03-12 20:46  右威卫大将军  阅读(1320)  评论(0编辑  收藏  举报