场景
生产 Kubernetes 集群中,一个或多个节点状态变为 NotReady,导致工作负载被驱逐或无法调度。
症状
- 节点状态:
kubectl get nodes显示 NotReady - kubelet 日志报错:
journalctl -u kubelet -f显示连接超时或资源不足 - 节点 CPU/内存使用率极高(通过
top、free -h、df -h查看) - 节点上的 Pod 处于 Pending 或 Unknown 状态
诊断步骤
- 检查节点状态:
kubectl get nodes -o wide查看详情 - 查看节点描述:
kubectl describe node <node-name>获取事件和条件 - 检查 kubelet 日志:
journalctl -u kubelet --since "10 min ago"寻找错误 - 检查系统资源:
top、htop、free -m、df -h、iostat -x查看 CPU、内存、磁盘 I/O - 检查容器运行时:
crictl ps或docker ps确认容器状态 - 检查网络插件:
kubectl get pods -n kube-system确认 CNI 插件正常运行
常用命令
# 节点健康检查
kubectl get nodes
kubectl describe node <node-name>
kubectl get pods --all-namespaces -o wide | grep <node-name>
# 系统资源
top -c -o %CPU
free -h
vmstat 1 5
# kubelet 日志
journalctl -u kubelet --no-pager -n 100
# 重启 kubelet(风险操作)
systemctl restart kubelet
# 驱逐节点(谨慎)
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
风险控制
- 在操作前,确认节点是否为主节点(Master)——切勿随意重启 Master 节点上的 kubelet 或进行驱逐,可能导致集群控制面不可用。
- 保持带外管理访问(如 IPMI、BMC)以防 SSH 中断。
- 确保有备份或快照,尤其是持久化数据。
- 执行
kubectl drain前,评估工作负载可用性,避开业务高峰期。
回滚步骤
如果故障由 recent 变更引起(如配置更新):
1. 恢复 kubelet 配置:systemctl stop kubelet; cp /etc/kubernetes/kubelet.conf.bak /etc/kubernetes/kubelet.conf; systemctl start kubelet
2. 如果重启 kubelet 后问题依旧,且节点资源耗尽,考虑内存/磁盘扩容或清理临时文件。
3. 作为最后手段,重启节点:reboot(需谨慎,可能导致数据丢失)。
验证
- 节点状态变为 Ready:
kubectl get nodes - 被驱逐的 Pod 重新调度:
kubectl get pods -o wide - kubelet 日志无新错误
- 业务监控恢复正常
何时提交 OpsGlobal 工单
- 节点在尝试所有诊断步骤(包括重启 kubelet 和节点)后仍未恢复
- 需要硬件供应商介入(如磁盘故障、内存错误)
- 节点数据泄露或安全事件
- 需要基础设施团队扩容或替换节点时
适用场景
适合正在处理 DevOps、Kubernetes, SRE, Linux, 故障排查 相关问题的团队,用于快速建立排查路径和交付标准。
问题背景
本文为 SRE 团队提供一份详尽的 Linux 生产环境故障排查手册,以 Kubernetes 节点状态异常为例,涵盖症状、诊断、命令、风险控制、回滚、验证及何时提交工单。
排查步骤
先确认影响范围和最近变更,再收集日志、配置、指标和链路数据,最后按风险从低到高执行修复。
命令示例
示例命令请替换为你的真实资源名,并使用环境变量保存账号、密码、token 等敏感信息。
风险说明
生产环境操作前需要确认备份、权限边界、变更窗口和回滚路径,避免扩大故障影响。
回滚方案
保留原配置和发布版本;如修复后指标异常,立即回退配置、镜像或数据库变更并复核日志。
交付清单
问题定位记录、关键命令、修复步骤、验证结果、后续优化建议。
遇到类似技术问题?
如果你的服务器、K8s、Docker、CI/CD、数据库或监控系统出现类似问题,可以提交日志和配置文件,我们帮你远程诊断。