You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何清理Kubernetes集群中containerd overlayfs快照目录内未被当前Pod使用的旧内容

如何清理Kubernetes集群中containerd overlayfs快照目录内未被当前Pod使用的旧内容

我来给你梳理几个靠谱的解决办法,完全不用手动去碰快照目录(手动删风险太高,搞不好会搞挂运行中的Pod):

  • 手动触发containerd垃圾回收(最快见效)
    containder本身自带垃圾回收机制,默认会自动清理,但你可以手动触发立刻清理掉未被当前Pod引用的镜像和快照:

    1. 要是不想直接SSH登节点,用kubectl的debug功能就能临时进入目标节点:
      kubectl debug node/<你的节点名称> -it --image=busybox
      
    2. 在节点的调试容器里,执行containerd的GC命令(记得指定k8s.io命名空间,K8s的所有镜像和快照都存在这个命名空间下):
      # 清理未被引用的镜像
      ctr -n k8s.io images gc
      # 清理未被使用的快照
      ctr -n k8s.io snapshots gc
      

    这两个命令会自动识别并删除所有没被当前运行的Pod或容器引用的镜像层和快照,正好解决你遇到的旧版本内容残留问题。

  • 配置kubelet垃圾回收策略(长期自动生效)
    kubelet本身也管着节点上的镜像和容器资源,你可以调整它的GC策略,让它更积极地清理无用资源:

    1. 编辑kubelet的配置文件(通常是/var/lib/kubelet/config.yaml,不同集群路径可能有差异),添加或修改以下参数:
      imageGCHighThresholdPercent: 80
      imageGCLowThresholdPercent: 60
      
      意思是当节点磁盘使用率超过80%时,kubelet会触发镜像GC,直到磁盘使用率降到60%以下,这个阈值你可以根据自己节点的磁盘情况调整。
    2. 保存配置后重启kubelet服务:
      systemctl restart kubelet
      

    这样之后kubelet会自动根据磁盘使用情况清理无用的镜像和快照,不用再手动触发。

  • 验证清理效果
    执行完GC后,你可以做这些检查确认旧内容已经被清理:

    1. 查看快照目录的内容变化:
      ls /apps/data/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/
      
      对比清理前的快照数量,应该会明显减少。
    2. 用containerd命令查看当前存在的快照,确认没有未被引用的旧快照:
      ctr -n k8s.io snapshots list
      
    3. 再次进入当前运行的Pod,确认软件版本是最新的,之前快照目录里的旧版本内容已经不存在。

备注:内容来源于stack exchange,提问作者Mihir

火山引擎 最新活动