发布后 30 秒内 502 比例 8%,kubectl get endpoints 里有一个 Pod 是 0/1 READY,Service 照样把请求转过去。日志里能对上时间点,这种反而好排。

没有就绪探针时,只要容器进程起来,kubelet 就把 Pod 标成 Ready 并写进 Endpoints。应用还在加载配置和连数据库,接住的请求直接失败。这一点先确认清楚,后面就不用反复试。

kubectl get endpoints api -o wide
kubectl get pod -l app=api -o custom-columns=NAME:.metadata.name,READY:.status.containerStatuses[0].ready

「就绪探针缺失」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

改完顺手把文档补一句,省得下次自己重新推一遍。监控和日志的时间要对上,时区不一致会多绕很大一圈。

临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

处理上按这个顺序:给容器加 readinessProbe 探针命中真正依赖就绪的健康接口;initialDelaySeconds 和 periodSeconds 按启动耗时设 别照抄 5 秒;确认 Deployment 的 minReadySeconds 大于 0;滚动发布时观察 endpoints 里是否只出现 1/1 的 Pod。

结果对不对很好判断,发布过程中 endpoints 里不再出现 0/1 的地址 502 比例回落到 0。

作者 9823189