首页 > 解决方案 > K8s 服务的优雅升级与长时间运行的连接

问题描述

tl; dr:我有一个处理 WebSocket 连接的服务器。工作负载的本质是它必然是有状态的(即,每个连接都具有长期运行状态)。每个连接可持续~20m-4h。目前,我只在下班时间部署此服务的新版本,以避免过多地打扰用户。

我想转移到一个新的模型,随时进行部署,并且服务在大约 30 分钟的过程中优雅地耗尽连接(通常前端可以找到一个“好”的时间在 30 分钟内进行切换,如果不是,我们只是强行断开它们)。通过设置gracePeriodSeconds,我可以很容易地用K8s 做到这一点。但是,不太清楚的是如何进行部署以使新连接仅用于最近的部署。假设我有五个副本正在运行。正常部署有一个不受欢迎的模式,客户端在 R1(副本 1)上,然后 K8s 部署 R1'(升级版本)并终止 R1;然后前端重新连接并路由到 R2;R2 终止,前端重新连接,路由到 R3。

有什么简单的方法可以确保在升级开始后,新客户端只路由到升级版本?我已经在运行 Istio(虽然没有使用它的很多功能),所以我可以想象使用一些自定义部署基础设施(目前仅使用 Helm)做一些复杂的事情,这些基础设施会启动新部署,切断与新部署的新连接,并优雅地耗尽旧部署......但如果可能的话,我宁愿保持简单(只是 Helm 在 CI 中运行)。

对此有什么想法吗?

标签: kubernetesdeploymentistio

解决方案


这已经是正常服务的工作方式。一旦 Pod 终止,它就已经从 Endpoints 中删除了。您可能需要将 Deployment 的滚动更新设置中的最大爆发调整为 100%,以便它会一次生成所有新的 pod,然后在所有其余部分上启动关闭过程。


推荐阅读