适用版本: Ubuntu 20.04 / 22.04 / 24.04
适用场景: 完全清理 kubeadm 部署的 Kubernetes 集群,恢复节点到安装前状态
目录
1. 卸载前准备
1.1 确认当前集群状态
在 Master 节点 上执行,了解集群现状:
kubectl get nodes -o wide
kubectl get pods -A
kubectl get svc -A
1.2 备份重要数据(如需要)
如果集群中有重要数据,请先备份:
# 备份 etcd(Master 节点)
sudo ETCDCTL_API=3 etcdctl snapshot save /tmp/etcd-backup.db --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key
# 导出所有资源清单
kubectl get all --all-namespaces -o yaml > /tmp/k8s-all-resources.yaml
1.3 清理用户应用(可选)
# 删除所有非系统命名空间下的资源
kubectl delete deployments,services,ingresses --all --all-namespaces
# 或删除特定命名空间
kubectl delete namespace <your-namespace>
2. Master 节点:安全移除 Worker 节点
如果是单节点集群,可跳过此步骤。
2.1 驱逐节点上的 Pod
在 Master 节点 上,对每个 Worker 节点执行:
# 驱逐节点上的 Pod(保留 DaemonSet 管理的 Pod)
kubectl drain <node-name> --delete-emptydir-data --force --ignore-daemonsets
# 示例
kubectl drain k8s-node1 --delete-emptydir-data --force --ignore-daemonsets
kubectl drain k8s-node2 --delete-emptydir-data --force --ignore-daemonsets
2.2 从集群中删除节点
kubectl delete node <node-name>
# 示例
kubectl delete node k8s-node1
kubectl delete node k8s-node2
此时 Worker 节点上的 Pod 会被驱逐,Master 节点会重新调度这些 Pod(如果有其他节点)。
3. 所有节点:重置 kubeadm
以下步骤需要在 所有节点(Master 和 Worker)上执行。
3.1 重置 kubeadm
sudo kubeadm reset -f
这会执行以下操作:
-
移除 etcd 成员(如果是控制平面节点)
-
停止并清理 kubelet 管理的容器
-
删除
/etc/kubernetes/manifests下的静态 Pod 清单 -
删除 kubeadm 生成的证书和配置文件
3.2 如果 reset 卡住或失败
如果 kubeadm reset 因容器运行时问题失败,可手动清理:
# 强制停止 kubelet
sudo systemctl stop kubelet
# 手动清理容器(使用 crictl)
sudo crictl --runtime-endpoint unix:///run/containerd/containerd.sock rm -af
# 或使用 nerdctl
sudo nerdctl rm -f $(sudo nerdctl ps -aq)
# 然后重新执行 reset
sudo kubeadm reset -f
4. 所有节点:卸载软件包
4.1 解除版本锁定
sudo apt-mark unhold kubelet kubeadm kubectl kubernetes-cni
4.2 卸载 Kubernetes 相关包
# 卸载 Kubernetes 核心组件
sudo apt-get purge -y kubeadm kubectl kubelet kubernetes-cni kube*
# 清理不再需要的依赖
sudo apt-get autoremove -y
4.3 检查残留包
dpkg -l | grep -E 'kube|k8s'
如有残留,手动卸载:
sudo apt-get purge -y <package-name>
5. 所有节点:清理文件和目录
5.1 清理 Kubernetes 配置文件和数据
# 用户 kubectl 配置
rm -rf ~/.kube
# Kubernetes 系统配置
sudo rm -rf /etc/kubernetes
# Kubelet 数据和配置
sudo rm -rf /var/lib/kubelet
sudo rm -rf /var/lib/dockershim
# etcd 数据(控制平面节点)
sudo rm -rf /var/lib/etcd
sudo rm -rf /var/etcd
# Kubernetes 运行时数据
sudo rm -rf /var/run/kubernetes
# CNI 配置
sudo rm -rf /etc/cni
sudo rm -rf /opt/cni
# AppArmor 配置(如存在)
sudo rm -f /etc/apparmor.d/docker
# systemd 相关
sudo rm -f /etc/systemd/system/kubelet.service
sudo rm -rf /etc/systemd/system/kubelet.service.d
sudo rm -f /etc/systemd/system/etcd*
sudo rm -f /etc/systemd/system/kube-proxy.service
# 日志文件
sudo rm -rf /var/log/pods
sudo rm -rf /var/log/containers
sudo rm -rf /var/log/kube-audit
# 其他可能存在的目录
sudo rm -rf /var/lib/calico
sudo rm -rf /var/lib/cni
sudo rm -rf /var/lib/weave
5.2 清理 kubelet 环境变量文件
sudo rm -f /var/lib/kubelet/kubeadm-flags.env
sudo rm -f /etc/default/kubelet
sudo rm -f /etc/sysconfig/kubelet
6. 所有节点:清理网络配置
6.1 删除 CNI 创建的虚拟网络接口
# 删除 Calico 创建的接口
ip link | grep cali | awk -F: '{print $2}' | xargs -I{} sudo ip link delete {} 2>/dev/null
# 删除 tunl0(IPIP 隧道接口)
sudo ip link delete tunl0 2>/dev/null
# 删除 vxlan.calico(VXLAN 接口)
sudo ip link delete vxlan.calico 2>/dev/null
# 删除 Flannel 创建的接口
sudo ip link delete flannel.1 2>/dev/null
sudo ip link delete cni0 2>/dev/null
# 删除其他可能的 CNI 接口
sudo ip link delete weave 2>/dev/null
sudo ip link delete docker0 2>/dev/null
6.2 清理网络命名空间
# 查看网络命名空间
sudo ls /var/run/netns/
# 删除 Kubernetes 相关的网络命名空间
for ns in $(sudo ls /var/run/netns/ 2>/dev/null | grep -E 'cni|k8s'); do
sudo ip netns delete "$ns" 2>/dev/null
done
6.3 清理路由表
# 查看并清理 Kubernetes/CNI 相关的路由
ip route | grep -E 'cali|tunl|flannel|weave|192.168|10.244'
# 清理 CNI 网桥(如 cni0、docker0)
sudo ip link set cni0 down 2>/dev/null
sudo ip link delete cni0 2>/dev/null
7. 所有节点:清理防火墙规则
7.1 清理 iptables 规则
# 清理 filter 表
sudo iptables -F
sudo iptables -X
# 清理 NAT 表
sudo iptables -t nat -F
sudo iptables -t nat -X
# 清理 mangle 表
sudo iptables -t mangle -F
sudo iptables -t mangle -X
# 清理 raw 表
sudo iptables -t raw -F
sudo iptables -t raw -X
# 清理 security 表(如果存在)
sudo iptables -t security -F 2>/dev/null
sudo iptables -t security -X 2>/dev/null
7.2 清理 IPVS 规则(如使用 kube-proxy IPVS 模式)
# 安装 ipvsadm(如未安装)
sudo apt-get install -y ipvsadm
# 清除所有 IPVS 规则
sudo ipvsadm --clear
# 验证
sudo ipvsadm -Ln
7.3 清理 ebtables(桥接防火墙)
sudo ebtables -F 2>/dev/null
sudo ebtables -X 2>/dev/null
7.4 清理 UFW 规则(如之前为 K8s 开放过端口)
# 查看当前规则
sudo ufw status numbered
# 删除 K8s 相关规则(根据编号删除)
# sudo ufw delete <编号>
# 或重置 UFW(谨慎操作!)
# sudo ufw reset
8. 所有节点:停止并清理服务
8.1 停止并禁用服务
# 停止 kubelet
sudo systemctl stop kubelet 2>/dev/null
sudo systemctl disable kubelet 2>/dev/null
# 停止 containerd(如果也打算卸载)
sudo systemctl stop containerd 2>/dev/null
sudo systemctl disable containerd 2>/dev/null
8.2 重载 systemd
sudo systemctl daemon-reload
sudo systemctl reset-failed
8.3 清理 systemd 残留
sudo rm -rf /run/systemd/system/kubelet.service.d
sudo rm -f /run/systemd/system/kubelet.service
9. 可选:卸载容器运行时
如果你也想完全移除 containerd:
9.1 卸载 containerd
# 停止服务
sudo systemctl stop containerd
sudo systemctl disable containerd
# 卸载包
sudo apt-get purge -y containerd.io containerd runc
sudo apt-get autoremove -y
9.2 清理 containerd 数据
# 清理 containerd 数据目录
sudo rm -rf /var/lib/containerd
sudo rm -rf /run/containerd
sudo rm -rf /opt/containerd
# 清理 containerd 配置
sudo rm -rf /etc/containerd
# 清理 nerdctl 配置
sudo rm -rf /usr/local/lib/systemd/system/nerdctl*
9.3 清理 crictl 配置
rm -f ~/.crictl.yaml
sudo rm -f /etc/crictl.yaml
10. 可选:恢复系统配置
10.1 恢复 Swap(如需要)
# 重新启用 swap
sudo sed -i '/swap/s/^#//' /etc/fstab
sudo swapon -a
10.2 恢复 sysctl 配置
# 删除 Kubernetes 相关的 sysctl 配置
sudo rm -f /etc/sysctl.d/k8s.conf
sudo rm -f /etc/sysctl.d/99-kubernetes-cri.conf
# 重新加载
sudo sysctl --system
10.3 恢复内核模块配置
# 删除模块加载配置
sudo rm -f /etc/modules-load.d/k8s.conf
sudo rm -f /etc/modules-load.d/containerd.conf
10.4 恢复 hosts 文件
# 编辑 /etc/hosts,删除 Kubernetes 相关的条目
sudo sed -i '/k8s-master/d' /etc/hosts
sudo sed -i '/k8s-node/d' /etc/hosts
10.5 清理 APT 源
# 删除 Kubernetes APT 源
sudo rm -f /etc/apt/sources.list.d/kubernetes.list
sudo rm -f /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 更新索引
sudo apt-get update
11. 一键卸载脚本
将以下脚本保存为 uninstall-k8s.sh,在所有节点上执行:
#!/bin/bash
set -e
echo "========================================"
echo " Kubernetes 完全卸载脚本 (Ubuntu)"
echo "========================================"
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 1. 重置 kubeadm
echo -e "${YELLOW}[1/8] 正在重置 kubeadm...${NC}"
sudo kubeadm reset -f 2>/dev/null || true
# 2. 停止服务
echo -e "${YELLOW}[2/8] 正在停止服务...${NC}"
sudo systemctl stop kubelet 2>/dev/null || true
sudo systemctl disable kubelet 2>/dev/null || true
sudo systemctl stop containerd 2>/dev/null || true
sudo systemctl disable containerd 2>/dev/null || true
sudo systemctl daemon-reload
# 3. 卸载软件包
echo -e "${YELLOW}[3/8] 正在卸载软件包...${NC}"
sudo apt-mark unhold kubelet kubeadm kubectl kubernetes-cni 2>/dev/null || true
sudo apt-get purge -y kubeadm kubectl kubelet kubernetes-cni kube* 2>/dev/null || true
sudo apt-get autoremove -y
# 4. 清理文件和目录
echo -e "${YELLOW}[4/8] 正在清理文件和目录...${NC}"
rm -rf ~/.kube
sudo rm -rf /etc/kubernetes
sudo rm -rf /var/lib/kubelet
sudo rm -rf /var/lib/dockershim
sudo rm -rf /var/lib/etcd
sudo rm -rf /var/etcd
sudo rm -rf /var/run/kubernetes
sudo rm -rf /etc/cni
sudo rm -rf /opt/cni
sudo rm -rf /var/lib/cni
sudo rm -rf /var/lib/calico
sudo rm -rf /var/log/pods
sudo rm -rf /var/log/containers
sudo rm -f /etc/default/kubelet
sudo rm -f /etc/sysconfig/kubelet
sudo rm -f /var/lib/kubelet/kubeadm-flags.env
sudo rm -f /etc/systemd/system/kubelet.service
sudo rm -rf /etc/systemd/system/kubelet.service.d
sudo rm -f /etc/systemd/system/kube-proxy.service
# 5. 清理网络接口
echo -e "${YELLOW}[5/8] 正在清理网络接口...${NC}"
ip link | grep cali | awk -F: '{print $2}' | xargs -I{} sudo ip link delete {} 2>/dev/null || true
sudo ip link delete tunl0 2>/dev/null || true
sudo ip link delete vxlan.calico 2>/dev/null || true
sudo ip link delete flannel.1 2>/dev/null || true
sudo ip link delete cni0 2>/dev/null || true
sudo ip link delete weave 2>/dev/null || true
# 6. 清理 iptables 和 IPVS
echo -e "${YELLOW}[6/8] 正在清理防火墙规则...${NC}"
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X
sudo iptables -t raw -F
sudo iptables -t raw -X
sudo ipvsadm --clear 2>/dev/null || true
# 7. 清理容器运行时(可选,取消注释以启用)
# echo -e "${YELLOW}[7/8] 正在卸载 containerd...${NC}"
# sudo apt-get purge -y containerd.io containerd runc 2>/dev/null || true
# sudo rm -rf /var/lib/containerd
# sudo rm -rf /etc/containerd
# 8. 清理 APT 源
echo -e "${YELLOW}[8/8] 正在清理 APT 源...${NC}"
sudo rm -f /etc/apt/sources.list.d/kubernetes.list
sudo rm -f /etc/apt/keyrings/kubernetes-apt-keyring.gpg
sudo apt-get update
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN} Kubernetes 卸载完成!${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""
echo "建议执行以下操作:"
echo " 1. 重启系统: sudo reboot"
echo " 2. 验证卸载: sudo dpkg -l | grep -E 'kube|k8s'"
echo " 3. 检查接口: ip link show"
echo " 4. 检查规则: sudo iptables -L -n -v"
使用方法:
chmod +x uninstall-k8s.sh
./uninstall-k8s.sh
12. 验证卸载结果
12.1 检查软件包
dpkg -l | grep -E 'kube|k8s|containerd'
# 应该没有任何输出
12.2 检查进程
ps aux | grep -E 'kube|etcd|containerd' | grep -v grep
# 应该没有任何输出
12.3 检查网络接口
ip link show | grep -E 'cali|tunl|flannel|cni|weave'
# 应该没有任何输出
12.4 检查 iptables 规则
sudo iptables -L -n -v
# 应该只有默认的 INPUT/FORWARD/OUTPUT 链
sudo iptables -t nat -L -n -v
# 应该只有默认的 PREROUTING/INPUT/OUTPUT/POSTROUTING 链
12.5 检查端口占用
sudo ss -tlnp | grep -E '6443|10250|2379|2380|10257|10259'
# 应该没有任何输出
12.6 检查磁盘空间
# 查看是否还有 Kubernetes 相关的大文件
sudo du -sh /var/lib/kubelet 2>/dev/null || echo "/var/lib/kubelet 已清理"
sudo du -sh /var/lib/etcd 2>/dev/null || echo "/var/lib/etcd 已清理"
sudo du -sh /var/lib/containerd 2>/dev/null || echo "/var/lib/containerd 已清理"
常见问题
Q1: kubeadm reset 提示无法连接到容器运行时?
# 手动指定 CRI socket
sudo kubeadm reset -f --cri-socket unix:///run/containerd/containerd.sock
Q2: 卸载后无法重新安装 Kubernetes?
确保完全清理后再安装:
# 再次确认清理
sudo rm -rf /etc/kubernetes /var/lib/kubelet /var/lib/etcd
sudo iptables -F && iptables -t nat -F && iptables -t mangle -F
sudo reboot
Q3: 网络接口删除失败(Device or resource busy)?
# 先关闭接口再删除
sudo ip link set <interface-name> down
sudo ip link delete <interface-name>
Q4: 卸载后 Docker/Containerd 容器还在运行?
# 强制停止所有容器
sudo nerdctl rm -f $(sudo nerdctl ps -aq) 2>/dev/null || true
sudo ctr -n k8s.io c rm $(sudo ctr -n k8s.io c ls -q) 2>/dev/null || true
文档生成时间: 2026-08-24