介绍
Consul是一个分布式,高可用性,数据中心感知,服务发现和配置系统。 它可以用于在一个灵活和强大的接口中呈现服务和节点,允许客户端始终拥有其作为其一部分的基础设施的最新视图。
领事提供了许多不同的功能,用于提供关于您的基础设施的一致和可用的信息。 这包括服务和节点发现机制,标记系统,运行状况检查,基于共识的选举程序,系统范围的键/值存储等。 通过利用组织内的领事,您可以轻松地在应用程序和服务中建立复杂的意识。
在我们过去的指导 ,我们提供了一些领事的功能的快速演示。 在本指南中,我们将开始创建可用于开始为基础架构实施服务发现的生产就绪的consul配置。
先决条件和目标
在本系列中,我们将设置一个服务器系统,这些服务器将能够相互通信并维护服务信息,键/值存储池以及客户端计算机的其他详细信息。 在我们安装软件和自动化我们的一些配置时,我们将在本指南中介绍完成系统生产准备的第一步。
领事文档建议您在每个数据中心运行的是3或5 领事服务器 ,以避免在一台服务器出现故障时数据丢失。 领事服务器是执行繁重工作的组件。 它们存储关于服务和键/值信息的信息。 奇怪的服务器是必要的,以避免选举期间的僵局问题。
除了领事服务器,其他机器可以运行领事代理 。 领事代理非常轻量级并且简单地将请求转发到服务器。 它们提供了一种隔离服务器的方法,并将知道服务器地址的责任卸载给代理自身。
为了在以后的指南中实现一些安全机制,我们需要在一个域中命名所有的机器。 这样,我们可以稍后颁发通配符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服务器应该同样工作良好。 配置完成后,您应该具有一个能够轻松添加服务,检查和节点的系统。
以root用户身份登录到计算机,以完成本指南中的步骤。
下载和安装领事
如果您没有已安装领事初步介绍领事指南 ,你将不得不做了。 我们将在我们配置的四台机器中的每一台上安装consul作为系统级应用程序。
在我们看看领事应用程序,我们需要得到unzip
解压可执行文件。 更新本地系统的包缓存,然后使用安装程序包apt
:
apt-get update
apt-get install unzip
现在,我们可以去获得领事程序。 该领事项目的页面提供的下载链接为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
命令。 这将允许您测试一些功能。 我们在最后一个指南中做了这个,以熟悉软件。
然而,我们将尝试建立一个更可靠的系统,更容易管理,所以我们将创建一些结构来使这项工作。 在每台计算机(服务器和客户端)上完成以下步骤。
我们应该照顾的第一件事是创建一个特定于我们任务的用户。 这是用户权限分离的标准情况,因此我们将使用专用用户运行我们的领事流程。
通过键入以下内容创建用户:
adduser consul
你可以跳过所有的提示(你可能想设置一个密码,它会抱怨否则)如果你想。
接下来,我们将创建配置层次结构,其中包含我们将根据我们如何启动服务使用的不同配置。 为了简单起见,我们将家长consul.d
目录/etc
配置结构,并把子目录叫做bootstrap
, server
和client
在这个每个系统上:
mkdir -p /etc/consul.d/{bootstrap,server,client}
我们可以把我们的配置在每一个后面。 每个服务器可能最多使用这些目录中的两个,但是我们将在每个主机上创建一致性的结构。
我们还需要创建一个位置,consul可以在重新启动之间存储持久数据。 我们将创建在目录/var/consul
为此,它给了consul
用户,以便它可以管理数据:
mkdir /var/consul
chown consul:consul /var/consul
有了这个结构,我们应该能够开始制作我们的配置文件。
创建引导程序配置
我们需要创建的第一个配置是引导集群。 这不是一个非常常见的事件,因为它只需要最初创建集群。 但是,我们将创建配置文件,以便在群集完全关闭的情况下,我们可以快速重新启动。
您可以将此配置文件仅放置在您的一个服务器服务器上,或者在所有服务器上为您提供更多的引导选项。 我们只能把它放在server1
这个演示。
配置文件存储在简单的JSON中,因此它们非常容易管理。 中创建的第一个文件bootstrap
子目录:
nano /etc/consul.d/bootstrap/config.json
在这个文件中,我们可以通过指定当使用此配置时,consul应该在启动模式下作为服务器启动:
{
"bootstrap": true,
"server": true
}
我们还应该指定集群将要驻留的数据中心。 这可以是帮助您标识集群的物理位置的任何名称。 领事是数据中心感知,这些指定将帮助您按数据中心组织不同的集群。
我们还可以传递,我们在创建的数据目录/var/consul
。 领事将使用它来存储有关集群状态的信息:
{
"bootstrap": true,
"server": true,
"datacenter": "nyc2",
"data_dir": "/var/consul"
}
接下来,我们要对consul使用的 Whisper协议实施一些加密。 它具有使用共享秘密系统内置的此功能。 秘密必须是16位base-64编码字符串。 要获取适合此值的值,我们将临时退出该文件。
在终端,我们可以使用consul
命令生成所需的长度和编码的关键。 类型:
consul keygen
X4SYOinf2pTAcAHRhpj7dA==
复制生成的值并重新打开配置文件:
nano /etc/consul.d/bootstrap/config.json
使用复制的字符串作为价值encrypt
参数:
{
"bootstrap": true,
"server": true,
"datacenter": "nyc2",
"data_dir": "/var/consul",
"encrypt": "X4SYOinf2pTAcAHRhpj7dA=="
}
最后,我们将添加一些额外的信息来指定日志级别,并指明要使用syslog进行日志记录:
{
"bootstrap": true,
"server": true,
"datacenter": "nyc2",
"data_dir": "/var/consul",
"encrypt": "X4SYOinf2pTAcAHRhpj7dA==",
"log_level": "INFO",
"enable_syslog": true
}
保存并在完成后关闭文件。
创建常规服务器配置
现在我们已经完成了引导配置,我们可以使用它作为我们的一般服务器配置的基础。 一旦集群被引导,将使用服务器配置。
通过复制引导文件启动server1
到该机器进行编辑在服务器子目录:
cp /etc/consul.d/bootstrap/config.json /etc/consul.d/server
打开文件以进行必要的修改:
nano /etc/consul.d/server/config.json
为了开始,我们需要关闭引导标志,因为这个配置用于非引导配置。
对于服务器配置,我们需要修改的唯一其他事情是指定此节点在启动时应尝试加入的其他服务器的IP地址。 这将自动处理加入,以便我们在服务器启动后不必手动加入集群:
{
"bootstrap": false,
"server": true,
"datacenter": "nyc2",
"data_dir": "/var/consul",
"encrypt": "X4SYOinf2pTAcAHRhpj7dA==",
"log_level": "INFO",
"enable_syslog": true,
"start_join": ["192.0.2.2", "192.0.2.3"]
}
该encrypt
参数必须是系统中所有的参与者一样,所以复制文件已经慎重了,要求我们。 创建新配置时请记住这一点。
完成后保存文件。
您应该将此配置文件的内容复制到将充当您的领事服务器的其他计算机。 将它们放置在一个文件中/etc/consul.d/server/config.json
就像你在第一个主机一样。
在其他主机上需要修改的唯一值是它应尝试连接的IP地址。 您应该确保它尝试连接到第一个服务器,而不是它自己的IP。 例如,在我们的示例中的第二个服务器将有一个如下所示的文件:
{
"bootstrap": false,
"server": true,
"datacenter": "nyc2",
"data_dir": "/var/consul",
"encrypt": "X4SYOinf2pTAcAHRhpj7dA==",
"log_level": "INFO",
"enable_syslog": true,
"start_join": ["192.0.2.1", "192.0.2.3"]
}
保存并关闭完成后创建的文件。
创建客户端配置
现在,我们的服务器配置都完成了。 我们可以专注于让我们的客户端机器运行和正确的配置。
在客户端计算机上的client子目录下打开一个配置文件:
nano /etc/consul.d/client/config.json
我们将再次使用先前的配置作为我们新配置的基础。 将其中一个服务器文件的内容复制到此文件中。
我们将通过删除任何提及开始了bootstrap
参数,因为这仅适用于服务器配置和改变server
参数设置为false。
接下来,我们将添加一个指定web UI目录位置的参数。 我们将会收到一些必要的文件。 在那里他们将驻留的位置是/home/consul/dist
。
最后,我们要调整start_join
参数列出我们所有的服务器:
{
"server": false,
"datacenter": "nyc2",
"data_dir": "/var/consul",
"ui_dir": "/home/consul/dist",
"encrypt": "X4SYOinf2pTAcAHRhpj7dA==",
"log_level": "INFO",
"enable_syslog": true,
"start_join": ["192.0.2.1", "192.0.2.2", "192.0.2.3"]
}
保存并在完成后关闭文件。
下载Web UI文件
现在我们已经配置客户端来服务Web UI,我们需要获取实际的文件,这将允许我们这样做。
在领事网站,用鼠标右键单击链接领事web用户界面 ,然后选择“复制链接位置”或任何类似的选项你有。
在客户端,使用su
成为consul
用户。 我们将设立在web目录consul
用户的主目录。
su consul
cd ~
现在,类型wget
,后跟一个空格和粘贴复制于Web UI下载的链接。 在撰写本文时,它将如下所示:
wget https://dl.bintray.com/mitchellh/consul/0.3.0_web_ui.zip
解压缩下载的文件并删除zip文件:
unzip *.zip
rm *.zip
这将创建一个名为dist
你的home目录中。 这是我们将Web UI参数指向配置文件的目录。
在我们继续之前,您应该退出领事用户的会话以返回到根会话:
exit
创建Upstart脚本
我们现在有了我们的配置文件。 接下来,我们可以专注于创建一个upstart脚本,以便我们的consul实例在引导和重新启动时自动启动,以防出现任何问题。
因为引导集群不是我们必须经常做的事情(大多数时候,集群本身将持续存在,单个节点可能需要重新启动并重新加入集群),我们不会将bootstrapping放在upstart脚本中。 我们将向您展示如何手动完成此过程。
我们的upstart脚本将在我们的服务器和客户端上类似。 在领事服务器之一,中创建一个文件/etc/init
目录来存放你的领事配置:
nano /etc/init/consul.conf
我们将这个文件的内容复制到其他服务器,然后使用它作为我们的客户端配置的基础。 在此文件中,第一个业务顺序是创建过程的描述。 在我们的服务器上,我们将使用:
description "Consul server process"
接下来,我们指定进程开始的条件。 对于此服务,我们希望服务在本地文件系统挂载时以及公共网络接口运行时开始。
我们还想指定进程何时停止。 使用标准的Linux运行级别 ,我们可以告诉它停止的过程,只要它是不是在正常的工作模式之一(停止或重新启动服务器时停止进程):
description "Consul server process"
start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel [!12345]
我们可以告诉init系统重新启动进程,如果它意外崩溃。 我们还想指定进程应在其下运行的用户和组。 记住,我们创建了consul用户和组来隔离进程:
description "Consul server process"
start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel [!12345]
respawn
setuid consul
setgid consul
最后,我们需要提供我们想要运行的实际命令。 这将仅仅是consul
在代理模式下运行命令。 我们将传递包含我们的服务器配置规范的目录作为命令的参数:
description "Consul server process"
start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel [!12345]
respawn
setuid consul
setgid consul
exec consul agent -config-dir /etc/consul.d/server
完成后保存文件。
这个文件的内容复制到一个名为/etc/init/consul.conf
每个服务器和客户端的为好。
在客户端上,我们需要修改文件一点。 我们应该更改描述以引用这是一个客户端机器的事实。 我们还需要改变传递到实际配置目录consul
命令。
结束文件应该看起来像这样:
description "Consul client process"
start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel [!12345]
respawn
setuid consul
setgid consul
exec consul agent -config-dir /etc/consul.d/client
保存并在完成后关闭文件。
启动群集
现在,我们有一切准备就绪,使领事集群快速运行。 这个过程比较简单。
在包含引导配置文件( 服务器在我们的例子)的服务器,使用su
简单地更改为用户领事。 然后我们可以调用consul并将bootstrap目录作为参数传入:
su consul
consul agent -config-dir /etc/consul.d/bootstrap
服务应该启动并占据终端窗口。 在引导模式下,此服务器将自选为领导者,为形成集群创建基础。
在您的其他consul服务器上,以root身份启动我们刚刚使用upstart脚本创建的consul服务,方法是键入:
start consul
这些服务器将连接到引导的服务器,完成集群。 在这一点上,我们有三个服务器的集群,其中两个正常运行,其中一个处于引导模式,这意味着它可以在不咨询其他服务器的情况下执行决策。
这不是我们想要的。 我们希望每个服务器平等。 现在集群已创建,我们可以关闭引导的consul实例,然后作为正常服务器重新进入集群。
要做到这一点,打CTRL-C
在自举服务器的终端:
CTRL-C
现在,返回到您的根会话,并启动领事服务,就像您对其他服务器所做的那样:
exit
start consul
这将导致以前引导的服务器以未提升的权限加入集群,从而使集群处于其最终状态。
现在集群已完全运行,客户端计算机可以连接。 在客户端计算机上,执行与root用户相同的过程:
start consul
客户端将作为客户端连接到集群。 您可以通过在任何计算机上为其成员请求consul来查看集群成员(服务器和客户端):
consul members
Node Address Status Type Build Protocol
server3 192.0.2.3:8301 alive server 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
agent1 192.0.2.50:8301 alive client 0.3.0 2
连接到Web UI
我们已将客户端计算机配置为托管集群的Web界面。 然而,这是在本地接口,这意味着它不是我们使用机器的公共接口访问。
要访问Web UI,我们将创建一个到包含UI文件的客户端机器的SSH隧道。 Consul服务于端口8500上的HTTP接口。我们将本地端口8500隧道到客户端计算机的端口8500.在本地计算机上,键入:
ssh -N -f -L 8500:localhost:8500 root@192.0.2.50
这将连接到远程机器,在本地端口和远程端口之间创建隧道,然后将连接放入后台。
在本地Web浏览器中,您现在可以通过键入以下内容访问consul web界面:
http://localhost:8500
这将为您提供默认的Web UI页面:
您可以使用此接口检查服务器的运行状况,并概述您的服务和基础架构。
使用Web UI完成后,可以关闭SSH隧道。 搜索使用进程的PID号ps
命令和grep
搜索,我们转发的端口号:
ps aux | grep 8500
1001 5275 0.0 0.0 43900 1108 ? Ss 12:03 0:00 ssh -N -f -L 8500:localhost:8500 root@192.241.170.60
1001 5309 0.0 0.0 13644 948 pts/7 S+ 12:12 0:00 grep --colour=auto 8500
在上面的输出中(在包含我们使用的隧道命令的行上)突出显示的数字是我们正在寻找的pid号。 然后,我们可以通过这个给kill
命令关闭隧道:
kill 5275
结论
你现在应该有一个稳定的方式来管理你的领事成员。 领事集群可以被自动启动并且快速和容易地启动。 通过复制现有服务器的配置文件(consul config和upstart脚本)可以快速配置其他节点。
虽然我们现在的安全环境设置方式允许我们轻松管理我们的服务,但我们还没有完全确保我们的通信。 在接下来的指南中,我们将重点放在如何建立SSL证书验证,以加密和验证我们成员的RPC通信。