凡心所向,素履以往;生如逆旅,一苇以航

k8s + containerd 定期清理磁盘

当然可以!你可以使用一个脚本每天清理 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同时监控磁盘使用率来决定是否执行清理,我也可以帮你扩展它。需要的话继续说就行。

评论栏