从节点中移除 Kubernetes 组件

本文介绍如何断开 Rancher 创建的 Kubernetes 集群中的一个节点,并删除该节点中的所有 Kubernetes 组件。此过程允许你将节点用于其他用途。

在通过 Rancher 在基础设施提供商的新节点上安装 Kubernetes 时,会创建资源(容器/虚拟网络接口)和配置项(证书/配置文件)。

从 Rancher 启动的 Kubernetes 集群中移除节点时(前提是它们处于 Active 状态),这些资源会被自动清理,唯一需要的操作是重启节点。如果节点变得不可访问并且无法自动清理进程时,请先执行我们提供的步骤,然后该节点才能重新添加到集群。

移除了什么?

清理使用 Rancher 配置的节点时,会根据要删除的集群节点类型移除以下组件:

移除的组件由基础设施提供商托管的节点自定义节点托管集群注册节点
Rancher deployment 命名空间(默认:cattle-system
由 Rancher 标记的 serviceAccountclusterRolesclusterRoleBindings
标签、注释和终结器
Rancher Deployment
主机、集群、项目和用户的自定义资源定义 (CRD)
management.cattle.io API Group 下创建的所有资源
Rancher v2.x 创建的所有 CRD

通过 Rancher UI 删除集群中的节点

如果节点处于 Active 状态,删除集群中的节点会触发清理节点的进程。完成自动清理后请重启节点,以确保所有非持久性数据已正确删除。

重启节点

  1. # 使用重启
  2. $ sudo reboot
  3. # 使用关机
  4. $ sudo shutdown -r now

手动移除集群中的 Rancher 组件

当节点不可达并已从集群中移除时,由于该节点不可达,则无法触发自动清理过程。请按照以下步骤手动删除 Rancher 组件。

从节点中移除 Kubernetes 组件 - 图1危险

下面列出的命令将删除节点中的数据。在执行命令之前,由于数据将会丢失,请确保你已经备份了要保留的文件。

移除注册集群中的 Rancher 组件

移除注册集群中的 Rancher 的过程略有不同。你可以选择在 Rancher UI 中简单地删除集群,也可以运行脚本从节点中删除 Rancher 组件。两个选项的删除效果是一样的。

将注册集群分离 Rancher 后,集群的工作负载将不受影响,你可以使用与集群注册到 Rancher 之前相同的方法来访问集群。

  • 使用 UI/API
  • 使用脚本

从节点中移除 Kubernetes 组件 - 图2危险

此过程将删除你的集群数据。在执行命令之前,由于数据将会丢失,请确保你已经备份了要保留的文件。

使用 Rancher UI(或 API)删除注册集群后,会发生以下事件:

  1. Rancher 创建一个 serviceAccount,用于删除集群中的 Rancher 组件。此账号分配了 clusterRoleclusterRoleBinding 权限,这些权限是删除 Rancher 组件所必需的。

  2. Rancher 会使用 serviceAccount 调度并运行一个 job,以将 Rancher 组件从集群中清除。该 job 还将 serviceAccount 及其角色作为依赖引用,因此该 job 在完成之前会删除它们。

  3. 已从集群中移除 Rancher。然而,集群仍然存在,运行着原生版本的 Kubernetes。

结果:已删除移除了什么章节中为注册集群列出的所有组件。

你可以运行脚本,而不是使用 Rancher UI 来清理已注册的集群节点。

从节点中移除 Kubernetes 组件 - 图3先决条件:

安装 kubectl

  1. 打开浏览器并导航到 GitHub,然后下载 user-cluster.sh

  2. user-cluster.sh 所在的目录下运行以下命令,使脚本可执行:

    1. chmod +x user-cluster.sh
  3. 仅限离线环境:打开 user-cluster.sh 并将 yaml_url 替换为 user-cluster.yml 中的 URL。

    如果你没有使用离线环境,请跳过此步骤。

  4. 在同一目录中,运行脚本并提供 rancher/rancher-agent 镜像版本,该版本应与用于管理集群的 Rancher 版本相同(<RANCHER_VERSION>):

    从节点中移除 Kubernetes 组件 - 图4提示

    你可以添加 -dry-run 标志来预览脚本的结果,但不进行更改。

    1. ./user-cluster.sh rancher/rancher-agent:<RANCHER_VERSION>

结果:脚本已运行。已删除移除了什么章节中为注册集群列出的所有组件。

清理节点

  • RKE1
  • RKE2
  • K3s

Windows 节点

要清理 Windows 节点,你可以运行位于 c:\\etc\\rancher 中的清理脚本。该脚本删除 Kubernetes 生成的资源并执行二进制文件,还会删除防火墙规则和网络设置。

要运行脚本,你可以在 PowerShell 中运行以下命令:

  1. pushd c:\etc\rancher
  2. .\cleanup.ps1
  3. popd

结果:节点被重置,并可以重新添加到 Kubernetes 集群中。

Docker 容器、镜像和卷

根据你分配给节点的角色,Kubernetes 组件存在于容器、属于覆盖网络的容器、DNS、ingress controller 和 Rancher agent(以及你创建的已调度到此节点的 pod)。

清理所有 Docker 容器、镜像和卷

  1. docker rm -f $(docker ps -qa)
  2. docker rmi -f $(docker images -q)
  3. docker volume rm $(docker volume ls -q)

挂载

Kubernetes 组件和密文会在系统上留下需要卸载的挂载。

挂载
/var/lib/kubelet/pods/XXX(各种挂载)
/var/lib/kubelet
/var/lib/rancher

卸载所有挂载

  1. for mount in $(mount | grep tmpfs | grep '/var/lib/kubelet' | awk '{ print $3 }') /var/lib/kubelet /var/lib/rancher; do umount $mount; done

你需要在通过 Rancher 配置的 RKE2 集群节点上删除两个组件:

  • rancher-system-agent:连接 Rancher 并安装和管理 RKE2
  • RKE2 本身

删除 rancher-system-agent

要删除 rancher-system-agent,请运行 system-agent-uninstall.sh 脚本:

  1. curl https://raw.githubusercontent.com/rancher/system-agent/main/system-agent-uninstall.sh | sudo sh

删除 RKE2

要删除 RKE2,请运行节点上已存在的 rke2-uninstall 脚本:

  1. sudo rke2-uninstall.sh

你需要在通过 Rancher 配置的 K3s 集群节点上删除两个组件:

  • rancher-system-agent:连接 Rancher 并安装和管理 K3s
  • K3s 本身

删除 rancher-system-agent

要删除 rancher-system-agent,请运行 system-agent-uninstall.sh 脚本:

  1. curl https://raw.githubusercontent.com/rancher/system-agent/main/system-agent-uninstall.sh | sudo sh

删除 K3s

要删除 K3s,请运行节点上已存在的 k3s-uninstall 脚本:

  1. sudo k3s-uninstall.sh

目录和文件

以下目录在将节点添加到集群时使用,应将该目录删除。你可以使用 rm -rf /directory_name 来删除目录。

从节点中移除 Kubernetes 组件 - 图5备注

节点分配的角色决定了出现在节点上的目录。

目录
/etc/ceph
/etc/cni
/etc/kubernetes
/etc/rancher
/opt/cni
/opt/rke
/run/secrets/kubernetes.io
/run/calico
/run/flannel
/var/lib/calico
/var/lib/etcd
/var/lib/cni
/var/lib/kubelet
/var/lib/rancher
/var/log/containers
/var/log/kube-audit
/var/log/pods
/var/run/calico

清理目录

  1. rm -rf /etc/ceph \
  2. /etc/cni \
  3. /etc/kubernetes \
  4. /etc/rancher \
  5. /opt/cni \
  6. /opt/rke \
  7. /run/secrets/kubernetes.io \
  8. /run/calico \
  9. /run/flannel \
  10. /var/lib/calico \
  11. /var/lib/etcd \
  12. /var/lib/cni \
  13. /var/lib/kubelet \
  14. /var/lib/rancher\
  15. /var/log/containers \
  16. /var/log/kube-audit \
  17. /var/log/pods \
  18. /var/run/calico

网络接口和 iptables

其余两个更改/配置的组件是(虚拟)网络接口和 iptables 规则。两者都对节点不持久,这意味着它们将在节点重新启动后被清除。要删除这些组件,建议重新启动它们。

重启节点

  1. # 使用重启
  2. $ sudo reboot
  3. # 使用关机
  4. $ sudo shutdown -r now

如果你想了解更多关于(虚拟)网络接口或 iptables 规则的信息,请参阅下面的具体内容。

网络接口

从节点中移除 Kubernetes 组件 - 图6备注

节点所在的集群所配置的网络提供商决定了节点上将出现的接口。

接口
flannel.1
cni0
tunl0
caliXXXXXXXXXXX (random interface names)
vethXXXXXXXX (random interface names)

列出所有接口

  1. # 使用 ip
  2. ip address show
  3. # 使用 ifconfig
  4. ifconfig -a

删除接口

  1. ip link delete interface_name

Iptables

从节点中移除 Kubernetes 组件 - 图7备注

节点所在的集群所配置的网络提供商决定了节点上将出现的链。

iptables 规则用于将流量从容器路由到容器。创建的规则不是持久性的,因此重新启动节点会将 iptables 恢复到原始状态。

cali-failsafe-in
cali-failsafe-out
cali-fip-dnat
cali-fip-snat
cali-from-hep-forward
cali-from-host-endpoint
cali-from-wl-dispatch
cali-fw-caliXXXXXXXXXXX (random chain names)
cali-nat-outgoing
cali-pri-kns.NAMESPACE (chain per namespace)
cali-pro-kns.NAMESPACE (chain per namespace)
cali-to-hep-forward
cali-to-host-endpoint
cali-to-wl-dispatch
cali-tw-caliXXXXXXXXXXX (random chain names)
cali-wl-to-host
KUBE-EXTERNAL-SERVICES
KUBE-FIREWALL
KUBE-MARK-DROP
KUBE-MARK-MASQ
KUBE-NODEPORTS
KUBE-SEP-XXXXXXXXXXXXXXXX (random chain names)
KUBE-SERVICES
KUBE-SVC-XXXXXXXXXXXXXXXX (random chain names)

列出所有 iptables 规则

  1. iptables -L -t nat
  2. iptables -L -t mangle
  3. iptables -L