1. 问题现象与背景解析
在Kubernetes集群管理工具Rancher的实际运维中,fleet-agent组件偶尔会陷入"Pending-Upgrade"状态无法自动恢复。这个问题通常发生在以下场景:
- 执行Rancher版本升级后
- 修改了集群的agent配置参数
- 网络波动导致升级过程中断
- 节点资源不足导致升级卡死
当fleet-agent处于这种状态时,最直观的表现是:
- 在Rancher UI的集群管理页面显示黄色警告标志
- kubectl get pods -n cattle-fleet-system 会看到fleet-agent的状态列显示Pending-Upgrade
- 集群的自动同步功能失效,GitRepo等资源停止更新
重要提示:不要直接删除处于该状态的Pod!这可能导致集群管理功能完全中断。
2. 根本原因深度分析
2.1 组件升级机制剖析
fleet-agent采用"滚动升级+健康检查"的更新策略:
- Rancher server生成新的agent manifest
- 当前运行的agent接收到升级指令
- 新版本agent pod进入Pending-Upgrade状态等待老版本终止
- 老版本完成graceful shutdown后释放资源
- 新版本pod进入Running状态
2.2 常见卡死诱因
根据社区issue和实际运维经验,主要卡死原因包括:
| 原因类型 | 具体表现 | 发生频率 |
|---|---|---|
| 资源不足 | 节点内存/CPU不足无法调度新pod | 35% |
| 镜像拉取失败 | 私有仓库认证失效或网络隔离 | 28% |
| 污点/容忍配置冲突 | 节点调度策略变更未同步 | 20% |
| 老版本未正常终止 | terminationGracePeriod设置过短 | 15% |
| 其他 | 自定义准入控制器拦截 | 2% |
3. 完整解决方案手册
3.1 标准恢复流程
以下是经过验证的标准恢复步骤:
# 步骤1:检查当前状态 kubectl get pods -n cattle-fleet-system -o wide kubectl describe pod <fleet-agent-pod-name> -n cattle-fleet-system # 步骤2:清理残留资源(谨慎操作) kubectl delete pod <stuck-pod-name> -n cattle-fleet-system --grace-period=0 --force # 步骤3:触发强制重新部署 kubectl rollout restart deployment/fleet-agent -n cattle-fleet-system # 步骤4:验证新pod状态 watch kubectl get pods -n cattle-fleet-system3.2 针对不同场景的特殊处理
场景1:资源不足导致
- 检查节点资源:
kubectl top nodes kubectl describe nodes | grep -A 10 "Allocatable"- 临时解决方案:
kubectl cordon <overloaded-node> kubectl drain <overloaded-node> --ignore-daemonsets- 长期方案建议调整fleet-agent的resources请求值
场景2:镜像拉取失败
- 手动测试镜像可拉取性:
crictl pull <image-from-describe-output>- 临时解决方案:
kubectl set image deployment/fleet-agent -n cattle-fleet-system *=<alternative-image>4. 深度运维技巧
4.1 预防性配置建议
在values.yaml中增加以下配置可降低问题发生概率:
fleet: agent: resources: requests: cpu: "100m" memory: "128Mi" terminationGracePeriodSeconds: 60 imagePullSecrets: - name: regcred4.2 高级调试方法
当常规手段无效时,可以:
- 检查fleet-controller日志:
kubectl logs -n cattle-fleet-system -l app=fleet-controller --tail=1000 | grep -i upgrade- 分析etcd中的集群状态:
kubectl get clusters.fleet.cattle.io -n fleet-local -o yaml- 启用debug日志级别:
kubectl edit deployment/fleet-controller -n cattle-fleet-system # 添加 --debug 参数5. 典型问题速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| Pod一直ContainerCreating | 镜像拉取失败 | 检查imagePullSecrets配置 |
| 老Pod未终止 | terminationGracePeriod过短 | 强制删除后调整grace period |
| 新Pod持续CrashLoop | 资源配额不足 | 调整requests/limits |
| 升级循环往复 | 版本不兼容 | 回退到稳定版本 |
6. 灾备恢复方案
当所有常规手段失效时,可按顺序尝试:
- 重置fleet-agent的部署:
kubectl delete deployment/fleet-agent -n cattle-fleet-system # Rancher会自动重建- 重建fleet命名空间:
kubectl delete namespace cattle-fleet-system # 等待Rancher自动重建- 最终手段 - 通过Rancher CLI强制同步:
rancher clusters sync <cluster-id>在实际生产环境中,建议先在小规模测试集群验证操作步骤。每次升级前确保:
- 有可用的etcd备份
- 预留至少20%的节点资源余量
- 检查镜像仓库的可访问性