从节点中移除 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 状态,删除集群中的节点会触发清理节点的进程。完成自动清理后请重启节点,以确保所有非持久性数据已正确删除。

重启节点

# 使用重启
$ sudo reboot

# 使用关机
$ sudo shutdown -r now

手动移除集群中的 Rancher 组件

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

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

移除注册集群中的 Rancher 组件

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

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

  • 使用 UI/API

  • 使用脚本

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

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

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

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

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

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

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

先决条件:

安装 kubectl

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

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

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

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

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

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

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

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

清理节点

  • RKE1

  • RKE2

  • K3s

在运行以下命令之前,首先通过 Rancher UI 删除节点。

要删除节点:

  1. 点击 并选择集群管理

  2. 在集群表中,单击节点所属集群的名称。

  3. 在第一个选项卡中,单击节点状态旁边的复选框。

  4. 单击删除

要删除整个集群而不是单个节点,或者不使用 Rancher UI 重新移动节点,请按照以下步骤操作:

  1. 从节点中删除 Docker 容器并卸载任何卷。

  2. 重启节点。

  3. 删除所有剩余的文件。

  4. 确认在重新启动后已正确清理网络接口和 IP 表。否则请再重启一次。

Windows 节点

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

pushd c:\etc\rancher
.\cleanup.ps1
popd

运行此脚本后,节点将重置并可以重新添加到 Kubernetes 集群。

Docker 容器、镜像和卷

清理 Docker 容器时要小心。以下命令将删除节点上的所有 Docker 容器、镜像和卷,包括与 Rancher 无关的容器:

docker rm -f $(docker ps -qa)
docker rmi -f $(docker images -q)
docker volume rm $(docker volume ls -q)

挂载

Kubernetes 组件和 secret 会留下以下挂载:

  • /var/lib/kubelet

  • /var/lib/rancher

  • /var/lib/kubelet/pods/ 中的其他挂载

要卸载所有挂载,请运行:

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 脚本:

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

删除 RKE2

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

sudo rke2-uninstall.sh

你需要从 Rancher 提供的 K3s 节点中删除以下组件:

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

  • K3s 本身。

删除 rancher-system-agent

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

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

删除 K3s

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

sudo k3s-uninstall.sh

目录和文件

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

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

目录

/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

清理目录

rm -rf /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

网络接口和 iptables

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

重启节点

# 使用重启
$ sudo reboot

# 使用关机
$ sudo shutdown -r now

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

网络接口

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

接口

flannel.1

cni0

tunl0

caliXXXXXXXXXXX (random interface names)

vethXXXXXXXX (random interface names)

列出所有接口

# 使用 ip
ip address show

# 使用 ifconfig
ifconfig -a

删除接口

ip link delete interface_name

Iptables

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

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 规则

iptables -L -t nat
iptables -L -t mangle
iptables -L