kubernetes - K8s 服务的优雅升级与长时间运行的连接
问题描述
tl; dr:我有一个处理 WebSocket 连接的服务器。工作负载的本质是它必然是有状态的(即,每个连接都具有长期运行状态)。每个连接可持续~20m-4h。目前,我只在下班时间部署此服务的新版本,以避免过多地打扰用户。
我想转移到一个新的模型,随时进行部署,并且服务在大约 30 分钟的过程中优雅地耗尽连接(通常前端可以找到一个“好”的时间在 30 分钟内进行切换,如果不是,我们只是强行断开它们)。通过设置gracePeriodSeconds,我可以很容易地用K8s 做到这一点。但是,不太清楚的是如何进行部署以使新连接仅用于最近的部署。假设我有五个副本正在运行。正常部署有一个不受欢迎的模式,客户端在 R1(副本 1)上,然后 K8s 部署 R1'(升级版本)并终止 R1;然后前端重新连接并路由到 R2;R2 终止,前端重新连接,路由到 R3。
有什么简单的方法可以确保在升级开始后,新客户端只路由到升级版本?我已经在运行 Istio(虽然没有使用它的很多功能),所以我可以想象使用一些自定义部署基础设施(目前仅使用 Helm)做一些复杂的事情,这些基础设施会启动新部署,切断与新部署的新连接,并优雅地耗尽旧部署......但如果可能的话,我宁愿保持简单(只是 Helm 在 CI 中运行)。
对此有什么想法吗?
解决方案
这已经是正常服务的工作方式。一旦 Pod 终止,它就已经从 Endpoints 中删除了。您可能需要将 Deployment 的滚动更新设置中的最大爆发调整为 100%,以便它会一次生成所有新的 pod,然后在所有其余部分上启动关闭过程。
推荐阅读
- c# - 应用程序不作为 EXE 运行
- azure - Azure 模板导出与部署的模板不匹配
- python - Flask SQL 没有这样的表
- regex - 需要将公式应用于某些空白单元格
- python - 尝试在 python3 中使用 NMAP 扫描一系列 IP
- kubernetes - 有没有办法 kubectl 应用目录中的所有文件?
- flutter - 一个 RenderFlex 在底部溢出了 41 个像素。相关的导致错误的小部件是 Column
- javascript - 用 jQuery 点击两个选项卡替换 UL 内容?
- reactjs - 为什么从 React 的 useEffect 依赖列表中省略函数是不安全的?
- angular-cli - 无法在生产中加载角度