我目前正在多个节点上运行 Docker版本18.03.1-ce,构建9ee9f40 。我的设置是一个nginx服务和在wildfly集群中运行的多个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 service load balancer如何决定何时开始将请求路由到新服务?
使用 - start-period 设置更高的时间当前是阻止负载均衡器将流量重定向到尚未准备好进行流量的任务还是我遗漏了什么的唯一方法?
我已经看过"蓝绿色"部署答案如this,您可以在其中管理零停机时间,但我仍然希望可以使用docker服务来完成此任务。
答案 0 :(得分:1)
路由网格将开始在“第一次成功运行状况检查”上路由流量,即使将来失败也是如此。
无论你在HEALTHCHECK命令中放置什么,它都只需要在事情真正准备就绪时才开始返回“退出0”。如果它过早地返回一个好的结果,那么这不是一个好的健康检查命令。
--start-period
只告诉swarm什么时候杀死任务,如果它还没有在那段时间内收到成功的健康检查,但它不会导致在开始阶段忽略绿色健康检查。