1. 为什么需要彻底清理Kubernetes残留很多朋友在Ubuntu上卸载Kubernetes后以为执行几条apt remove命令就完事了。直到某天重新安装k8s时遇到各种诡异报错或者系统出现莫名其妙的端口占用这才发现之前的卸载根本不彻底。我去年就遇到过这种情况——明明已经卸载了所有组件但系统里还藏着几十个kube开头的配置文件导致新集群始终无法正常初始化。Kubernetes在安装过程中会散布各种文件到系统各处。除了常见的/usr/bin目录下的可执行文件还会在/etc下存放配置文件在/var/lib下存储数据在/opt下放置CNI插件甚至可能修改内核模块。如果只是简单用apt remove卸载这些散兵游勇就会成为日后系统问题的定时炸弹。2. 标准卸载流程2.1 基础组件卸载先执行标准卸载三板斧这能处理掉90%的可见组件kubeadm reset -f sudo apt-get purge --auto-remove kubernetes-cni kubeadm kubectl kubelet特别注意这里的purge参数比普通remove更彻底它会连配置文件一起删除。有次我忘记加这个参数结果/etc/kubernetes目录下的配置文件全部保留了下来导致后来重装时kubeadm一直读取旧配置。2.2 手动清理关键目录接下来要像扫雷一样清理这些目录rm -rf ~/.kube/ # 删除kubectl配置文件 rm -rf /etc/kubernetes/ # 清除集群配置 rm -rf /etc/systemd/system/kubelet.service* # 移除服务单元 rm -rf /usr/bin/kube* # 删除二进制文件 rm -rf /etc/cni /opt/cni # 清理网络插件 rm -rf /var/lib/etcd # etcd数据目录特别注意/opt/cni这个目录很多人在清理时都会漏掉。有次我在AWS上遇到节点网络异常排查半天发现是旧CNI插件没删干净和新安装的Calico产生了冲突。3. 深度清理技巧3.1 使用find命令地毯式搜索执行完基础清理后我们需要用find命令在全盘搜索漏网之鱼find / -name *kube* 2/dev/null find / -name *etcd* 2/dev/null这个命令会列出所有包含kube或etcd关键字的文件。我建议先不加-delete参数运行一次检查输出结果是否包含重要文件。上周有个同事不小心把/home目录下的kubeconfig也删了里面保存着生产环境的访问凭证。确认无误后再执行删除find / -name *kube* -delete find / -name *etcd* -delete3.2 处理空目录有些目录在文件删除后会变成空目录特别是k8s 1.24版本find / -type d -name *kube* -empty -delete这个命令专门删除名为kube的空目录。我在清理测试服务器时发现/var/lib下竟有17个这样的空目录。4. 依赖项处理4.1 检查残留软件包用dpkg检查是否有漏网的k8s相关包dpkg -l | grep -E kube|etcd|cni如果发现残留用aptitude处理依赖问题比apt更可靠sudo apt install aptitude sudo aptitude purge ~nkubernetes|~nkube|~netcd|~ncni有次我在Ubuntu 22.04上遇到依赖地狱apt死活不让卸载换成aptitude后它给出了更合理的依赖解决方案。4.2 容器运行时清理如果是k8s 1.24版本记得单独清理containerdsudo apt-get purge --auto-remove containerd.io还要检查docker是否还在sudo apt-get purge docker-ce docker-ce-cli5. 常见问题解决5.1 依赖冲突处理当看到这种报错时The following packages have unmet dependencies: libegl-mesa0 : Depends: libgbm1 ( 22.0.1-1ubuntu2.1) but 22.0.5-0ubuntu0.1 is to be installed E: Error, pkgProblemResolver::Resolve generated breaks可以尝试sudo apt --fix-broken install sudo apt autoremove如果还不行就用aptitude的交互式解决方案sudo aptitude install libgbm1它会给出多个解决方案选项通常选第一个降级方案就能解决。5.2 内核模块清理Kubernetes可能会加载ipip等内核模块lsmod | grep -E ipip|tunnel sudo modprobe -r ipip我在某台机器上发现即使卸载k8s后ipip模块仍然自动加载后来发现是/etc/modules-load.d/下还有个k8s的配置文件。6. 终极检查清单执行完所有步骤后建议做最后检查# 检查进程 ps aux | grep -E kube|etcd # 检查端口 ss -tulnp | grep -E 6443|2379|2380 # 检查内核模块 lsmod | grep -E ipip|br_netfilter # 最终扫描 find / -name *kube* 2/dev/null find / -name *etcd* 2/dev/null如果所有命令都返回空恭喜你系统已经回到安装k8s前的纯净状态。最后别忘了执行sudo apt autoremove sudo apt clean我在实际运维中发现按照这个流程操作后重新安装k8s的成功率能达到100%再也不会出现各种灵异问题了。特别是那些需要频繁搭建测试环境的开发者一定要养成彻底清理的好习惯。