Deployment 没写 maxUnavailable,滚动更新那两分钟 502 从 0 涨到 6%,旧 Pod 已经 Terminating 新 Pod 还没 Ready。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

kubectl rollout status deploy/api --timeout=180s
kubectl get pod -l app=api -w

默认 maxUnavailable 是 25%,四个副本会先摘掉一个,剩下的还在等镜像和探针。Service 摘流和进程退出之间没有缓冲,请求落在正在关闭的 Pod 上。这一点先确认清楚,后面就不用反复试。

「滚动更新可用副本」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

具体做法是,把 maxUnavailable 设 0 maxSurge 设 1 先起新再停旧;加 preStop sleep 5 秒 等 kube-proxy 把规则同步完;terminationGracePeriodSeconds 要大于应用处理在途请求的时间;发布时盯 502 比例和 endpoints 变化。

改完照着核一遍,下一次发布 502 比例始终为 0 rollout 期间可用副本数不低于 4。

作者 9823189