Docker群:保证重启后的高可用性

我有一个使用Docker群的问题。

我有一个在Gunicorn上运行的Python Web服务的3个副本。

问题是当我在软件更新后重新启动群集服务时,一个旧的正在运行的服务被终止,然后一个新的服务被创build并启动。 但在老服务已经死亡的短时间内,新服务尚未完全启动,networking消息已经被路由到尚未准备好的新实例,导致502个错误的网关错误(I代理从nginx的服务)。

我使用--update-parallelism 1 --update-delay 10s选项,但是这并不能消除这个问题,只是稍微减less了获取502错误的机会(因为总是有至less两个服务在运行,即使其中一个可能还在启动)。

所以,按照我在评论中提出的build议:

使用Dockerfile: Docs的HEALTHCHECKfunction。 就像是:

 HEALTHCHECK --interval=5m --timeout=3s \ CMD curl -f http://localhost/ || exit 1 

了解Docker Swarm在服务更新期间确实遵守此健康检查,可以相对轻松地实现零宕机部署。

但正如你所提到的,你有一个高资源消费者的健康检查,你需要更大的健康检查间隔。

在这种情况下,我build议您自定义您的健康检查,立即执行第一次运行,并在current_minute % 5 == 0处进行连续检查,但健康检查本身运行/30s

 HEALTHCHECK --interval=30s --timeout=3s \ CMD /service_healthcheck.sh 

healthcheck.sh

 #!/bin/bash CURRENT_MINUTE=$(date +%M) INTERVAL_MINUTE=5 [ $((a%2)) -eq 0 ] do_healthcheck() { curl -f http://localhost/ || exit 1 } if [ ! -f /tmp/healthcheck.first.run ]; then do_healhcheck touch /tmp/healthcheck.first.run exit 0 fi # Run only each minute that is multiple of $INTERVAL_MINUTE [ $(($CURRENT_MINUTE%$INTERVAL_MINUTE)) -eq 0 ] && do_healhcheck exit 0 

请记住将healthcheck.sh COPY/healthcheck.sh (和chmod +x

在目前的17.05和更早的发行版中,Docker群中的滚动升级有一些已知的问题(例如moby / moby#30321 )(并且看起来并不像所有修复将会使17.06)。 这些问题将导致滚动升级期间的连接错误,就像你看到的。

如果你有一个真正的零宕机时间的部署要求,并不能解决这个客户端重试,那么我build议在你的群体前面join某种蓝/绿开关,并滚动升级到非主动docker工人find解决scheme的所有情况。