简介

Consul 是一个分布式、高可用、数据中心感知的服务发现和配置系统。它可以用于以灵活和强大的接口呈现服务和节点,使客户端始终能够实时查看其所属基础设施。

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

在我们的上一篇指南中,我们快速演示了 Consul 的一些功能。在本指南中,我们将开始创建一个可用于开始实施基础设施服务发现的生产就绪 Consul 配置。

先决条件和目标

在本系列中,我们将设置一个能够相互通信并维护服务信息、键/值存储池和客户端机器其他详细信息的服务器系统。我们的系统朝着生产就绪迈出的第一步将在本指南中进行,因为我们将安装软件并自动化一些配置。

Consul 文档建议在每个数据中心运行 3 或 5 个 Consul 服务器以避免服务器故障时的数据丢失。Consul 服务器是执行大部分工作的组件。它们存储有关服务和键/值信息的信息。在选举期间避免僵局问题,需要使用奇数个服务器。

除了 Consul 服务器,其他机器可以运行 Consul 代理。Consul 代理非常轻量级,只需将请求转发到服务器。它们提供了一种隔离服务器并将知道服务器地址的责任转移到代理本身的方法。

为了在后续指南中实施一些安全机制,我们需要在单个域内为所有机器命名。这样我们就可以在以后的某个时间发出通配符 SSL 证书。

我们的机器详细信息如下:

主机名IP 地址角色server1.example.com192.0.2.1引导 Consul 服务器server2.example.com192.0.2.2Consul 服务器server3.example.com192.0.2.3Consul 服务器agent1.example.com192.0.2.50Consul 客户端

我们将在此演示中使用 64 位 Ubuntu 14.04 服务器,但任何现代 Linux 服务器都应该同样适用。配置完成后,您应该拥有一个系统,可以轻松添加服务、检查和节点。

登录到您的机器作为 root 用户,以完成本指南中的步骤。

下载和安装 Consul

如果您之前没有在Consul 入门指南中安装 Consul,现在需要进行安装。我们将在配置的四台机器上将 Consul 安装为系统级应用程序。

在查看 Consul 应用程序之前,我们需要获取 unzip 以解压可执行文件。更新本地系统的软件包缓存,然后使用 apt 安装软件包:

apt-get update

apt-get install unzip

现在,我们可以获取 Consul 程序。Consul 项目页面提供了 Windows、OS X 和 Linux 的二进制包下载链接。

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

在终端中,移动到 /usr/local/bin 目录,我们将在其中保存可执行文件。键入 wget 和一个空格,然后粘贴从网站上复制的 URL:

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。这将允许您测试一些功能。我们在上一篇指南中这样做是为了熟悉软件。

然而,我们将尝试设置一个更可靠的系统,以便更容易管理,因此我们将创建一些结构来使其工作。在每台计算机上(服务器和客户端)完成以下步骤。

我们应该首先处理的是创建一个特定于我们任务的用户。这是用户权限分离的标准情况,因此我们将使用专用用户运行我们的 Consul 进程。

通过输入以下命令来创建用户:

adduser consul

如果需要,您可以跳过所有提示(如果您愿意,可以设置密码。否则它会抱怨)。

接下来,我们将创建配置层次结构,用于根据我们希望如何启动服务使用不同配置。为了简化此过程,我们将在 /etc 配置结构中创建一个名为 consul.d 的父目录,并在每个系统上创建名为 bootstrap、server 和 client 的子目录:

mkdir -p /etc/consul.d/{bootstrap,server,client}

稍后我们可以在每个目录中放置我们的配置。每个服务器可能最多使用两个这样的目录,但我们将在每个主机上创建结构以保持一致性。

我们还需要创建一个位置,Consul 可以在重启之间存储持久数据。我们将在 /var/consul 目录下创建一个目录,并将其交给 consul 用户以便它可以管理数据:

mkdir /var/consul

chown consul:consul /var/consul

有了这个结构,我们应该能够开始制作我们的配置文件。

创建引导配置

我们需要创建的第一个配置是用于引导集群的配置。这并不是一个很常见的事件,因为它只在最初创建集群时才需要。但是,我们将创建配置文件,以便在集群完全崩溃时能够快速重新启动。

您可以将此配置文件放在您的 consul 服务器中的任何一个,或者放在所有服务器上,以便在引导时有更多的选择。在本演示中,我们将只把它放在 server1 上。

配置文件存储在简单的 JSON 中,因此它们非常容易管理。在 bootstrap 子目录中创建第一个文件:

nano /etc/consul.d/bootstrap/config.json

在这个文件中,我们可以首先指定当使用此配置时,consul 应该以引导模式启动为服务器:

{

"bootstrap": true,

"server": true

}

我们还应该指定我们的集群将位于的数据中心。这可以是任何能帮助您识别集群物理位置的名称。Consul 是数据中心感知的,这些指定将帮助您通过数据中心组织不同的集群。

我们还可以传入我们在 /var/consul 创建的数据目录。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 参数 必须 对系统中的所有参与者保持一致,因此复制文件已经为我们处理了这个要求。在创建新配置时请记住这一点。

完成后保存文件。

您应该将此配置文件的内容复制到将充当您的 consul 服务器的其他机器上。将它们放在 /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"]

}

完成后保存并关闭您创建的文件。

创建客户端配置

现在,我们的服务器配置都已经完成。我们可以专注于在客户端机器上使用正确的配置来启动和运行。

在客户端机器的客户端子目录下打开一个配置文件:

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,我们需要获取实际的文件来实现这一点。

在 consul 网站上,右键单击 consul web UI 的链接,选择“复制链接地址”或类似的选项。

在客户端上,使用 su 切换到 consul 用户。我们将在consul用户的主目录中设置 web 目录。

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的目录。这就是我们在配置文件中指定的 web UI 参数的目录。

在继续之前,你应该退出 consul 用户的会话以返回到 root 会话:

exit

创建 Upstart 脚本

现在我们已经完成了配置文件的设置。接下来,我们可以专注于创建一个 upstart 脚本,以便我们的 consul 实例在启动时自动启动,并在出现任何问题时重新启动。

由于引导集群不是我们经常需要做的事情(大多数情况下,集群本身将持续存在,只有一个节点可能需要重新启动并重新加入集群),我们不会将引导过程纳入 upstart 脚本中。我们将很快向你展示如何手动完成这个过程。

我们的 upstart 脚本在服务器和客户端上都是类似的。在 consul 服务器中的一个上,创建一个文件在/etc/init目录中来保存你的 consul 配置:

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

完成后保存并关闭文件。

启动集群

现在,我们已经准备好快速启动一个 Consul 集群了。整个过程相对简单。

在包含引导配置文件的服务器上(在我们的例子中是 server1),使用 su 切换到 consul 用户。然后我们可以调用 consul 并将引导目录作为参数传递:

su consul

consul agent -config-dir /etc/consul.d/bootstrap

服务应该会启动并占据终端窗口。在引导模式下,该服务器将自行选举为领导者,从而创建形成集群的基础。

在其他的 consul 服务器上,以 root 用户身份,通过以下命令启动我们刚刚创建的 consul 服务:

start consul

这些服务器将连接到引导服务器,完成集群的形成。此时,我们已经有了一个由三个服务器组成的集群,其中两个服务器正常运行,一个服务器处于引导模式,这意味着它可以在不咨询其他服务器的情况下做出决策。

这不是我们想要的。我们希望每个服务器都处于平等地位。现在集群已经创建,我们可以关闭引导的 consul 实例,然后以普通服务器的方式重新加入集群。

要做到这一点,在引导服务器的终端中按下 CTRL-C:

CTRL-C

现在,退出回到 root 会话,并像之前其他服务器一样启动 consul 服务:

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,我们将在客户端机器上创建一个 SSH 隧道来持有 UI 文件。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 页面:

!Consul web UI landing page

您可以使用此界面来检查服务器的健康状况,并获得服务和基础设施的概述。

当您完成使用 Web UI 时,可以关闭 SSH 隧道。使用 ps 命令和 grep 搜索我们转发的端口号来查找进程的 pid 号:

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 成员。Consul 集群可以快速、轻松地引导和启动。通过复制现有服务器的配置文件(consul 配置和 upstart 脚本),可以快速配置额外的节点。

尽管我们现在已经设置了 consul 环境,可以轻松地管理我们的服务,但我们还没有完全保护我们的通信。在下一篇指南中,我们将重点介绍如何设置 SSL 证书验证,以加密和验证我们成员的 RPC 通信。

推荐文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。