如何在 mesos-marathon 中优雅地进行滚动部署

How to gracefully do a rolling deployment in mesos-marathon

目前,如果您使用 mesos-marathon 框架部署新版本的 docker 映像,具有旧映像的容器将收到 SIGTERM,并在 3 秒后收到 SIGKILL 并立即终止。

如果我们将框架与 marathon-lb(haproxy 包装器)集成,这些容器将继续轮换(haproxy 继续向它发送流量)直到触发下一次健康检查(它发生在一个内部可配置的代理)。因此,在该时间间隔内发送到这些容器的所有请求最终将获得 5XX。那么有没有一种解决方法可以在 SIGKILL 之前将容器从 marathon-lb 中移除。

即使将健康检查间隔设置为 3 秒,也无法保证优雅部署,因为在下一次健康检查和 marathon 向容器发送 SIGKILL 并设置健康检查间隔的 3 秒之间可能存在竞争条件当后端节点数量增加时,1 秒是不可能的。还有其他方法可以实现吗?

您可以查看 Marathon 文档中的蓝绿部署页面:

有 3 个选项适合您。

  1. 正如@Tobi 提议的那样,看看 blue green deployment 和 Marathon。
  2. 您可以增加 executor_shutdown_grace_period 或减少 (正如您提到的,这不适合您) haproxy healcheck 间隔比正常周期短两倍。
  3. 有点老套,但您的应用程序可以在收到 SIGTERM 时从 haproxy 本身注销。