kubeadm reset 不足以彻底卸载 kubernetes,必须配合手动清理残留目录、网络接口、iptables 规则和容器运行时;go 环境若仅用于构建 kubectl/kubeadm,通常无需单独清理,但若混用(如 gopath 下存有自定义二进制或模块缓存),需针对性处理。

直接说结论:kubeadm reset 不足以彻底卸载 Kubernetes,必须配合手动清理残留目录、网络接口、iptables 规则和容器运行时;Go 环境若仅用于构建 kubectl/kubeadm,通常无需单独清理,但若混用(如 GOPATH 下存有自定义二进制或模块缓存),需针对性处理。
为什么 kubeadm reset 不能单独完成卸载
它只负责重置 kubelet 状态、清空 /var/lib/etcd 和 /etc/kubernetes/ 下的部分内容,但以下几类残留必然存在:
-
kubeadm reset不停用或卸载kubelet、kube-proxy服务,它们可能在重启后自动拉起旧配置 - 不删除 CNI 插件生成的网络接口(如
cni0、flannel.1)和/etc/cni/net.d/目录 - 不清理
iptables或nftables中由 kube-proxy 写入的规则,导致后续部署时端口转发异常 - 不触碰容器运行时(
docker或containerd)的数据目录,/var/lib/docker或/var/lib/containerd仍存镜像与容器 - 不处理用户级配置,如
$HOME/.kube/config,该文件残留会导致kubectl仍尝试连接旧集群 API
关键残留目录与对应清理命令
所有节点(master + worker)都必须执行以下清理,顺序不能颠倒:
- 先停服务:
systemctl stop kubelet kube-proxy containerd docker(按实际使用的运行时选) - 删核心数据:
rm -rf /etc/kubernetes/ /var/lib/kubelet/ /var/lib/etcd/ /etc/cni/net.d/ $HOME/.kube/ - 删证书(尤其 worker 节点):
rm -f /etc/kubernetes/pki/ca.crt(避免重装时被误复用) - 删网络接口:
ip link delete cni0 2>/dev/null; ip link delete flannel.1 2>/dev/null; ip link delete cali+ 2>/dev/null(+ 表示通配,calico 接口名带前缀) - 清 iptables:
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
Go 环境是否需要清理?看你怎么用
绝大多数 Kubernetes 集群部署场景中,Go 只是编译工具链,不是运行依赖。是否清理取决于你如何安装和使用 Go:
- 若通过系统包管理器(
apt install golang或yum install golang)安装,且未修改GOPATH,卸载 Kubernetes 时 完全不用动 Go - 若手动解压 Go 二进制到
/usr/local/go,且未在$GOROOT或$GOPATH下存放 k8s 源码、自定义工具(如kubebuilder、controller-gen),也无需清理 - 若你在
$GOPATH/src/k8s.io下 clone 过 kubernetes 仓库,或$GOPATH/bin存有自己 build 的kubectl/kubeadm,建议清理:rm -rf $GOPATH/src/k8s.io $GOPATH/bin/{kubectl,kubeadm,kubelet} - 模块缓存(
$GOMODCACHE)体积大但安全,可留着;若要清,执行:go clean -modcache
自动化脚本里最容易漏掉的三件事
写一键卸载脚本时,这三个点几乎每次都会被跳过,导致重装失败:
- 忘记在
kubeadm reset前加--force,脚本卡在交互式确认([reset] Are you sure you want to proceed? [y/N]:) - 没检查
cri-socket路径,默认用/var/run/dockershim.sock,但 containerd 环境下必须显式传--cri-socket=/run/containerd/containerd.sock - 忽略
systemd缓存,清理完所有文件后未执行systemctl daemon-reload && systemctl reset-failed,导致kubelet服务状态异常
真正干净的节点,不是“看起来没东西”,而是 systemctl list-units --state=active | grep kube 无输出、ls /etc/kubernetes/ 报错“No such file”,且 ip link show 里找不到任何 cni 或 flannel 相关接口。











