如何在Ubuntu14.04的生产环境中配置Consul
介绍
Consul 是一个分布式、高可用性、数据中心感知的服务发现和配置系统。 它可用于在灵活而强大的界面中呈现服务和节点,使客户端始终拥有其所属基础架构的最新视图。
Consul 提供了许多不同的功能,用于提供有关您的基础架构的一致且可用的信息。 这包括服务和节点发现机制、标记系统、健康检查、基于共识的选举例程、系统范围的键/值存储等等。 通过在您的组织中利用 consul,您可以轻松地在您的应用程序和服务中建立复杂的意识水平。
在我们的 last guide 中,我们提供了一些 consul 功能的快速演示。 在本指南中,我们将开始创建可用于为您的基础设施实施服务发现的生产就绪 consul 配置。
先决条件和目标
在本系列中,我们将建立一个服务器系统,该系统将能够相互通信并维护服务信息、键/值存储池以及客户端机器的其他详细信息。 当我们安装软件并自动化我们的一些配置时,将在本指南中进行准备系统生产的第一步。
consul 文档建议您在每个数据中心运行 3 或 5 个 consul 服务器,以避免在服务器故障时丢失数据。 Consul 服务器是完成繁重工作的组件。 它们存储有关服务和键/值信息的信息。 为了避免选举期间的僵局问题,需要奇数个服务器。
除了 consul 服务器,其他机器可以运行 consul 代理 。 Consul 代理非常轻量级,只需将请求转发到服务器。 它们提供了一种隔离服务器的方法,并将了解服务器地址的责任转嫁给代理本身。
为了让我们在后面的指南中实现一些安全机制,我们需要在一个域中命名我们所有的机器。 这样我们就可以在以后发布通配符 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 服务器都应该同样运行良好。 配置完成后,您应该拥有一个允许您轻松添加服务、检查和节点的系统。
以 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
和 [ 的子目录X155X] 在每个系统上的这个下:
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 }
我们还应该指定集群所在的数据中心。 这可以是任何可以帮助您识别集群物理位置的名称。 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
参数 必须 对于系统中的所有参与者都相同,因此复制文件已经满足了我们的要求。 创建新配置时请记住这一点。
完成后保存文件。
您应该将此配置文件的内容复制到将充当您的领事服务器的其他机器。 就像在第一个主机中所做的那样,将它们放在 /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 用户的会话以返回根会话:
exit
创建新贵脚本
我们现在有了我们的配置文件。 接下来,我们可以专注于创建一个 upstart 脚本,以便我们的 consul 实例在启动时自动启动,并在出现任何问题时重新启动。
由于引导集群不是我们经常要做的事情(大多数情况下,集群本身将持续存在,并且可能必须重新启动单个节点并重新加入集群),因此我们不会将引导纳入 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
完成后保存并关闭文件。
启动集群
现在,我们已经准备好让 consul 集群快速启动并运行。 该过程相对简单。
在包含引导配置文件的服务器上(在我们的例子中为 server1),使用 su
短暂更改为 consul 用户。 然后我们可以调用 consul 并将 bootstrap 目录作为参数传入:
su consul consul agent -config-dir /etc/consul.d/bootstrap
该服务应该启动并占据终端窗口。 在引导模式下,该服务器将自选为领导者,为形成集群奠定基础。
在您的其他领事服务器上,以 root 身份启动我们刚刚使用 upstart 脚本创建的领事服务,方法是键入:
start consul
这些服务器将连接到引导服务器,完成集群。 至此,我们有一个由三台服务器组成的集群,其中两台运行正常,其中一台处于引导模式,这意味着它可以在不咨询其他服务器的情况下做出执行决策。
这不是我们想要的。 我们希望每台服务器都处于平等地位。 既然已经创建了集群,我们可以关闭引导的 consul 实例,然后作为普通服务器重新进入集群。
为此,请在引导服务器的终端中点击 CTRL-C
:
CTRL-C
现在,退出到您的根会话并启动 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,我们将创建一个到保存 UI 文件的客户端计算机的 SSH 隧道。 Consul 在端口 8500 上提供 HTTP 接口。 我们将本地端口 8500 隧道连接到客户端计算机的端口 8500。 在本地计算机上,键入:
ssh -N -f -L 8500:localhost:8500 root@192.0.2.50
这将连接到远程机器,在我们的本地端口和远程端口之间创建一个隧道,然后将连接置于后台。
在您的本地网络浏览器中,您现在可以通过键入以下内容访问领事网络界面:
http://localhost:8500
这将为您提供默认的 Web UI 页面:
您可以使用此界面来检查服务器的运行状况并大致了解您的服务和基础架构。
使用完 Web UI 后,您可以关闭 SSH 隧道。 使用ps
命令搜索进程的pid号,使用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 集群可以快速轻松地引导和启动。 通过复制现有服务器的配置文件(consul config 和 upstart 脚本),可以快速配置其他节点。
尽管我们现在以一种允许我们轻松管理服务的方式设置了我们的领事环境,但我们还没有完全保护我们的通信。 在下一篇指南中,我们将重点介绍如何设置 SSL 证书验证,以加密和验证我们成员的 RPC 通信。