Administrator
发布于 2026-08-25 / 1 阅读
0
0

Ubuntu 系统完整卸载 Kubernetes 指南

适用版本: Ubuntu 20.04 / 22.04 / 24.04

适用场景: 完全清理 kubeadm 部署的 Kubernetes 集群,恢复节点到安装前状态


目录

  1. 卸载前准备

  2. Master 节点:安全移除 Worker 节点

  3. 所有节点:重置 kubeadm

  4. 所有节点:卸载软件包

  5. 所有节点:清理文件和目录

  6. 所有节点:清理网络配置

  7. 所有节点:清理防火墙规则

  8. 所有节点:停止并清理服务

  9. 可选:卸载容器运行时

  10. 可选:恢复系统配置

  11. 一键卸载脚本

  12. 验证卸载结果


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

参考: Kubernetes 官方文档 | kubeadm reset 文档


评论