故障场景描述
在 K3s 集群经历长时间运行(如 2 年以上)或底层容器运行时(Containerd)崩溃重启后,Rancher 界面显示集群状态为 Unavailable,错误提示通常为 "Cluster agent is not connected"。
故障诊断流程
第一阶段:排查 K3s 节点健康度
在手动处理 Rancher 连接前,必须确保 K3s 核心服务已恢复。
- 检查容器运行时状态:
1 | # 如果报错 connection refused,说明 containerd 没起 |
- 检查孤儿挂载点(Device busy):Kubelet 频繁报错
device or resource busy会导致 API Server 响应极慢,进而撑挂 Rancher 隧道。
1 | # 查找并懒卸载残留路径 |
- 检查镜像拉取(Nexus/Registry):确保业务 Pod 不再处于
ImagePullBackOff,否则 API Server 会因处理大量重试请求而无暇顾及 Rancher 隧道。
第二阶段:排查 Rancher Agent 日志
观察 cattle-system 命名空间下的 Agent 状态:
1 | kubectl logs -f -n cattle-system -l app=cattle-cluster-agent |
- 正常状态:日志最后一行停在
Connecting to proxy。 - 异常状态:出现
websocket: close 1006或tunnel disconnect,通常意味着长连接被中断或 Token/证书失效。
渐进式解决方案
方案 A:平滑重启(首选)
在不破坏资源的情况下,尝试重置连接 Session。
- 重启 Rancher Server 容器(在 Rancher 宿主机上):
1 | docker restart <rancher_container_id> |
- 重置 Agent Deployment(在 K3s 节点上):
1 | kubectl rollout restart deployment cattle-cluster-agent -n cattle-system |
方案 B:重新注册 Agent(终极方案)
如果平滑重启无效,说明 Rancher 的 Webhook 或 Agent 状态机已死锁,需要彻底重建。
清理现有 Agent 资源
1 | # 删除整个命名空间 |
关键步骤:打破 Webhook 死锁
创建新命名空间时,旧的 Webhook 规则会因为找不到 rancher-webhook 服务而拦截请求,导致创建失败。必须先手动移除:
1 | # 删除拦截命名空间创建的验证规则 |
获取并执行导入命令
在 Rancher UI 中找到该集群,进入 Registration(注册)页面,复制 kubectl apply 命令并执行:
1 | # 示例命令(请以实际生成的为准) |
恢复验证
执行完重新注册后,按以下顺序检查:
- 命名空间重建:
kubectl get ns cattle-system状态应为Active。 - Pod 状态:
kubectl get pod -n cattle-system应显示Running。 - Rancher UI 状态:集群状态应在 1 分钟内从
Unavailable变为Active。
经验总结与预防
- 时间同步:Rancher 与节点时间偏差超过 60s 会导致隧道立即断开,确保存储和计算节点均开启 NTP。
- Webhook 风险:手动删除
cattle-system时,务必记得清理validatingwebhookconfigurations,否则无法重新 apply。 - 证书周期:对于运行 2 年以上的集群,注意 K3s 自动生成的证书是否已自动轮换,重启 K3s 服务通常能触发此逻辑。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 小五的个人杂货铺!
