首页 理论教育 持续交付集群搭建:微服务运维实战

持续交付集群搭建:微服务运维实战

时间:2026-01-26 理论教育 筱悦 版权反馈
【摘要】:本章所有命令都可以从05-continuous-delivery.shGist里找到。让我们回到第4章中创建的cloud-provisioning目录,并运行scripts/dm-swarm.sh脚本。我们称它们为swarm-test-1、swarm-test-2和swarm-test-3。下面将会执行scripts/dm-test-swarm.sh脚本来创建集群:node ls命令的输出如下:目前唯一还没做的就是创建Docker注册表服务。通常,我们必须配置Docker Engine以将注册表服务视为不安全的并允许它通信。而且,Docker Engine的默认行为是仅允许本地主机与注册表通信,这意味着不需要更改其配置。

类生产集群最少需要几个服务器?要我说是两个。一方面,如果只有一台服务器,则无法测试网络和卷是否能跨节点工作,所以它必须是复数。另一方面,我不想过度压榨你的笔记本电脑,因此,除非必要,我们将避免增加这个数字。

对于类生产集群,两个节点应该足够,但我们应该再添加一个节点来运行测试和构建镜像。生产集群应该会更大一些,因为它要运行更多的服务。目前我们使用三个节点,稍后如果需要,可以增加,如你所知,向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的默认行为是仅允许本地主机与注册表通信,这意味着不需要更改其配置。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈