文章背景图

kubeadm 节点重置与重新加入:安全下线、清理和验证

2026-07-25
4
-
- 分钟

kubeadm reset 用于尽力撤销 kubeadm init 或 kubeadm join 在本机做出的更改。它不是通用故障修复按钮,也不是完整卸载器。错误地在控制平面节点执行,可能移除本地 etcd 成员并造成集群中断。

一、什么情况下考虑 reset

1. 工作节点需要永久退出并重新初始化。

2. 节点加入了错误集群,需要清理后加入正确集群。

3. kubeadm 初始化失败,确认没有需要保留的状态后重新开始。

4. 节点操作系统或运行时配置将被重建。

如果只是 Pod 异常、kubelet暂时失败、证书或 CNI 故障,应先排查根因。reset 会破坏节点本地 Kubernetes 状态,不应作为第一反应。

二、工作节点下线前先迁移业务

先检查节点上的工作负载:

kubectl get pod -A \

--field-selector spec.nodeName=<NODE_NAME>

禁止调度并驱逐普通工作负载:

kubectl drain <NODE_NAME> \

--ignore-daemonsets \

--delete-emptydir-data

--delete-emptydir-data 会删除随 Pod 生命周期存在的本地临时数据。执行前确认应用可以重建,并检查 PDB、StatefulSet、本地卷和静态 Pod。

确认业务已迁移后,从 API 中删除 Node 对象:

kubectl delete node <NODE_NAME>

如果节点只是短期维护且还要原样返回,通常不需要 reset,完成维护后 uncordon 即可。

三、控制平面节点风险更高

控制平面节点可能运行 API Server、Scheduler、Controller Manager 和 stacked etcd。

kubeadm reset 在控制平面节点会尝试移除本地 etcd 成员。多控制平面集群必须先确认剩余成员仍有 quorum;单控制平面集群执行 reset,等同于破坏当前控制面。

操作前至少需要:

1. 已验证的 etcd 快照。

2. /etc/kubernetes 安全备份。

3. etcd 成员与控制面拓扑记录。

4. 负载均衡后端调整方案。

5. 明确的恢复或重新加入流程。

外部 etcd 不会被 kubeadm reset 自动清空,重新初始化时可能仍看到旧集群数据。

四、先做 dry-run

在目标节点确认即将执行的动作:

sudo kubeadm reset --dry-run

确认目标节点、CRI socket、证书目录和影响范围后,再执行实际重置:

sudo kubeadm reset

如果机器安装了多个容器运行时,可能需要显式指定正确的 --cri-socket。不要为了跳过所有检查就使用 --ignore-preflight-errors=all。

五、reset 不会清理所有内容

官方文档明确指出,kubeadm reset 是 best effort,并不会自动处理所有残留:

1. /etc/cni/net.d 中的 CNI 配置通常不会清理。

2. kube-proxy 写入的 iptables、nftables 或 IPVS 规则不会全部清理。

3. 用户家目录的 $HOME/.kube 不会清理。

4. external etcd 数据不会清理。

5. 业务数据、挂载卷和第三方组件状态不属于 kubeadm 的清理范围。

这些残留不一定都需要删除。应先检查和备份,再根据节点是否加入同一集群、是否更换 CNI、是否改作其他用途决定。

不要把 rm -rf /etc/cni/net.d、清空防火墙和删除整个 $HOME/.kube 写成无条件步骤。它们可能破坏其他网络配置或仍然有效的管理凭据。

六、重新加入前检查

节点重新加入前确认:

1. 主机名和节点身份符合规划。

2. 时间同步正常。

3. 容器运行时健康,CRI socket 正确。

4. kubeadm 与目标控制面版本符合版本偏差策略。

5. kubelet配置和 cgroup 驱动与运行时兼容。

6. 节点可以访问 API Server、镜像仓库和 DNS。

7. 旧 CNI 配置不会与新集群冲突。

8. 防火墙开放了当前架构真正需要的端口。

七、生成新的加入命令

在健康的控制平面节点生成短期加入命令:

sudo kubeadm token create --print-join-command

输出形式类似:

sudo kubeadm join \

<CONTROL_PLANE_ENDPOINT> \

--token <BOOTSTRAP_TOKEN> \

--discovery-token-ca-cert-hash sha256:<CA_HASH>

Bootstrap Token 属于敏感信息,默认有有效期。不要把真实 join 命令发布到博客、工单或代码仓库。使用后可以检查并删除不再需要的 Token。

在工作节点执行经过安全传递的 join 命令,然后在控制面验证:

kubectl get nodes -w

kubectl describe node <NODE_NAME>

八、重新加入后验证

1. Node 状态变为 Ready。

2. kube-system 中的 CNI、kube-proxy 或相应数据面正常。

3. 节点标签、污点和角色符合预期。

4. DNS 和 Service 网络可用。

5. CSI Node 插件与卷挂载正常。

6. 监控、日志、安全代理和 DaemonSet 已运行。

7. 调度测试 Pod 并验证网络和存储。

如果节点 Ready 但业务不能通信,重点检查 CNI 残留、NetworkPolicy、路由、MTU 和 kube-proxy/替代数据面。

九、常见问题

节点名称已存在:确认旧 Node 对象是否仍在 API 中,并核对证书和主机名,不要简单修改名称绕过问题。

Token 过期:重新生成短期 Token,不要使用 unsafe-skip-ca-verification 绕过 CA 校验。

CNI 初始化失败:检查 /etc/cni/net.d、CNI 二进制、节点路由、内核模块和 CNI DaemonSet 日志。

kubelet 无法注册:检查 API Server 连接、bootstrap kubeconfig、证书签发、CRI 和版本偏差。

控制平面重新加入失败:它还涉及 certificate-key、共享控制面端点、etcd 成员和证书分发,应使用高可用 kubeadm 官方流程,不能照搬工作节点命令。

总结

安全的节点重置流程是:确认真的需要 reset → 迁移工作负载 → 评估数据和控制面风险 → dry-run → 执行 reset → 有选择地处理残留 → 使用短期可信 Token 重新加入 → 验证网络、存储和系统代理。重置是破坏性操作,必须建立在备份和明确范围之上。

参考资料:

https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-reset/

https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/adding-linux-nodes/

https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-join/

原创

kubeadm 节点重置与重新加入:安全下线、清理和验证

本文链接: kubeadm 节点重置与重新加入:安全下线、清理和验证

本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

评论交流

文章目录