为什么已经用了滚动更新服务还会中断
· 阅读需 7 分钟
滚动更新作为一个最佳实践,是每个服务在变更时都会采纳的方案。但在 Kubernetes 实践中,即便使用了滚动更新,也并不一定能够保证服务在更新和维护时总是可用的。
滚动更新的原理
在 Kubernetes 中,我们一般通过 Deployment、Daemonset 等控制器管理 Pod,并且把他们放到 Service 后面,使用 Service 的虚拟 IP 或者负载均衡器 IP 去访问。在 Pod 配置变更(如更新镜像)时,这些控制器默认就会采用滚动更新的方式逐步用新 Pod 替换已有的 Pod。下图所示就是一个典型的滚动更新[1]过程:

由于新的 Pod Ready 之后才会去删除旧的 Pod,在滚动更新中新的连接过来会自动路由到健康的 Pod 上,所以一般来说,新连接不会出问题,容易出问题的是旧连接。
这儿最容易想到的就是长连接。由于旧 Pod 最终会被删除,已有的长连接总是需要关闭。对这种长连接问题,想要解决,最好的方法是客户端在连接断开后重新建立连接。
而对短连接来说,是不是说就一定没问题呢?其实并不一定。