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

卸载 K3s 后,crictl 仍能列出旧容器、镜像,或 ip link 显示残留的 CNI 接口(如 cni0、flannel.1、br-* 等),说明底层运行时(containerd)和网络配置未被清除。这不是 crictl 本身的问题,而是 K3s 卸载不彻底导致的资源滞留。
确认残留容器和镜像是否真实存在
先验证这些“残留”是否还在运行或驻留:
- 执行
crictl ps -a查看所有容器状态;若显示Exited或Unknown,说明它们只是元数据未清理,实际进程已不存在 - 运行
crictl images检查镜像列表;大量镜像或旧版本 k3s 系统镜像(如rancher/pause、docker.io/traefik)属于典型残留 - 用
sudo ctr -n k8s.io containers list和sudo 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 -a和crictl images,应为空或仅剩基础 pause 镜像(重装后会自动拉取)
清除 CNI 网络接口和 iptables 规则
K3s 默认使用 Flannel 或 Calico,卸载后常遗留虚拟网卡和防火墙链:
- 查看残留接口:
ip link show | grep -E "(cni|flannel|cilium|br-)" - 逐一删除(示例):
sudo ip link delete cni0、sudo ip link delete flannel.1 - 清空 K3s 相关 iptables 链:
sudo iptables -t nat -F KUBE-SERVICES、sudo 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等精简参数,减少初始化组件,降低残留风险










