发版后五分钟 Nginx 记了 1200 条 502,集中在旧 Pod 被删的那几十秒。kubectl get pod 显示新旧副本交替,Ready 数一直没到期望值。乍看像缓存或者权限的锅,追下去往往不是。
kubectl rollout status deploy/api --timeout=120s kubectl get pod -l app=api -w kubectl rollout undo deploy/api
追下去是这么回事:新 Pod 探针刚通过就摘掉旧 Pod,旧实例的进程退出和注册中心摘地址之间有几秒空档。请求仍会被转发到已经不能处理的实例,连接直接被重置。
「滚动更新 502」这类改动最怕改一半,回滚脚本先准备好,再动生产。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。
具体做法是,把 maxUnavailable 调成 0 先保证可用副本不掉;maxSurge 留出一到两个 让新实例先起来再接流量;readiness 的初始延迟按最慢启动时间来设 别刚起来就判定可用;发布时盯住 5xx 曲线 出现抬升立刻 undo。
验收就看一点,再次发布时 502 条数为 0,Ready 副本数平稳过渡,没有断崖。
