在使用Rancher Kubernetes Engine (RKE) 部署或升级集群时,尤其是在节点被替换或主机名发生变化后,用户可能会遇到一个令人困惑的错误:Error getting node xxx not found。尽管这个节点可能已经物理存在或已被移除,RKE却无法正确识别其状态,导致部署卡死。
本文将深入探讨这个问题的根源,并提供一套实用的、基于基础设施的解决方案。
Contents
1. 错误原因分析
RKE在部署过程中依赖于一个本地状态文件(通常是cluster.rkestate)或如果通过Rancher Manager部署,则依赖于Kubernetes中的ConfigMap来存储集群的最新配置和节点状态。
导致Error getting node xxx not found的主要原因通常是:
- 节点主机名/IP地址不匹配: 配置文件中的主机名与节点实际的主机名或RKE尝试连接的地址不一致。
- Stale State File (陈旧的状态文件): 集群配置已更新,但RKE状态文件或Rancher ConfigMap中仍保留着已删除或重命名节点的旧记录。
- 不彻底的节点清理: 节点被移除后,仍有残留的Kubernetes组件(如kubelet配置、证书)残留在节点上,导致RKE在尝试重用或验证该节点时混淆。
2. 解决方案一:验证主机名和连通性
首先,确保RKE配置中的节点名称与实际节点的主机名完全匹配,并且SSH是可达的。
检查步骤
- 检查RKE配置文件 (cluster.yml): 确保nodes部分的主机名或IP地址正确。
1
2
3
4
5
6# 示例 cluster.yml 片段
nodes:
- address: 192.168.1.10
user: rancher
role: [controlplane, etcd]
hostname_override: my-node-01 # 检查这里是否与实际主机名一致 - 检查节点的主机名: 登录到有问题的节点,确认其主机名。
1
2$ hostname
my-node-01 - 检查DNS/Hosts文件: 确保所有节点都能正确解析彼此的IP地址和主机名。
1$ cat /etc/hosts
3. 解决方案二:清理RKE状态文件(最常见修复)
如果确认连通性无误,那么问题几乎确定是RKE状态文件不同步导致的。我们需要安全地清理旧状态。
步骤 3.1:如果使用rke up部署 (本地状态)
如果您的部署是直接通过命令行rke up进行的,则状态存储在与cluster.yml同目录的cluster.rkestate文件中。
- 安全移除节点(如果节点已被物理删除): 使用rke remove命令告诉RKE这个节点不再是集群的一部分。如果集群已完全损坏,您可能需要跳过这一步。
1
2
3# 假设集群配置文件为 cluster.yml
# 运行 rke remove 来清理集群组件和状态
rke remove --config cluster.yml - 删除陈旧的状态文件: 这一操作会强制RKE下次部署时从头同步状态。
1
2
3
4
5# 备份旧状态文件以防万一
mv cluster.rkestate cluster.rkestate.bak
# 重新执行部署
rke up --config cluster.yml
步骤 3.2:如果通过Rancher Manager部署 (ConfigMap状态)
如果集群是在Rancher UI中创建的(RKE模板),Rancher会将RKE状态保存在Kubernetes集群内部的ConfigMap中。
- 找到并编辑对应的ConfigMap: 登录到Rancher管理服务器的Kubeconfig环境。
1
2
3
4
5# 假设集群名为 'my-rke-cluster',命名空间为 'cattle-system'
kubectl get cm -n cattle-system | grep my-rke-cluster
# 通常 ConfigMap 名称类似于 'kubeconfig-my-rke-cluster'
kubectl edit cm kubeconfig-my-rke-cluster -n cattle-system - 清理config字段中的过时节点信息: 在ConfigMap的数据中找到RKE配置部分,手动移除导致错误的那个节点的记录,然后保存退出。Rancher会检测到ConfigMap的变更,并尝试重新同步集群。
4. 解决方案三:彻底清理残留组件
如果以上步骤仍未能解决问题,可能是节点上残留了旧的Docker容器、网络配置或数据卷,它们干扰了RKE的重新部署。
我们必须在有问题的节点上执行深度清理。
警告: 执行此操作将彻底删除节点上的所有Kubernetes数据和组件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 #!/bin/bash
# 停止所有K8S相关的服务和进程
if systemctl is-active --quiet kubelet; then
systemctl stop kubelet
fi
# 清理所有RKE/K8S创建的Docker容器
docker rm -f $(docker ps -aq -f "label=io.cattle.rke.container=true")
# 删除所有Kubernetes组件的静态Pod文件和配置
rm -rf /etc/kubernetes/ssl
rm -rf /etc/kubernetes/manifests
rm -rf /var/lib/kubelet
rm -rf /var/lib/cni
# 清理CNI网络配置和数据卷
rm -rf /opt/cni
rm -rf /var/run/calico
# 清理etcd数据(如果该节点是etcd角色)
rm -rf /var/lib/etcd
# 确保删除RKE锁文件(如果有)
rm -f /var/lib/rancher/rke/log/rke.lock
echo "节点清理完成,请重启Docker服务后尝试重新部署RKE。"
systemctl restart docker
执行完深度清理后,使用新的或修正后的cluster.yml文件重新运行rke up,集群应能正确识别并初始化节点。
汤不热吧