在 Ubuntu 14.04 上使用服务发现系统 Consul 简介

简介

领事 是一个分布式、高可用、数据中心感知的服务发现和配置系统。它可用于在灵活而强大的界面中呈现服务和节点,从而允许客户端始终对其所属的基础设施有最新的了解。

Consul提供了许多不同的功能,用于提供有关您的基础设施的一致和可用的信息。这包括服务和节点发现机制、标记系统、运行状况检查、基于共识的选举例程、系统范围的键/值存储等。通过在您的组织中利用咨询,您可以轻松地在您的应用程序和服务中构建复杂的感知级别。

在本指南中,我们将向您介绍使用Consul的一些基本知识。我们将介绍在您的服务器上运行Consul以对其进行测试所需的一般过程。在下一个指南中,我们将重点介绍如何在生产环境中设置领事。

前提条件和目标

在本指南中,我们将熟悉使用Consul为您的基础设施构建服务发现和配置系统。

对于我们的演示,我们将配置三个服务器和一个客户端。 服务器用于处理查询和维护系统的一致视图。 客户机也是系统的成员,可以连接到服务器以获取有关基础设施的信息。 客户端也可能包含将由consul监控的服务。

出于本指南和本系列的整体目的,我们将配置4台计算机。前三个将是如上所述的领事服务器 。最后一个是** 领事代理** ,它充当客户端,可用于查询有关系统的信息。

为了在以后实现某些安全机制,我们需要在单个域内命名所有计算机。这是为了让我们将来可以利用通配符SSL证书。

我们的机器的细节在这里:

| 主机名|IP地址|作用| | --|--|- -| | server1.example.com | 192.0.2.1 | 引导咨询服务器| | server2.example.com | 192.0.2.2 | 咨询服务器| | server3.example.com | 192.0.2.3 | 咨询服务器| | agent1.example.com | 192.0.2.50 | 咨询客户|

我们将使用64位Ubuntu 14.04服务器进行演示,但任何现代Linux服务器都应该同样出色。

下载安装领事

我们需要采取的第一步是在我们的每台机器上下载并安装咨询软件。应在上面列出的每台机器上执行以下步骤。您应该以超级用户身份登录。

在查看领事应用程序之前,我们需要获取unzip以解压缩可执行文件。我们还将使用Screen应用程序,让我们可以轻松地在一个终端窗口中进行多个会话。这对我们的介绍很有用,因为在不作为服务运行时,Consul通常占据整个屏幕。

更新本地系统包缓存,然后使用apt安装包:

1apt-get update
2apt-get install unzip screen

所以我们稍后不会忘记这样做,现在开始您的屏幕会话:

1screen

如果收到版权信息,请按回车键。 您将被拖回终端窗口,但您现在处于屏幕会话中。

现在,我们可以开始搞领事项目了。 consul project's page提供了Windows、OS X和Linux的二进制包的下载链接。

转到上面的页面,右键单击代表您的服务器的操作系统和体系结构。 在本指南中,由于我们使用的是64位服务器,我们将使用linux下的amd64链接。 选择复制链接位置或浏览器提供的任何类似选项。

在您的终端中,转到/usr/local/bin目录,我们将在该目录中保存可执行文件。输入wget和空格,然后粘贴您从站点复制的URL:

1cd /usr/local/bin
2wget https://dl.bintray.com/mitchellh/consul/0.3.0_linux_amd64.zip

现在,我们可以使用之前安装的unzip命令解压二进制包。然后,我们可以删除压缩文件:

1unzip *.zip
2rm *.zip

现在,您的所有服务器上都应该有可用的`Consulting‘命令。

启动Bootstrap服务器

要开始使用Consul,我们需要启动并运行我们的Consul服务器。在建议的多服务器环境中进行配置时,此步骤必须分阶段完成。

我们需要做的第一件事是在我们的一台服务器上以)。

在指定我们的主机的表中,我们将我们的server1指定为引导服务器。 在服务器1上,键入以下命令启动引导程序实例:

1consul agent -server -bootstrap -data-dir /tmp/consul

服务器将在当前终端中启动,并在事件发生时输出日志数据。在日志数据的末尾,您将看到以下各行:

1. . .
22014/07/07 14:32:15 [ERR] agent: failed to sync remote state: No cluster leader
32014/07/07 14:32:17 [WARN] raft: Heartbeat timeout reached, starting election
42014/07/07 14:32:17 [INFO] raft: Node at 192.0.2.1:8300 [Candidate] entering Candidate state
52014/07/07 14:32:17 [INFO] raft: Election won. Tally: 1
62014/07/07 14:32:17 [INFO] raft: Node at 192.0.2.1:8300 [Leader] entering Leader state
72014/07/07 14:32:17 [INFO] consul: cluster leadership acquired
82014/07/07 14:32:17 [INFO] consul: New leader elected: server1.example.com
92014/07/07 14:32:17 [INFO] consul: member 'server1.example.com' joined, marking health alive

如您所见,由于这是初始节点,因此没有找到集群领导者。但是,由于我们启用了引导选项,因此该服务器能够自行进入引导者状态,以便使用单个主机启动集群。

启动其他服务器

server2server3上,我们现在可以通过键入以下命令来启动consul service_less_the bootstrap选项:

1consul agent -server -data-dir /tmp/consul

对于这些服务器,您还将看到日志条目。接近尾声时,您将看到这样的消息:

1. . .
22014/07/07 14:37:25 [ERR] agent: failed to sync remote state: No cluster leader
32014/07/07 14:37:27 [WARN] raft: EnableSingleNode disabled, and no known peers. Aborting election.
42014/07/07 14:37:53 [ERR] agent: failed to sync remote state: No cluster leader

之所以会发生这种情况,是因为它找不到集群领导者,并且无法成为集群领导者本身。出现这种状态的原因是,我们的第二台和第三台服务器已启用,但没有一台服务器彼此连接。

要相互连接,我们需要将这些服务器彼此连接起来。这可以在任何方向上完成,但最简单的是从我们的`server1‘机器。

由于我们在server1的当前终端窗口中运行的是consul服务器,所以我们将不得不创建另一个带有creen的终端以进行额外的工作。通过键入以下命令,在server1的现有屏幕会话中创建一个新的终端窗口:

1CTRL-A C

这将打开一个新的终端实例,同时保持我们之前的会话运行。您可以通过键入以下命令逐步完成现有的每个终端会话:

1CTRL-A N

回到你的fresh终端,通过引用其他两个实例的IP地址加入它们,如下所示:

1consul join 192.0.2.2 192.0.2.3

这应该会立即将所有三台服务器加入到同一群集中。您可以通过键入以下命令来仔细检查:

1consul members
1Node Address Status Type Build Protocol
2server1.example.com 192.0.2.1:8301 alive server 0.3.0 2
3server2.example.com 192.0.2.2:8301 alive server 0.3.0 2
4server3.example.com 192.0.2.3:8301 alive server 0.3.0 2

如上所述,通过在Screen中创建一个新的终端会话并发出相同的命令,您也可以从任何其他服务器获取此信息。

移除Bootstrap服务器并重新加入为普通服务器

我们已经将所有三台服务器加入到一个集群中,但我们还没有完成。

目前,由于server1是在引导模式下启动的,因此它有权在不咨询其他服务器的情况下做出决定。 由于它们应该平等地运行并按仲裁进行决策,因此我们希望在集群引导后删除此特权。

为此,我们需要停止server1上的咨询服务。这将允许剩余的机器选择新的领导者。然后,我们可以在没有bootstrap选项的情况下重启server1上的咨询服务,并重新加入集群。

在服务器1上,切换回终端运行领事:

1CTRL-A N

键入以下命令以停止该服务:

1CTRL-C

现在,在不使用引导选项的情况下重新启动服务:

1consul agent -server -data-dir /tmp/consul

切换回您的开放终端,通过连接集群中的两台服务器之一重新加入集群:

1CTRL-A N
2consul join 192.0.2.2

现在,您的三台服务器应该处于同等地位。它们将相互复制信息,并处理单个服务器变得不可用的情况。其他服务器现在也可以加入集群,只需启动服务器而无需引导即可加入集群。

作为客户端加入集群,服务Web用户界面

现在服务器集群已可用,我们可以继续使用客户端机器进行连接。

我们将在客户端计算机上放置咨询Web用户界面,以便我们可以与群集交互并监视其运行状况。为此,请访问Web UI.的下载页面右击下载按钮,选择复制链接位置或任何可用的类似选项。

在客户端计算机上,切换到您的主目录。输入wget和一个空格,然后粘贴您从页面复制的URL:

1cd ~
2wget https://dl.bintray.com/mitchellh/consul/0.3.0_web_ui.zip

下载完成后,解压并删除存档文件:

1unzip *.zip
2rm *.zip

将有一个名为dis的目录,其中包含呈现领事Web用户界面所需的所有文件。我们只需要在连接到集群时指定此目录。

要连接到集群,我们将使用与服务器类似的对咨询代理的调用。然而,我们将使用不同的旗帜。

我们不会使用server标志,因为我们希望在客户端模式下操作。默认情况下,可以使用本地环回接口访问每个节点的客户端接口。由于我们希望远程访问Web用户界面,因此必须指定客户端的公共IP地址。

我们必须将Consul指向包含Web用户界面的目录,以便提供该内容。此外,我们将通过传递集群中一台服务器的IP地址来立即加入集群。这将使我们避免不得不在之后加入。对于服务器示例,我们也可以在早些时候做到这一点。

最后,我们的连接命令相当长。它将如下所示:

1consul agent -data-dir /tmp/consul -client 192.0.2.50 -ui-dir /home/your_user/dir -join 192.0.2.1

这将把我们的客户端计算机作为常规的非服务器代理连接到集群。该代理将在其公共IP地址而不是通常的127.0.0.1接口上响应请求。因此,您需要为任何指定rpc-addr的consul命令添加一个额外的标志。

例如,如果要从客户端查询成员列表,则必须通过传递您选择的替代接口和端口来实现:

1consul members -rpc-addr=192.0.2.50:8400
1Node Address Status Type Build Protocol
2agent1 192.0.2.50:8301 alive client 0.3.0 2
3server2 192.0.2.2:8301 alive server 0.3.0 2
4server1 192.0.2.1:8301 alive server 0.3.0 2
5server3 192.0.2.3:8301 alive server 0.3.0 2

这可能看起来很麻烦,但它为我们提供了访问领事网络界面的机会。您可以通过访问客户端的IP地址,然后在Web浏览器中访问:8500/ui来进入Web界面:

1http://192.0.2.50:8500/ui

主界面看起来像这样:

领事馆网页界面登陆页

您可以点击不同的菜单并浏览界面。这为您提供了一种很好的方式来可视化您的集群以及机器和服务的运行状况。

添加服务和检查

现在,我们希望将服务添加到Consul,这是设置此设置的主要用例。您可以通过多种方式添加服务,但最简单的方法是创建一个配置目录来存储服务定义。

服务与包含服务定义的节点相关联。 因此,如果我们有一个Web服务器,我们应该在该服务器上安装咨询代理,并在那里创建一个服务定义文件。

出于我们的目的,我们将在我们的客户端上安装Nginx来演示这一点。键入以下命令以终止当前客户端会话:

1CTRL-C

通过键入以下命令在客户端上安装Nginx:

1apt-get install nginx

现在,我们可以创建一个配置目录来存储我们的服务定义:

1mkdir ~/services

在该目录中,我们将创建一个JSON文件来描述我们的Web服务。我们将其命名为web.json

1nano ~/services/web.json

在这个文件中,我们需要包含服务定义的结构。 在这个结构中,我们将为服务的健康检查定义一个子结构,以便我们能够可靠地判断它是否正在运行。

基本轮廓如下所示:

1{
2    "service": {
3        . . .
4        "check": {
5            . . .
6        }
7    }
8}

对于服务,我们需要为服务定义一个名称,并告诉consul它应该检查哪个端口。 此外,我们可以给它一个标签列表,我们可以使用它来任意地对服务进行分类,以实现我们自己的排序目的。

对于我们的示例,如下所示:

 1{
 2    "service": {
 3        "name": "web server",
 4        "port": 80,
 5        "tags": ["nginx", "demonstration"],
 6        "check": {
 7            . . .
 8        }
 9    }
10}

这就是我们定义服务本身所需的全部内容。但是,我们还希望定义一种方法,让领事可以用来验证服务的运行状况。这通常相当简单,并且将复制正常系统管理员的手动检查。

对于我们的服务,我们将实现一个简单的Web请求,将curl作为其自己的documentation.]中列出的领事项目我们实际上不需要知道cURL能够检索到什么,我们只关心该命令是否能够无错误地执行。正因为如此,我们可以扔掉任何产出。

我们还需要设置运行检查的间隔。这始终是性能和最新信息之间的折衷。我们将使用10秒,因为我们希望相对较快地知道是否有问题:

 1{
 2    "service": {
 3        "name": "web server",
 4        "port": 80,
 5        "tags": ["nginx", "demonstration"],
 6        "check": {
 7            "script": "curl localhost:80 > /dev/null 2>&1",
 8            "interval": "10s"
 9        }
10    }
11}

完成后保存并关闭该文件。

现在,我们只需重新启动客户端咨询会话,并指向具有服务定义的目录:

1consul agent -data-dir /tmp/consul -client 192.0.2.50 -ui-dir /home/your_user/dist -join 192.0.2.1 -config-dir /home/your_user/services

这将重新启动节点并将其连接到群集。如果您返回到Web界面,现在应该会看到一项服务:

领事介绍service

回到您的客户端,您可以创建一个新终端并暂时停止Web服务器:

1CTRL-A C
2service nginx stop

当您刷新Web用户界面时,您可以看到Web服务检查现在如预期的那样失败:

领事介绍失败service

这表明我们的健康检查工作如期进行。

结论

现在您应该对领事的工作方式有了一个基本的了解。我们在本指南中提供的演示并不完全是在生产中处理咨询的最佳方式,但用来让您快速了解软件的有用功能。

Next guide,]中,我们将介绍如何在生产环境中使用Consul。为了便于参考,我们将把所有配置详细信息放在文件中,并创建启动脚本以在引导时启动服务。

Published At
Categories with 技术
Tagged with
comments powered by Disqus