动手停止服务并观察Swarm,为此需先找出服务正在运行的节点,将Docker客户端指向它,然后删除容器:
我们列出了Jenkins进程并过滤出期望状态的进程,运行docker service ps-f desired-state=running jenkins。输出被传送到tail命令,该命令将标题行tail-n +2删除,之后再次传送给awk命令,该命令将输出限制为包含运行进程的节点的第四列awk '{print $ 4}'。最终结果存储在NODE变量中。
接着使用eval命令来创建将被Docker客户端用来操作远程引擎的环境变量。最后得到镜像ID,并使用ps命令和rm命令的组合删除容器。
正如前面章节中学到的那样,如果容器发生故障,Swarm会在集群内的某处再次运行它。当创建服务时,我们会告诉Swarm期望的状态是运行一个实例,然后Swarm会尽最大努力确保我们的期望得到满足。
让我们确认服务确实正在运行:
如果Swarm决定在另一个节点上重新运行Jenkins,则可能需要一些时间才能拉取到镜像。过一会儿之后,service ps命令的输出应如下所示:
可以通过重新打开UI来最终确认:(www.xing528.com)
给Windows用户的说明
Git Bash可能不支持open命令,如果真是这样的话,则执行docker-machine ip <SERVER_NAME>来查找机器的IP,然后直接在浏览器中打开URL,比如上面的命令应该被替换为docker-machine ip swarm-1,如果命令输出的是1.2.3.4,则应该在浏览器里打开http://1.2.3.4:8082/jenkins。
由于Jenkins不允许未经认证的用户访问,所以需要登录,请使用admin同时作为用户名和密码。
你会注意到,这一次,我们无需重复安装过程,尽管新的Jenkins镜像在不同的节点上运行,但由于挂载了的主机目录,所以其状态还是被保留了。
我们设法让Jenkins具有容错能力,但是并没有设法让它不停机地运行。由于其架构——Jenkins master不能被缩放,因此,当我们通过移除容器来模拟故障时,没有别的实例可以接收流量。即使Swarm将其重新安排在不同的节点上,仍有一些停机时间。在短时间内,服务无法被访问。虽然这不是一个完美的状态,但我们已经设法将停机时间降至最低。让Jenkins能够容错,但无法在没有停机的情况下运行。考虑到其架构,我们已经尽力了。
接下来要介绍的是Jenkins代理,它们将实际执行持续部署流程。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。