配置定时任务清理多余的镜像和容器文件
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的意思是如果没有获得锁,则不进行操作。当然,设定为每天执行的话,由于周期较长,可以不用加文件锁。
通过以上操作,系统就会在每天的夜里零点自动检查是否需要清理多余的数据,确保集群运行的资源充足。