配置定时任务清理多余的镜像和容器文件
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的意思是如果没有获得锁,则不进行操作。当然,设定为每天执行的话,由于周期较长,可以不用加文件锁。
通过以上操作,系统就会在每天的夜里零点自动检查是否需要清理多余的数据,确保集群运行的资源充足。
原文地址:https://www.cnblogs.com/00986014w/p/12482591.html
- Asp.Net MVC +EntityFramework主从表新增编辑操作的实现(删除操作怎么实现?)
- 模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板模板
- 洛谷P1311 选择客栈
- 洛谷P1607 [USACO09FEB]庙会班车Fair Shuttle
- R语言抓包实战——知乎live二级页面获取
- 左手用R右手Python系列——面向对象编程基础
- 线性同余同余方程组解法(excrt)
- #19. 计数(容斥原理)
- 左手用R右手Python系列——多进程/线程数据抓取与网页请求
- #15. 钻石
- P1328 生活大爆炸版石头剪刀布
- ASP.NET MVC 5 Authentication Breakdown
- jquery easyui datagrid mvc server端分页排序筛选的实现
- 左手用R右手Python系列——使用多进程进行任务处理
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 打卡群刷题总结0801——解码方法
- 动手写简单的嵌入式操作系统二
- C++核心准则E.6:使用RAII防止资源泄露
- C++核心准则E.12: 当不可能或不愿意通过抛出异常退出函数时使用noexcept
- C++核心准则E.13: 直接拥有一个对象所有权时永远不要抛出异常
- C++核心准则E.14:使用根据目的设计的用户定制类型异常(非内置类型)
- C++核心准则E.16:析构函数,内存释放和swap操作永远不能失败
- Eclipse配合GDB和jlinkGDBServer仿真调试STM32
- 单片机程序构架
- 打卡群刷题总结0730——格雷编码
- 常用的vim配置,_vimrc文件
- 算法篇:链表之删除和为0的元素
- 算法篇:链表之反转链表
- 算法篇:链表之排序
- 算法篇:链表之删除链表中重复节点