如何清理Kubernetes集群中containerd overlayfs快照目录内未被当前Pod使用的旧内容
如何清理Kubernetes集群中containerd overlayfs快照目录内未被当前Pod使用的旧内容
我来给你梳理几个靠谱的解决办法,完全不用手动去碰快照目录(手动删风险太高,搞不好会搞挂运行中的Pod):
手动触发containerd垃圾回收(最快见效)
containder本身自带垃圾回收机制,默认会自动清理,但你可以手动触发立刻清理掉未被当前Pod引用的镜像和快照:- 要是不想直接SSH登节点,用kubectl的debug功能就能临时进入目标节点:
kubectl debug node/<你的节点名称> -it --image=busybox - 在节点的调试容器里,执行containerd的GC命令(记得指定
k8s.io命名空间,K8s的所有镜像和快照都存在这个命名空间下):# 清理未被引用的镜像 ctr -n k8s.io images gc # 清理未被使用的快照 ctr -n k8s.io snapshots gc
这两个命令会自动识别并删除所有没被当前运行的Pod或容器引用的镜像层和快照,正好解决你遇到的旧版本内容残留问题。
- 要是不想直接SSH登节点,用kubectl的debug功能就能临时进入目标节点:
配置kubelet垃圾回收策略(长期自动生效)
kubelet本身也管着节点上的镜像和容器资源,你可以调整它的GC策略,让它更积极地清理无用资源:- 编辑kubelet的配置文件(通常是
/var/lib/kubelet/config.yaml,不同集群路径可能有差异),添加或修改以下参数:
意思是当节点磁盘使用率超过80%时,kubelet会触发镜像GC,直到磁盘使用率降到60%以下,这个阈值你可以根据自己节点的磁盘情况调整。imageGCHighThresholdPercent: 80 imageGCLowThresholdPercent: 60 - 保存配置后重启kubelet服务:
systemctl restart kubelet
这样之后kubelet会自动根据磁盘使用情况清理无用的镜像和快照,不用再手动触发。
- 编辑kubelet的配置文件(通常是
验证清理效果
执行完GC后,你可以做这些检查确认旧内容已经被清理:- 查看快照目录的内容变化:
对比清理前的快照数量,应该会明显减少。ls /apps/data/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/ - 用containerd命令查看当前存在的快照,确认没有未被引用的旧快照:
ctr -n k8s.io snapshots list - 再次进入当前运行的Pod,确认软件版本是最新的,之前快照目录里的旧版本内容已经不存在。
- 查看快照目录的内容变化:
备注:内容来源于stack exchange,提问作者Mihir




