介绍
领事是一个分布式,高可用的数据中心意识,服务发现和配置系统。 它可以用于在一个灵活和强大的接口中呈现服务和节点,允许客户端始终拥有其作为其一部分的基础设施的最新视图。
领事提供了许多不同的功能,用于提供关于您的基础设施的一致和可用的信息。 这包括服务和节点发现机制,标记系统,运行状况检查,基于共识的选举程序,系统范围的键/值存储等。 通过利用组织内的领事,您可以轻松地在应用程序和服务中建立复杂的意识。
在本指南中,我们将向您介绍使用consul的一些基础知识。 我们将介绍在服务器上运行consul以测试它的必要的一般过程。 在下一个指南中,我们将重点介绍在生产环境中设置领事。
先决条件和目标
在本指南中,我们将熟悉如何使用consul来为您的基础结构构建一个服务发现和配置系统。
对于我们的演示,我们将配置三个服务器和一个客户端。 服务器用于处理查询并维护系统的一致视图。 客户端也是系统的成员,并且可以连接到服务器以获取有关基础架构的信息。 客户还可能包含将由领事监督的服务。
为了本指南的目的,以及本系列作为一个整体,我们将配置4台计算机。 前三将如上所述领事服务器 。 最后一个将是作为客户端,并且可以用于查询系统信息领事剂 。
为了让我们稍后实现一些安全机制,我们需要在单个域中命名我们的所有机器。 这样,我们将来可以利用通配符SSL证书。
我们的机器的细节在这里:
主机名 | IP地址 | 角色 |
---|---|---|
server1.example.com | 192.0.2.1 | 引导consul服务器 |
server2.example.com | 192.0.2.2 | consul服务器 |
server3.example.com | 192.0.2.3 | consul服务器 |
agent1.example.com | 192.0.2.50 | 领事客户 |
我们将使用64位Ubuntu 14.04服务器进行此演示,但任何现代Linux服务器应该同样工作良好。
下载和安装领事
我们需要采取的第一步是下载并在我们的每台机器上安装consul软件。 下面应采取步骤在每个上面列出的机器。 您应该以root身份登录。
在我们看看领事应用程序,我们需要得到unzip
解压可执行文件。 我们也将使用该screen
的应用程序,使我们能够轻松地在单个终端窗口多个会话。 这对我们的介绍很有用,因为consul通常在不作为服务运行时占用整个屏幕。
更新本地系统的包缓存,然后使用安装程序包apt
:
apt-get update
apt-get install unzip screen
所以我们不要忘记这样做,以后,现在开始您的屏幕会话:
screen
如果您收到版权信息,请按Enter键。 您将被放回到终端窗口中,但是现在您正处于屏幕会话中。
现在,我们可以去获得领事程序。 该领事项目的页面提供的下载链接为Windows,Mac OS X和Linux二进制软件包。
转到上面的页面,右键单击代表您的服务器的操作系统和体系结构。 在本指南中,由于我们使用64位服务器,我们将使用“linux”下的“amd64”链接。 选择“复制链接位置”或您的浏览器提供的任何类似选项。
在终端,移动到/usr/local/bin
目录中,我们将继续可执行文件。 键入wget
和一个空格,然后粘贴您从网站复制的网址:
cd /usr/local/bin
wget https://dl.bintray.com/mitchellh/consul/0.3.0_linux_amd64.zip
现在,我们可以提取使用的二进制包unzip
我们先前安装的命令。 然后我们可以删除压缩文件:
unzip *.zip
rm *.zip
您现在应该有consul
对所有服务器可用的命令。
启动引导服务器
要开始使用consul,我们需要让我们的consul服务器运行。 在推荐的多服务器环境中配置此步骤时,此步骤必须分阶段完成。
我们需要做的第一件事就是启动我们在一台服务器领事程序server
和bootstrap
模式。 服务器模式意味着consul将作为服务器实例而不是客户端启动。 引导选项用于第一个服务器。 这允许它将自己指定为集群的“领导者”而不进行选择(因为它将是唯一可用的服务器)。
在指定我们的东道主的表格中,我们指定了server1
自举服务器。 在server1上,通过键入以下命令来启动引导实例:
consul agent -server -bootstrap -data-dir /tmp/consul
服务器将在当前终端中启动,并且将在事件发生时输出日志数据。 在日志数据结束时,您将看到以下行:
. . .
2014/07/07 14:32:15 [ERR] agent: failed to sync remote state: No cluster leader
2014/07/07 14:32:17 [WARN] raft: Heartbeat timeout reached, starting election
2014/07/07 14:32:17 [INFO] raft: Node at 192.0.2.1:8300 [Candidate] entering Candidate state
2014/07/07 14:32:17 [INFO] raft: Election won. Tally: 1
2014/07/07 14:32:17 [INFO] raft: Node at 192.0.2.1:8300 [Leader] entering Leader state
2014/07/07 14:32:17 [INFO] consul: cluster leadership acquired
2014/07/07 14:32:17 [INFO] consul: New leader elected: server1.example.com
2014/07/07 14:32:17 [INFO] consul: member 'server1.example.com' joined, marking health alive
可以看到,没有找到集群领导,因为这是初始节点。 但是,由于我们启用了引导选项,所以此服务器能够自己进入引导状态,以便使用单个主机启动集群。
启动其他服务器
在server2
和server3
,我们现在可以不用通过键入引导选项启动领事服务:
consul agent -server -data-dir /tmp/consul
对于这些服务器,您还将看到日志条目。 到最后,你会看到这样的消息:
. . .
2014/07/07 14:37:25 [ERR] agent: failed to sync remote state: No cluster leader
2014/07/07 14:37:27 [WARN] raft: EnableSingleNode disabled, and no known peers. Aborting election.
2014/07/07 14:37:53 [ERR] agent: failed to sync remote state: No cluster leader
发生这种情况是因为它找不到集群领导者,并且没有启用成为领导者本身。 此状态发生,因为我们的第二和第三个服务器启用,但我们的服务器没有互相连接。
要彼此连接,我们需要将这些服务器彼此连接。 这可以在任何方向进行,但最简单的是从我们的server1
机器。
由于我们是在运行的当前终端窗口领事服务器server1
,我们将不得不建立与另一终端screen
,以便做额外的工作。 创建现有屏幕会话中的一个新的终端窗口server1
通过键入:
CTRL-A C
这将打开一个新的终端实例,同时保持我们以前的会话运行。 您可以通过键入以下内容逐步完成每个现有终端会话:
CTRL-A N
回到你的新终端,通过引用他们的IP地址加入其他两个实例,如:
consul join 192.0.2.2 192.0.2.3
这应该立即将所有三个服务器连接到同一个集群。 您可以通过键入以下内容仔细检查:
consul members
Node Address Status Type Build Protocol
server1.example.com 192.0.2.1:8301 alive server 0.3.0 2
server2.example.com 192.0.2.2:8301 alive server 0.3.0 2
server3.example.com 192.0.2.3:8301 alive server 0.3.0 2
您可以从任何其他服务器获取此信息,以及在屏幕中创建一个新的终端会话,如上所述,并发出相同的命令。
删除引导服务器并重新加入作为常规服务器
我们有三个服务器加入一个集群,但我们还没有完成。
目前,由于server1
是在自举模式启动,它必须做出决定,而不其他服务器咨询功率。 由于它们应该按照平等操作,并通过仲裁做出决定,因此我们希望在群集被引导后删除此特权。
要做到这一点,我们需要停止对领事服务server1
。 这将允许剩余的机器选择新的领导者。 然后,我们可以重新启动领事服务server1
不引导选项,并重新加入群集。
在server1上,切换回终端运行consul:
CTRL-A N
键入以下命令停止服务:
CTRL-C
现在,重新启动服务,而不使用引导选项:
consul agent -server -data-dir /tmp/consul
切换回打开的终端并通过连接集群中的两个服务器之一重新加入集群:
CTRL-A N
consul join 192.0.2.2
你现在应该有三个服务器可用的平等。 它们将相互复制信息,并处理单个服务器不可用的情况。 其他服务器现在也可以通过启动服务器而无需引导和加入集群来加入集群。
作为客户端加入集群并提供Web UI
现在服务器集群可用,我们可以继续使用客户端机器连接。
我们将把consul web UI放在我们的客户端机器上,以便我们可以与集群进行交互并监视其健康状况。 要做到这一点, 请访问下载页面的web用户界面 。 右键点击下载按钮,然后选择“复制链接位置”或任何类似的选项。
在客户端计算机上,切换到您的主目录。 键入wget
和一个空格,然后粘贴从网页复制的网址:
cd ~
wget https://dl.bintray.com/mitchellh/consul/0.3.0_web_ui.zip
下载完成后,解压缩并删除存档:
unzip *.zip
rm *.zip
将有一个叫做dist
包含所有必要的渲染领事web用户界面的文件。 我们只需要在连接到集群时指定此目录。
要连接到集群,我们将使用类似的调用consul代理,我们用于服务器。 我们将使用不同的标志。
我们将不使用server
的标志,因为我们要在客户端模式。 默认情况下,每个节点的客户端接口都可以使用本地环回接口访问。 由于我们要远程访问Web UI,我们必须指定客户端的公共IP地址。
我们必须将consul指向包含Web UI的目录,以便提供该内容。 此外,我们将通过传递集群中其中一个服务器的IP地址立即加入集群。 这将允许我们避免后来加入。 我们可以早些时候用服务器示例做到这一点。
最后,我们的连接命令很长。 它将如下所示:
consul 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 members -rpc-addr=192.0.2.50:8400
Node Address Status Type Build Protocol
agent1 192.0.2.50:8301 alive client 0.3.0 2
server2 192.0.2.2:8301 alive server 0.3.0 2
server1 192.0.2.1:8301 alive server 0.3.0 2
server3 192.0.2.3:8301 alive server 0.3.0 2
这可能看起来很麻烦,但它为我们提供了访问consul web界面的机会。 你可以通过访问您的客户端的IP地址的网络接口,其次是:8500/ui
在Web浏览器:
http://192.0.2.50:8500/ui
主界面将如下所示:
您可以点击各种菜单并探索界面。 这为您提供了一个好的方法来可视化您的群集和您的机器和服务的健康。
添加服务和检查
现在,我们要向consul添加服务,这是设置这个的主要用例。 您可以通过多种方式添加服务,但最简单的方法是创建配置目录以存储服务定义。
服务与包含服务定义的节点相关联。 因此,如果我们有一个Web服务器,我们应该在该服务器上安装consul代理并在那里创建一个服务定义文件。
为了我们的目的,我们将在客户端安装Nginx来演示这一点。 键入以下命令来终止当前客户端会话:
CTRL-C
通过键入以下内容在客户端上安装Nginx:
apt-get install nginx
现在,我们可以创建一个配置目录来存储我们的服务定义:
mkdir ~/services
在此目录中,我们将创建一个描述我们的Web服务的JSON文件。 我们称这个web.json
:
nano ~/services/web.json
在这个文件中,我们需要为我们的服务定义包含一个结构。 在这个结构中,我们将为服务的健康检查定义一个子结构,以便我们可靠地识别它是否运行。
基本大纲如下所示:
{
"service": {
. . .
"check": {
. . .
}
}
}
对于服务,我们需要定义服务的名称,并告诉consul应该检查哪个端口。 此外,我们可以给它一个标签列表,我们可以使用它来任意分类服务,以用于我们自己的排序目的。
对于我们的示例,这看起来像这样:
{
"service": {
"name": "web server",
"port": 80,
"tags": ["nginx", "demonstration"],
"check": {
. . .
}
}
}
这就是我们需要定义服务本身。 但是,我们还想定义一种方法,通过该方法consul可以验证服务的运行状况。 这通常相当简单,并且将复制正常的系统管理员的手动检查。
对于我们的服务,我们将实现一个简单的Web请求curl
在领事项目列出了自己的文档 。 我们实际上不需要知道curl能够检索什么,我们只关心命令是否能够没有任何错误地执行。 因此,我们可以丢弃任何输出。
我们还需要设置检查运行的时间间隔。 这始终是性能和最新信息之间的折中。 我们将使用10秒,因为我们想要知道相对很快,如果有什么问题:
{
"service": {
"name": "web server",
"port": 80,
"tags": ["nginx", "demonstration"],
"check": {
"script": "curl localhost:80 > /dev/null 2>&1",
"interval": "10s"
}
}
}
保存并在完成后关闭文件。
现在,我们可以简单地重新启动客户端consul会话,并指向此目录具有服务定义:
consul 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界面,现在应该可以看到一个服务:
回到您的客户端,您可以创建一个新的终端并暂时停止Web服务器:
CTRL-A C
service nginx stop
刷新Web UI时,您可以看到Web服务检查现在失败,如预期:
这表明我们的健康检查工作正常。
结论
你现在应该有一个基本的想法如何领事工作。 我们在本指南中提供的演示不是在生产环境中处理领事的最佳方式,而是用于让您快速查看软件的有用功能。
在接下来的指南中,我们将介绍如何在生产环境中使用领事。 我们将所有的配置细节放在文件中,以便于引用,并创建启动脚本以在启动时启动服务。