Docker Swarm获取部署状态

3

在使用docker stack deploy将一些服务部署到swarm之后,有没有办法以编程方式测试所有容器是否正确启动?

目的是为了在staging CI/CD流水线中验证容器实际上正在运行,并且没有在启动时失败。通过restart_policy禁用重新启动。

我正在查看docker stack servicesreplicas列对此有用吗?

$ docker stack services --format "{{.ID}} {{.Replicas}}" my-stack-name
lxoksqmag0qb 0/1
ovqqnya8ato4 0/1
4个回答

7

是的,有方法可以做到这一点,但这是手动的,您需要非常熟悉docker cli。Docker没有提供一种易于内置的方法来验证docker stack deploy是否成功。关于此问题有一个开放问题

幸运的是,社区已经创建了一些工具,以实现docker在这方面的不足之处。其中一些最显着的工具:

Issuu是sure-deploy的作者,他们有一篇非常好的文章描述了这个问题


1
通常在CI/CD中,我看到每个人都使用docker或docker-compose。容器与“此容器是否按预期单独运行”有关,无论是在docker中还是在docker swarm中都是如此。
话虽如此,如果您仍想在Swarm中进行多层解决方案的集成测试,则可以通过自动化进行各种操作。请注意,这将在单节点Swarm上完成以使测试更加容易(docker事件不会从所有节点获取节点事件,因此跟踪单个节点对于CI/CD来说更加容易):
  1. 需要有某个东西监控docker events,例如 docker events -f service=<service-name> 来确保容器没有死亡。
  2. 一定要在你的容器中添加健康检查。它们是确保你的应用程序健康(在容器级别)的最佳方法,并且你可以在 docker events 中看到它们成功或失败。你可以将它们放在 Dockerfiles, service create commands, 和 stack/compose files 中。这里有一些很好的例子
  3. 你可以将另一个容器连接到相同的网络中,使用任务逐个远程测试您的服务,并使用反向DNS。这将避免VIP并让您与特定的副本进行通信。
  4. 你可能会从 docker inspect <service-id or task-id> 中获取一些信息。

谢谢您提供这个有用的答案。您是否有使用 Kubernetes 的经验?如果有,那么在验证部署成功时,它与 Docker Swarm 有何不同之处?它是否具有更多内置工具来完成此操作,还是仍然需要类似于您在此处描述的步骤进行手动操作? - Denis Pshenov
是的,Kubernetes有不同的工具和API。我建议将其作为一个新的SO问题提出,而不是在Swarm问题的评论中提出。 - Bret Fisher

1

另一种解决方案可能是使用 docker service scale - 它将不会返回,直到服务收敛到指定数量的副本或超时。

export STACK=devstack # swarm stack name
export SERVICE_APP=yourservice # service name
export SCALE_APP=2 # desired amount of replicas

docker stack deploy $STACK --with-registry-auth
docker service scale ${STACK}_${SERVICE_APP}=${SCALE_APP}

这种方法的一个缺点是需要提供服务名称和其副本计数(但可以使用jq从compose规范文件中提取)。

此外,在我的用例中,我不得不通过在timeout命令前添加超时来指定超时,即timeout 60 docker service scale,因为docker service scale即使一些容器失败,也会等待其自己的超时,这可能会减慢持续交付流水线。

参考资料

Docker CLI: docker service scale

jq - 命令行JSON处理器

GNU Coreutils: timeout命令


您也可以只更新堆栈(不需要选项),而无需指定规模:docker service update STACK_SERVICENAME - Raphael PICCOLO

0

您可以为每个服务调用此函数。当收敛时,它会返回(全部正常)。

docker service update STACK_SERVICENAME

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接