核心应用流量完全无损升级
业务场景
对于某些核心的应用(比如流量网关),不希望因升级导致故障。在升级这种核心应用的时候,希望采取非常保守的升级策略,宁愿操作麻烦,也要保证风险绝对可控,确保待升级的 Pod 先完全被摘流,然后再手动重建 Pod 触发升级,持续经现网流量灰度一段时间后,如果没问题再逐渐继续扩大灰度范围,期间发现任何问题都可以回滚已升级的副本。
升级导致故障的可能情况
下面列举一些在升级时可能导致故障的情况:
- 应用的优雅终止逻辑实现上的不够完善,导致 Pod 停止时部分存量连接异常。
- 存量长连接迟迟不断开,可能超过
terminationGracePeriodSeconds
,导致 Pod 停止时,存量连接异常关闭。 - 新版应用可能引入隐藏 BUG 或不兼容改动,健康检查探测不到,等上线后一段时间才被动发现。
- CLB 摘流和 Pod 停止两个过程异步并行执行,在极端的场景下,Pod 已经开始进入优雅终止流程,不接收增量连接,但在 CLB 这边还没来得及摘流(改权重),导致个别新连接被调度到这个正在停止的 Pod 而不被处理。
流量完全无损升级的方法
在 TKE 环境中,可以使用 StatefulSet 来部署核心应用,并配合 TKE 的 Service 注解来实现对指定序号的 Pod 提前摘流,再结合 StatefulSet 的 OnDelete
更新策略对 Pod 进行手动重建更新来实现流量完全无损的升级,下面展示了大致的升级流程:
接下来介绍具体操作方法。