首页 理论教育 使用REX-Ray持久化有状态服务

使用REX-Ray持久化有状态服务

时间:2023-11-06 理论教育 版权反馈
【摘要】:我们将从手动设置REX-Ray开始。对于有状态服务来说,如果它是一种很好的方案,那么将把它移植到Packer和Terraform配置中。安全组的值应该与我们使用terraform output security_group_id命令检索的值相同。可以使用rexray volume create命令来创建卷。这一次,我们将使用REX-Ray作为卷驱动程序:刚才执行的命令与之前创建jenkins服务尝试的唯一区别是--mount参数。图14-4创建AWS EFS卷并挂载到REX-Ray如你所见,REX-Ray创建了一个名为rexray/jenkins的新的EFS卷,并在与运行jenkins服务的节点相同的可用区中挂载了一个目标。

使用REX-Ray持久化有状态服务

我们将从手动设置REX-Ray开始。对于有状态服务来说,如果它是一种很好的方案,那么将把它移植到Packer和Terraform配置中。从手动设置开始的另一个原因是让你更好地理解它是如何工作的。让我们开始吧。

除了AWS访问密钥和我们已经多次使用的区域之外,还需要之前用Terraform创建的安全组的ID:

输出应该与下面的命令相似(你的输出将有所不同):

请复制该值。很快就会用到的。

我们将登录一个节点,在其中安装和配置REX-Ray:

REX-Ray的安装相当简单。这就是我喜欢它而不是其他方案的原因之一:

输出如下:

我们安装了REX-Ray v0.6.3,以及它依赖的libStorage版本0.3.5。在这样的情况下,版本可能更新。

接下来,我们将用REX-Ray配置所需的值设置环境变量

请用实际值替换[…]。安全组的值应该与我们使用terraform output security_group_id命令检索的值相同。

现在,可以通过存储在/etc/rexray/config.yml中的YML配置文件来配置REX-Ray:

我们将驱动程序设置为efs,并向其提供AWS数据。结果输出到/etc/rexray/config.yml文件。

现在可以启动该服务了:

输出如下:

REX-Ray正在运行,现在可以退出节点:

由于不知道哪个节点将运行我们的有状态服务,所以需要在集群的每个节点上设置REX-Ray。请在Swarm manager节点2和节点3上重复设置步骤。

一旦REX-Ray在所有节点上运行,就可以试一下。请登录其中一个manager:

可以通过我们安装的rexray二进制文件直接使用REX-Ray。例如,可以列出所有卷:

输出如下:

因为还没有创建任何卷,所以输出里看不到什么。可以使用rexray volume create命令来创建卷。但是,没有必要这样做。由于它与Docker集成,所以不需要在任何操作中直接使用二进制文件。

让我们再试一次创建jenkins服务。这一次,我们将使用REX-Ray作为卷驱动程序:

刚才执行的命令与之前创建jenkins服务尝试的唯一区别是--mount参数。源现在只是一个名字jenkins,它表示卷的名称。目标仍然是相同的,代表容器中的Jenkins home。主要的区别是增加了volume-driver参数。这就是Docker应该使用rexray挂载卷的命令。

如果REX-Ray和Docker之间的集成起了作用,就应该会看到jenkins卷:

输出如下:

这一次,rexray volume get命令的输出不是空的,可以看到jenkins卷。正如我们已经提到的,不需要使用rexray二进制文件。可以通过Docker直接完成它的许多功能。例如,可以执行docker volume ls命令列出所有卷:

输出如下:

列出的卷只证明了Docker和REX-Ray注册了一个新的挂载。让我们看看在AWS中发生了什么:

给Windows用户的说明

Git Bash可能无法使用open命令。如果是这样,则请将$AWS_DEFAULT_REGION替换为你的集群正在运行的区域(例如,us-east-1),然后在浏览器中打开它。

你应该会看到一个类似于图14-4所示的界面。

图14-4 创建AWS EFS卷并挂载到REX-Ray

如你所见,REX-Ray创建了一个名为rexray/jenkins的新的EFS卷,并在与运行jenkins服务的节点相同的可用区中挂载了一个目标。

唯一缺少的,可以满足我的偏执性的是杀掉Jenkins,并确认REX-Ray在一个新的容器上挂载了EFS卷,Swarm将重新调度该容器。和以前一样,我们将从设置Jenkins开始:

给Windows用户的说明

Git Bash可能无法使用open命令。如果是这样,则请执行terraform output swarm_manager_1_public_ip来查找manager的IP,并在你选择的浏览器中直接打开URL。例如,应该将之前的命令替换为以下命令:

如果输出为1.2.3.4,则应该在浏览器中打开http://1.2.3.4/jenkins。

我们面临着反复出现的挑战,即如何找到初始的Jenkins管理员密码。好的一面是,这一挑战有助于演示使用不同方法访问容器中的内容。

这一次,我们将利用REX-Ray访问存储在EFS卷中的数据,而不是试图找到运行jenkins服务的节点和容器的ID:(www.xing528.com)

输出应与以下的命令相似:

我们创建了一个新的名为alpine的容器,该容器还使用了rexray卷驱动程序挂载到jenkins EFS卷。该命令输出了包含密码的/var/jenkins_home/secrets/ initialAdminPassword文件的内容。由于指定了--rm参数,所以在进程cat退出后,Docker删除了容器。最后的结果是密码输出到了屏幕上。请将其复制并粘贴到Jenkins UI中的管理员密码字段中。完成设置。

现在需要经历一个痛苦的过程:找到运行Jenkins的节点,得到容器的ID,并在远程Engine上执行docker rm命令。换句话说,将运行之前尝试中执行的同一组命令:

几分钟后,Swarm将重新调度该容器,Jenkins将再次运行。

请等待直到服务的当前状态变为运行:

重新加载Jenkins UI,并观察到你被重定向到登录页面,而不是初始设置。状态被保存下来了。

这个集群上的工作结束了。现在需要手动删除卷。否则,由于它不是Terraform创建的,因此,即使销毁了集群,该卷也还存在,AWS也会继续向我们收费。问题是,只要有一个或多个服务正在使用卷,卷就不能被删除,所以还需要销毁jenkins服务:

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

我要反馈