实现“零停机”的滚动更新 即使只有几千访问量,你的应用也需要经常发版修复 Bug 或上线新功能。如果只有 1 个副本,每次发版重启的那几十秒甚至几分钟内,用户访问就会直接报错。而有了多个副本,Kubernetes 可以采用滚动更新策略(比如先停掉 1 个旧副本,启动 1 个新副本),在更新期间始终有实例提供服务,实现真正的“无缝发布”。 真的是无缝吗,停掉的pod会被负载到这台吗
1. K8s 底层机制:它是怎么做到“无缝”的?
2. 为什么实际中还是可能报错?(应用代码的坑)
Terminating 状态(默认有 30 秒的宽限期)。问题就出在这几秒的时间差上:3. 如何做到真正的“无缝”?
preStop 钩子,让 Pod 在真正收到 SIGTERM 之前,先强制睡眠几秒钟(比如 5 秒)。这 5 秒就是留给负载均衡器去同步 Endpoints 列表的时间。等列表同步完了,再让应用真正开始停机。