服务一直返回200,K8s却说它活着,直到业务全挂了
去年双十一前一天,凌晨3点,被叫起来复盘一次诡异的事故。 事故的表现很魔幻:K8s 集群里所有 Pod 状态都是 Running,健康检查全部通过,Grafana 大盘一片绿。但用户反馈说下单按钮点不动,支付页面转圈圈,客诉量每分钟十几条。 运维同学第一个反应是"网络问题"。查了半小时,网络一切正常。第二个反应是"数据库挂了",DBA 看了一眼连接池——没问题。 最后顺着日志一层层摸,发现 Redis Cluster 里有一个分片的 Master 选举失败,变成了只读模式。订单服务在查 Redis 缓存的时候拿不到写入权限,但它的 /health 接口还在正常返回 200。 因为健康检查只做了 ping——一个什么都没验证的空壳。 一、返回 200 不等于活着 大多数 Spring Boot 项目配健康检查都是这样: GET /actuator/health → {"status":"UP"} 加个 Spring Security 的登录校验就算完事了。看起来挺稳的,直到某天业务挂了,你才发现这玩意儿根本没用。 为什么?因为 Spring Boot Actuator 默认的健康检查....