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