我在使用Docker swarm时遇到问题。
我有3个在Gunicorn上运行的Python Web服务的副本。
问题是,当我在软件更新后重新启动群集服务时,旧的正在运行的服务被杀死,然后创建并启动了一个新的服务。但是在很短的时间内,旧服务已经被终止,新服务还没有完全启动,网络消息已经路由到尚未准备好的新实例,导致502错误的网关错误(我从nginx代理服务)。
我使用--update-parallelism 1 --update-delay 10s
选项,但这不能消除问题,只会稍微减少出现502错误的机会(因为始终至少有2个服务正在运行,即使其中一项可能仍在启动)。
最佳答案
因此,按照我在评论中的建议:
使用Dockerfile的HEALTHCHECK
功能:Docs。就像是:
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1
知道Docker Swarm在服务更新期间确实会执行此健康检查,因此零停机时间部署相对容易。
但是,正如您提到的,您需要进行高资源的消费者健康检查,并且需要更大的健康检查间隔。
在这种情况下,我建议您自定义运行状况检查,以立即进行第一次运行,并在
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
)