类生产集群最少需要几个服务器?要我说是两个。一方面,如果只有一台服务器,则无法测试网络和卷是否能跨节点工作,所以它必须是复数。另一方面,我不想过度压榨你的笔记本电脑,因此,除非必要,我们将避免增加这个数字。
对于类生产集群,两个节点应该足够,但我们应该再添加一个节点来运行测试和构建镜像。生产集群应该会更大一些,因为它要运行更多的服务。目前我们使用三个节点,稍后如果需要,可以增加,如你所知,向Swarm集群添加节点非常简单。
到目前为止,我们已经构建过好几次Swarm集群,所以这里不再赘述并通过脚本直接完成。
本章所有命令都可以从05-continuous-delivery.sh(https://gist.github.com/ vfarcic/5d08a87a3d4cb07db5348fec49720cbe)Gist里找到。
让我们回到第4章中创建的cloud-provisioning目录,并运行scripts/dm-swarm.sh(https://github.com/vfarcic/cloud-provisioning/blob/master/scripts/dm-swarm.sh)脚本。它将创建生产节点并将它们加入一个集群中。这些节点分别为swarm-1、swarm-2和swarm-3:
node ls命令的输出如下(为简洁起见,删除了ID):
接下来,我们将创建第二个集群。我们将用它来运行CD任务以及模拟生产环境。目前,三个节点应该足够了。我们称它们为swarm-test-1、swarm-test-2和swarm-test-3。
下面将会执行scripts/dm-test-swarm.sh(https://github.com/vfarcic/cloud-provisioning/blob/master/scripts/dm-test-swarm.sh)脚本来创建集群:
node ls命令的输出如下(为简洁起见,删除了ID):
目前唯一还没做的就是创建Docker注册表服务。我们将在每个集群中创建一个,那样它们之间就没有直接的关系,并且能够彼此独立地运作。为了让不同集群上运行的注册表共享相同的数据,我们会把相同的主机卷挂到这两个服务上。这样,从一个集群推送的镜像可以从另一个集群获得,反之亦然。请注意,我们正在创建的卷还只是一个临时解决方案,稍后将探索更好的挂载卷的方式。
让我们从生产集群开始。
我们已经在第1章使用Docker容器的持续集成中运行了注册表。那时候,我们只有一个节点并使用Docker Compose来部署服务,没有选择注册表。
给Windows用户的说明
Git Bash会修改文件系统路径,为了防止修改,请在运行代码之前执行以下命令:
这一次,我们将注册表作为Swarm服务运行:
我们公开了端口5000并保留了100 MB的内存,使用--mount参数暴露一个卷,这个参数有点类似于Docker Engine的--volume参数或Docker compose文件中的volumes参数。唯一显著的区别只是格式。这里我们指定了当前主机目录source=$ PWD应该被挂载在容器/var/lib/registry目录中。
请注意,从现在开始,我们将始终运行指定的版本。到目前为止,虽然最新的版本作为演示来说还不错,但现在我们试图模拟在“真实”集群中运行的CD流程。我们应该始终明确要运行的服务版本,这样,就可以肯定相同的服务已经通过测试并部署到生产环境中。否则,可能会遇到一种情况,其中一个版本在类似生产环境中部署和测试,但部署到生产环境中的却是另一个版本。
当使用Docker Hub的镜像时,指定版本的好处更加明显。例如,如果只运行最新版本的注册表,则不能保证稍后在第二个集群中运行注册表时最新版本不会更新。最后我们很可能在不同的集群中使用了不同版本的注册表。这可能会导致一些非常难以察觉的错误。(https://www.xing528.com)
关于版本控制我不再多说,我相信你知道它是什么以及何时使用它。
让我们回到注册表服务,也应该在第二个集群中创建它:
现在两个集群中都运行了注册表服务,如图5-1所示。
图5-1 带有注册表的CD和生产集群
目前,我们不知道注册表在哪些服务器上运行。我们所知道的只是每个集群中都有一个服务实例。通常,我们必须配置Docker Engine以将注册表服务视为不安全的并允许它通信。为此,需要知道运行注册表服务器的IP。但是,由于将它作为Swarm服务运行并暴露了端口5000,因此routing mesh将确保端口在每个节点中都处于打开状态并向服务转发请求。这让我们可以将注册表视为本地主机。可以从任何节点拉取和推送镜像,就好像注册表在每个节点上运行一样。而且,Docker Engine的默认行为是仅允许本地主机与注册表通信,这意味着不需要更改其配置。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
