我在使用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)

08-07 18:09