KubernetesSRE事故响应集群可靠性
场景
某工作节点因硬件故障宕机,导致其上运行的 Pod 被驱逐,服务降级。
症状
- 错误率上升,响应延迟增加
- 部分 Pod 处于 Pending 状态(无可用节点)
- 监控告警触发(如 Node Down、Pod CrashLoopBackOff)
诊断
- 检查节点状态:
kubectl get nodes -o wide查看 NotReady 节点。 - 查看节点详情:
kubectl describe node <node>确认条件(Ready=False)及事件。 - 查看受影响的 Pod:
kubectl get pods --all-namespaces --field-selector spec.nodeName=<node>列出该节点上的 Pod。 - 检查集群事件:
kubectl get events --all-namespaces --sort-by='.lastTimestamp'查找驱逐记录。 - 使用 metrics server 或 Prometheus 确认资源压力。
命令
# 标记节点不可调度
kubectl cordon <node>
# 排空节点(安全迁移 Pod)
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data
# 若节点彻底故障,无需排空,直接驱逐 Pod
kubectl delete pod <pod> --grace-period=0 --force
# 添加新节点或修复后重新加入集群
kubectl uncordon <node>
风险控制
- 排空前确认 PodDisruptionBudget (PDB) 已配置,避免服务完全中断。
- 使用
--ignore-daemonsets跳过 DaemonSet。 - 若 Pod 使用 emptyDir,需谨慎
--delete-emptydir-data。 - 避免同时排空过多节点。
回滚
- 若排空失败(例如 PDB 阻止),取消操作:
kubectl uncordon <node>并重新评估。 - 对于因更新导致的故障,使用
kubectl rollout undo deployment/<name>回滚。 - 若数据丢失,从备份恢复 PersistentVolume 或使用快照。
验证
- 节点恢复后,
kubectl get nodes确认 Ready。 kubectl get pods --all-namespaces -o wide检查 Pod 运行状态及所在节点。- 访问服务端点,测试功能正常。
- 监控指标(错误率、延迟)回归基线。
何时提交 OpsGlobal 工单
- 节点故障涉及存储、网络或持久数据。
- 需要高级调试(如内核、CSI 插件问题)。
- 团队缺乏 24x7 值守能力或 SLA 覆盖不足。
- 事故原因不明确,需专家分析。
适用场景
适合正在处理 Kubernetes、Kubernetes, SRE, 事故响应, 集群可靠性 相关问题的团队,用于快速建立排查路径和交付标准。
问题背景
学习如何系统性地应对 Kubernetes 集群事故——从检测节点故障到恢复服务,以及何时向 OpsGlobal 升级。
排查步骤
先确认影响范围和最近变更,再收集日志、配置、指标和链路数据,最后按风险从低到高执行修复。
命令示例
示例命令请替换为你的真实资源名,并使用环境变量保存账号、密码、token 等敏感信息。
风险说明
生产环境操作前需要确认备份、权限边界、变更窗口和回滚路径,避免扩大故障影响。
回滚方案
保留原配置和发布版本;如修复后指标异常,立即回退配置、镜像或数据库变更并复核日志。
交付清单
问题定位记录、关键命令、修复步骤、验证结果、后续优化建议。
遇到类似技术问题?
如果你的服务器、K8s、Docker、CI/CD、数据库或监控系统出现类似问题,可以提交日志和配置文件,我们帮你远程诊断。