K3s 卸载/重装后残留大量 crictl 容器和网络接口怎么清理

1次阅读

卸载 K3s 后残留容器、镜像及 CNI 接口,是因 containerd 和网络配置未彻底清理;需用 ctr 命令删除底层资源,清除 CNI 网卡与 iptables 规则,并清空 /var/lib/rancher/k3s 等目录。

K3s 卸载 / 重装后残留大量 crictl 容器和网络接口怎么清理

卸载 K3s 后,crictl 仍能列出旧容器、镜像,或 ip link 显示残留的 CNI 接口(如 cni0flannel.1br-* 等),说明底层运行时(containerd)和网络配置未被清除。这不是 crictl 本身的问题,而是 K3s 卸载不彻底导致的资源滞留。

确认残留容器和镜像是否真实存在

先验证这些“残留”是否还在运行或驻留:

  • 执行 crictl ps -a 查看所有容器状态;若显示 ExitedUnknown,说明它们只是元数据未清理,实际进程已不存在
  • 运行 crictl images 检查镜像列表;大量 镜像或旧版本 k3s 系统镜像(如 rancher/pausedocker.io/traefik)属于典型残留
  • sudo ctr -n k8s.io containers listsudo ctr -n k8s.io images list 直接查 containerd 底层,比 crictl 更准确

强制清理 containerd 中的闲置容器与镜像

crictl 不提供“批量删除所有未使用镜像”的一键命令,需组合操作:

  • 停止 containerd:sudo systemctl stop containerd
  • 删除所有容器(含已退出):sudo ctr -n k8s.io containers delete $(sudo ctr -n k8s.io containers list -q)
  • 删除所有镜像(谨慎!确保无其他服务依赖):sudo ctr -n k8s.io images rm $(sudo ctr -n k8s.io images list -q)
  • 重启 containerd:sudo systemctl start containerd
  • 再运行 crictl ps -acrictl images,应为空或仅剩基础 pause 镜像(重装后会自动拉取)

清除 CNI 网络接口和 iptables 规则

K3s 默认使用 Flannel 或 Calico,卸载后常遗留虚拟网卡和 防火墙 链:

  • 查看残留接口:ip link show | grep -E "(cni|flannel|cilium|br-)"
  • 逐一删除(示例):sudo ip link delete cni0sudo ip link delete flannel.1
  • 清空 K3s 相关 iptables 链:sudo iptables -t nat -F KUBE-SERVICESsudo iptables -t filter -F KUBE-FIREWALL;更彻底可执行 sudo iptables -P FORWARD ACCEPT && sudo iptables -t nat -F && sudo iptables -t filter -F && sudo iptables -t mangle -F(注意:这会清除所有自定义规则)
  • 检查挂载点是否残留:mount | grep -i cni|k8s|overlay;若有,用 sudo umount /var/lib/cni 或对应路径卸载

验证并防止下次重装再次残留

清理完成后建议做两件事:

  • 确认关键目录已清空:/var/lib/rancher/k3s/etc/k3s/var/lib/cni/run/flannel/var/run/containerd/io.containerd.runtime.v2.task/k8s.io
  • 重装前先停掉相关服务:sudo systemctl stop k3s* containerd kubelet,避免新进程复用旧状态
  • 如用脚本重装,加 --disable traefik --disable servicelb --disable local-storage 等精简参数,减少初始化组件,降低残留风险
text=ZqhQzanResources