当然可以!你可以使用一个脚本每天清理 containerd 不再使用的镜像、内容、快照等,释放磁盘空间。
✅ 脚本目标
- 清理未使用的镜像、内容(blobs)、快照
- 自动化执行,无需人工干预
- 输出日志方便排查
📜 脚本内容(/usr/local/bin/containerd_gc.sh
)
#!/bin/bash
# containerd GC 脚本
# 运行前请确保 containerd 工具 `ctr` 可用
set -euo pipefail
# 日志文件(可按需修改)
LOG_FILE="/var/log/containerd_gc.log"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Starting containerd GC..." >> "$LOG_FILE"
# 清理未使用的镜像
echo "Pruning unused images..." >> "$LOG_FILE"
ctr images prune -a >> "$LOG_FILE" 2>&1 || echo "image prune failed" >> "$LOG_FILE"
# 清理未引用的内容 blobs
echo "Pruning unused content..." >> "$LOG_FILE"
ctr content prune >> "$LOG_FILE" 2>&1 || echo "content prune failed" >> "$LOG_FILE"
# 清理未挂载的快照
echo "Pruning unused snapshots..." >> "$LOG_FILE"
ctr snapshots prune >> "$LOG_FILE" 2>&1 || echo "snapshot prune failed" >> "$LOG_FILE"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Done." >> "$LOG_FILE"
🧪 手动测试
保存为文件并赋执行权限:
chmod +x /usr/local/bin/containerd_gc.sh
手动执行一次看看效果:
/usr/local/bin/containerd_gc.sh
cat /var/log/containerd_gc.log
🕓 设置 crontab,每天凌晨 3 点执行
编辑定时任务:
crontab -e
添加:
0 3 * * * /usr/local/bin/containerd_gc.sh
✅ 注意事项
- 确保
ctr
命令在环境变量路径中(一般是/usr/bin/ctr
) - 如果你用的是非 root 用户,需要加
sudo
或配置权限 - 不会影响正在运行的容器,也不会清理 kubelet 使用中的镜像
如果你希望这个脚本能 只清理镜像占用空间大的 Pod 或 同时监控磁盘使用率来决定是否执行清理,我也可以帮你扩展它。需要的话继续说就行。