【问题标题】:Docker services route network before task is actually up - zero downtimeDocker 服务在任务实际启动之前路由网络 - 零停机时间
【发布时间】:2018-11-21 16:16:06
【问题描述】:

我目前在多个节点上运行Docker 版本 18.03.1-ce,构建 9ee9f40。我的设置是在 wildfly 集群中运行的 nginx 服务和多个 java restful API 服务。 对于我的 API 服务,我配置了一个简单的运行状况检查来确定我的 API 任务是否实际启动:

HEALTHCHECK --interval=5m --timeout=3s \
  --retries=2 --start-period=1m  \
  CMD curl -f http://localhost:8080/api/healthcheck || exit 1

但即使使用HealthCheck,我的 nginx 有时也会出错 - 由于 API 仍未完全启动 - 无法服务休息请求。

到目前为止,我设法开始工作的唯一解决方案是手动将 --start-period 增加到更长的时间。

docker 服务load balancer 如何决定何时开始将请求路由到新服务?

使用 --start-period 设置更高的时间是目前防止负载均衡器将流量重定向到尚未准备好流量的任务的唯一方法还是我错过了什么? p>

我已经看到像 this 这样的“蓝绿色”部署答案,您可以在其中管理零停机时间,但我仍然希望这可以通过使用 docker 服务来完成。

【问题讨论】:

  • 我猜您的健康检查localhost:8080/api/healthchck 没有给出您期望的响应。如果它完全响应,那么您的 api 已启动并正在运行似乎是合乎逻辑的,然后 docker 将开始将请求路由到它。
  • 感谢您的回复。我认为问题不在于我的健康检查,而是 docker 服务负载均衡器将任务标记为正在运行并在该任务通过我的健康检查并被认为是“健康”之前开始重定向流量。我可能错了,我猜这就是问题所在。
  • 不错的猜测,但本质上是错误的(除非有一个以前没有人注意到的奇怪错误)。阅读:stackoverflow.com/questions/43340147/…
  • 谢谢,会解决这个问题和白鲸问题。

标签: docker docker-swarm


【解决方案1】:

路由网格将在“第一次成功的健康检查”时开始路由流量,即使未来的失败。

无论你在 HEALTHCHECK 命令中输入什么,它只需要在事情真正准备好时才开始返回“exit 0”。如果它过早返回一个好的结果,那么这不是一个好的健康检查命令。

--start-period 仅告诉 swarm 何时在尚未收到成功的健康检查时终止任务,但它不会导致在启动期间忽略绿色健康检查。

【讨论】:

  • 因此,如果我的健康检查“过早”成功,则可以解释问题。我会检查是否是这样,但我不确定如何测试它。如果我想推迟“第一次健康检查”,我会怎么做?将--interval 设置为更高的值?容器启动时的 docker healthcheck 是否每隔--interval 运行一次,从--start-period 开始运行,或者它什么时候开始?根据您的回答,--start-period 只会不计算失败的尝试。谢谢!
  • 我已将我的健康检查配置得更精确,现在它似乎按预期工作。由于路由网格和开始周期的解释,将此答案标记为正确。再次感谢!
猜你喜欢
  • 2020-02-04
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
相关资源
最近更新 更多