领事 - 快速指南


领事 - 简介

Consul 是一个基于 Hashicorp 的工具,用于发现和配置基础设施中的各种不同服务。它基于 Golang 并构建于 Golang 之上。构建 Consul 的核心原因之一是维护分布式系统中存在的服务。Consul 提供的一些重要功能如下。

  • 服务发现- 使用 DNS 或 HTTP,应用程序可以轻松找到它们所依赖的服务。

  • 健康检查状态- 它可以提供任意数量的健康检查。服务发现组件使用它来路由流量远离不健康的主机。

  • 键/值存储-它可以将Consul的分层键/值存储用于多种目的,包括动态配置、功能标记、协调、领导者选举等。

  • 多数据中心部署- Consul 支持多个数据中心。它用于构建额外的抽象层以扩展到多个区域。

  • Web UI - Consul 为用户提供了一个漂亮的 Web 界面,使用它可以轻松使用和管理 consul 中的所有功能。

服务发现

服务发现是Consul最重要的功能之一。它被定义为检测不同的服务和用于发现服务的网络协议。服务发现的使用对于分布式系统来说是一个福音。这是当今大型工业随着分布式系统在其环境中的进步而面临的主要问题之一。

与Etcd和Zookeeper的比较

当我们查看该领域的其他服务发现工具时,我们有两种流行的选择。软件行业的一些主要参与者过去一直在使用它。这些工具是EtcdZookeeper

让我们考虑下表来比较每个工具的不同方面。我们还将了解他们每个人内部使用的内容。

特性 领事 动物园管理员
用户界面 可用的
远程过程调用 可用的 可用的
健康检查 HTTP API HTTP API 传输控制协议
核心价值 3 种一致性模式 一致性好 一致性强
代币系统 可用的
语言 戈兰 戈兰 爪哇

领事 - 会员和代理人

Consul 成员可以定义为部署 Consul 集群时使用的不同代理和服务器模式的列表。Consul 为我们提供了一个命令行功能,使用它我们可以轻松列出与 consul 关联的所有代理。

Consul代理是Consul的核心进程。代理维护成员信息、注册服务、运行检查、响应查询等。任何代理都可以以两种模式之一运行:客户端服务器。这两种模式可以根据使用consul时所决定的角色来使用。领事代理通过向我们提供信息来提供帮助,如下所列。

  • 节点名称- 这是机器的主机名。

  • 数据中心- 配置代理运行的数据中心。每个节点必须配置为向其数据中心报告。

  • 服务器- 它指示代理是在服务器模式还是客户端模式下运行。服务器节点参与共识仲裁,存储集群状态并处理查询。

  • 客户端地址- 它是代理用于客户端接口的地址。它包括 HTTP、DNS 和 RPC 接口的端口。

  • Cluster Addr - 它是用于集群中 Consul Agent 之间通信的地址和端口集。所有其他节点必须可以访问该地址。

在下一章中,我们将了解 Consul 的架构。

领事 - 建筑

在一个数据中心工作的 consul 的架构图可以最好地描述如下:

建筑学

正如我们所观察到的,有三个不同的服务器,由 Consul 管理。工作架构通过使用 raft 算法来工作,这有助于我们从三个不同的服务器中选出一个领导者。然后根据FollowerLeader等标签对这些服务器进行标记。顾名思义,追随者负责遵循领导者的决定。所有这三个服务器都进一步相互连接以进行任何通信。

每个服务器都使用 RPC 的概念与自己的客户端进行交互。由于下面提到的Gossip 协议,客户端之间的通信是可能的。可以使用 TCP 或八卦通信方法来实现与互联网设施的通信。此通信与三个服务器中的任何一个直接联系。

筏算法

Raft 是一种用于管理复制日志的共识算法。它依赖于CAP 定理的原理,该定理指出,在存在网络分区的情况下,必须在一致性和可用性之间进行选择。CAP 定理的三个基本原理并非在任何给定时间点都能实现。人们最多只能在其中任何两个之间进行权衡。

一个Raft 集群包含多个服务器,通常数量为奇数。例如,如果我们有五台服务器,它将允许系统容忍两次故障。在任何给定时间,每个服务器都处于三种状态之一:Leader 、 FollowerCandidate。在正常操作中,只有一个领导者,所有其他服务器都是追随者。这些追随者处于被动状态,即他们自己不发出任何要求,而只是回应领导人和候选人的要求。

下图描述了 raft 算法工作的工作流程模型 -

筏算法

关键值数据

从Consul的0.7.1版本开始,引入了单独的键值数据。KV 命令用于通过命令行与 Consul 的键值存储进行交互。它公开了用于从存储中插入、更新、读取删除的顶级命令。为了获取键/值对象存储,我们调用 consul 客户端可用的 KV 方法 -

kv := consul.KV()

KVPair 结构用于表示单个键/值条目。我们可以在下面的程序中查看Consul KV Pair的结构。

type KVPair struct {
   Key string
   CreateIndex uint64
   ModifyIndex uint64
   LockIndex uint64
   Flags uint64
   Value []byte
   Session string
}

这里,上面代码中提到的各种结构可以定义如下 -

  • Key - 这是一个斜杠 URL 名称。例如 – 站点/1/域。

  • CreateIndex - 首次创建密钥时分配的索引号。

  • ModifyIndex - 上次更新密钥时分配的索引号。

  • LockIndex - 在键/值条目上获取新锁时创建的索引号

  • 标志- 应用程序可以使用它来设置自定义值。

  • - 它是最大 512kb 的字节数组。

  • 会话- 可以在创建会话对象后设置。

协议类型

Consul 有两种类型的协议,称为 -

  • 共识协议和
  • 八卦协议

现在让我们详细了解它们。

共识协议

Consul 使用共识协议来提供 CAP 定理所描述的一致性。该协议基于 Raft 算法。在实现共识协议时,使用 Raft 算法,Raft 节点始终处于三种状态中的任意一种:Follower、Candidate 或 Leader。

八卦协议

八卦协议可用于管理成员资格、跨集群发送和接收消息。在consul中,gossip协议的使用有两种方式,WAN(无线局域网)和LAN(局域网)。有三个已知的库,它们可以实现 Gossip 算法来发现对等网络中的节点 -

  • teknek-gossip - 它与 UDP 一起使用,并用 Java 编写。

  • gossip-python - 它利用 TCP 堆栈,也可以通过构建的网络共享数据。

  • Smudge - 它是用 Go 编写的,使用 UDP 来交换状态信息。

八卦协议还被用于实现和维护分布式数据库的一致性或与其他类型的数据处于一致状态、计算未知大小的网络中的节点数量、稳健地传播新闻、组织节点等。

远程过程调用

RPC 可以表示为“远程过程调用”的缩写形式。它是一个程序用来向另一个程序请求服务的协议。该协议可以位于网络上的另一台计算机中,而无需确认网络详细信息。

在 Consul 中使用 RPC 的真正好处在于,它可以帮助我们避免大多数发现服务工具前一段时间都存在的延迟问题。在 RPC 之前,Consul 过去只有基于TCPUDP的连接,这对于大多数系统来说都很好,但对于分布式系统则不然。RPC 通过减少数据包信息从一个地方传输到另一个地方的时间来解决此类问题。在这一领域,如果人们希望观察基准测试并比较性能,Google 的GRPC是一个值得期待的好工具。

领事 - 安装

出于演示目的,我们将使用 -dev 模式在开发人员模式下使用 consul 代理。仅对于本地计算机设置,我们将进行单个系统 consul 设置。请不要在您的生产中使用这个单节点 consul 集群。正如Hashicorp已经提到的,在单节点consul集群的案例场景中,数据丢失是不可避免的

安装领事

Consul 可以通过下载页面安装:www.consul.io/downloads.html

安装领事

您可以在计算机的“下载”部分中提取二进制包。

$ cd Downloads
$ chmod +x consul
$ sudo mv consul /usr/bin/

现在让我们开始使用-dev 标志来使用 consul 。

$ consul agent -dev -data-dir=/tmp/consul

输出将如以下屏幕截图所示。

开发标志

现在您可以使用以下命令检查您的领事成员。

$ consul members

输出将如以下屏幕截图所示。

会员

如果您想将其他节点加入到该节点 -

$ consul join <Node 2> <Node 3>

或者,您可以在节点 2 和 3 上运行以下命令 -

$ consul join <Node 1>

使用命令行

consul 的命令行由几个不同的选项组成,一些最常用的选项如下 -

  • agent - 运行 Consul 代理。

  • configtest - 验证配置文件。

  • event - 启动一个新事件。

  • exec - 在 Consul 节点上执行命令。

  • force-leave - 强制集群的成员离开集群。

  • info - 它为我们提供了操作员的调试信息。

  • join - 使 Consul 代理加入集群。

  • keygen - 生成新的加密密钥。

  • keyring - 管理八卦层加密密钥。

  • kv - 与键值存储交互。

  • left - 离开 Consul 集群并不强制关闭它。

  • lock - 执行命令以保持锁定。

  • maint - 控制节点或服务维护模式。

  • 成员- 它列出了 Consul 集群的成员。

  • 监视器- 它从 Consul 代理流式传输日志。

  • 运算符- 它为我们提供了一系列用于 Consul 运算符的工具。

  • reload - 它触发代理重新加载配置文件。

  • rtt - 它估计节点之间的网络往返时间。

  • 快照- 它保存、恢复和检查 Consul 服务器状态的快照。

  • version - 打印当前Consul版本。

  • watch - 留意领事的变化。

领事模板

consul-template 为我们提供了一个守护进程,用于查询 Consul 实例并更新文件系统上任意数量的指定模板。当更新过程完成时,consul-template 可以选择运行任意命令。此选项帮助我们设置 consul 集群,而无需自己手动完成所有操作。

consul 模板将在/tmp/<name-of-file>.conf.tmpfl中形成。根据Hashicorp 配置语言(HCL)编写模板的语言。

您可以从此页面下载 consul 模板。

模板

使用以下命令尝试一下 -

$ ./consul-template -h

输出将如以下屏幕截图所示。

模板输出

如果您希望将此二进制文件移动到更显眼的位置,以便用户每次都可以使用它。您可以输入以下命令 -

$ chmod +x consul-template
$ sudo mv consul-template /usr/share/bin/

出于演示目的,我们将使用nginx的示例配置作为我们的服务。您可以在https://github.com/hashicorp/consul-template/tree/master/examples尝试更多演示,或者更好地写下您自己的模板。

$ vim /tmp/nginx.conf.ctmpl

输出将如以下屏幕截图所示。

nginx

配置文件可能看起来像 -

{{range services}} {{$name := .Name}} {{$service := service .Name}}

upstream {{$name}} {
   zone upstream-{{$name}} 64k;
   {{range $service}}server {{.Address}}:{{.Port}} max_fails = 3 fail_timeout = 60
   weight = 1;
   {{else}}server 127.0.0.1:65535; # force a 502{{end}}
} {{end}}

server {
   listen 80 default_server;
   location / {
      root /usr/share/nginx/html/;
      index index.html;
   }
   location /stub_status {
      stub_status;
   }
   {{range services}} {{$name := .Name}}
   location /{{$name}} {
      proxy_pass http://{{$name}};
   }
   {{end}}
}

现在使用 consul 模板二进制文件,请运行以下命令 -

$ consul-template \
 -template = "/tmp/nginx.conf.ctmpl:/etc/nginx/conf.d/default.conf"

通过前面的命令,该过程已开始。您稍后可以打开另一个终端并使用以下命令查看完全呈现的 nginx.conf 文件。

$ cat /etc/nginx/conf.d/default.conf

输出将如以下屏幕截图所示。

输出

Consul - 使用微服务

在本章中,我们将了解微服务如何与 Consul 配合使用。我们还将了解以下组件如何影响 Consul。

  • 使用码头工人
  • 为服务发现构建注册器
  • 使用 rkt 和 Nomad

现在让我们详细讨论其中的每一个。

使用 Docker

在开始之前,请不要在生产中使用此设置,因为它仅用于演示目的。Docker 是一个基于容器的服务,使用它我们可以轻松部署我们的应用程序。为了使用 Consul,我们将使用以下链接中的图像 –0

https://hub.docker.com/r/progrium/consul/

假设您的系统已安装并正确配置了 Docker。让我们尝试通过运行以下命令从 Docker hub 中拉取镜像 -

$ docker pull progrium/consul

输出将如以下屏幕截图所示。

拉宝草

我们将通过以下方式发布一些接口及其端口(在 Docker 上使用 -p 选项)。

  • 8400(RPC)
  • 8500(HTTP)
  • 8600(域名)

另外,根据拉取操作,我们将主机名设置为node1。您可以通过使用-h 标志和您自己的主机名将其更改为您想要的任何内容,如下所示。

$ docker run -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h node1 progrium/consul
-server -bootstrap

输出将如以下屏幕截图所示。

拉制

您还可以使用 Consul 启用 UI 模式 -

$ docker run -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h node1 progrium/consul
-server -bootstrap -ui-dir /ui

您可以在http://localhost:8500上检查基于 UI 的输出。下面的屏幕截图让您更好地了解基于 UI 的输出。

基于用户界面

为了在不同节点上的各种 docker 容器上使用 consul,我们可以在不同节点上运行以下命令 -

在节点1上

$ docker run -d --name node1 -h node1 progrium/consul -server -bootstrap-expect 3

其中,-bootstrap-expect 3表示 consul 服务器将等到有 3 个对等方连接后才进行自引导并成为工作集群。

在继续之前,我们需要通过检查容器来获取容器的内部 IP。为了我们的使用、案例目的,我们将声明$ JOIN_IP

$ JOIN_IP = "$(docker inspect -f '{{.NetworkSettings.IPAddress}}' node1)"

在节点2上

因此,让我们启动 Node2 并告诉它使用上面给出的程序中声明的变量加入 Node1。

$docker run -d --name node2 -h node2 progrium/consul -server -join $JOIN_IP

在节点3上

$ docker run -d --name node3 -h node3 progrium/consul -server -join $JOIN_IP

为服务发现构建注册器

Registrator 通过在容器上线时检查容器来自动注册和取消注册任何 Docker 容器的服务。我们即将使用的Registrator目前支持可插拔服务注册表,目前包括Consul、EtcdSkyDNS2。当我们通过网络与不同的服务交互时,强烈建议使用Registrator。

$ docker pull gliderlabs/registrator:latest

输出将如以下屏幕截图所示。

滑翔机实验室

$ docker run -d \
--name = registrator \
--net = host \
--volume = /var/run/docker.sock:/tmp/docker.sock \
gliderlabs/registrator:latest \
 consul://localhost:8500

输出将如以下屏幕截图所示。

滑翔机实验室

您收到的输出是您刚刚启动的 Docker 容器的 ID。您可以使用以下命令检查容器是否正在运行 -

$ docker ps -a

他的输出将如下面的屏幕截图所示。

码头工人

您还可以使用以下命令查看Registrator的日志。

$ docker logs registrator

使用 rkt 和 Nomad

rkt 是另一个基于容器的服务,您可以在您的环境中使用它。它是由CoreOS构建的。构建 rkt 的主要原因是为了提高安全性,这是 2013-14 年 Docker 仍处于开发阶段时面临的危机问题之一。

对于 Consul,我们可以使用 Rkt Registrator 与 Consul 一起进行服务发现。rkt 涵盖的这个特定的 Registrator 项目正在开发中,不建议用于生产级别使用

您可以通过转到其路径并运行以下命令来检查 rkt 是否已安装。

$ ./rkt

您可以检查输出来检查是否已正确安装,如以下屏幕截图所示。

RKT 注册器

要尝试 rkt 和 Consul,请查看 - https://github.com/r3boot/rkt-registrator

游牧工具

最常用和最喜欢的选项之一是 Nomad 工具。Nomad 是一个用于管理机器集群并在其上运行应用程序的工具。它类似于MesosKubernetes。默认情况下,Nomad 在其内部覆盖了 Docker 和 rkt 驱动程序。因此,如果您正在寻找使用 Consul 进行大规模容器部署。Nomad 可能是一个很好的解决方案。查看 - https://www.nomadproject.io/docs/drivers/rkt.html了解有关 Nomad 的更多信息。

Consul - 引导和 DNS

在本章中,我们将讨论如何在 Consul 中使用以下组件。

  • 自动引导
  • 手动引导
  • 使用 DNS 转发
  • DNS缓存

现在让我们详细讨论其中的每一个。

自动引导

Bootstrapping 是 Consul 的核心功能之一。当您第一次安装 consul 时,它会自动配置为检测、识别和加入它遇到的节点。在集群形成过程中,自动引导是 Consul 的内置功能。要获取有关 consul 的更多信息,最好的方法是使用以下命令 -

$ sudo consul info

输出将如以下屏幕截图所示。

自动引导

该命令将展示consul在真实工作场景中的实际工作情况。它将显示在 Consul 中工作的 Raft 算法。可以使用以下命令显示自动引导命令 -

$ consul agent -server -data-dir = ”/tmp/consul” -bootstrap-expect 3

在 -dev 模式下无法完成自动引导。

该选项通知 Consul 预期的服务器节点数量,并在服务器可用时自动引导。

手动引导

手动引导是 Consul 的一个古老而有用的功能。实际上,在Consul的早期版本中,第一次安装和使用consul时必须手动完成引导。后来发现不能在不同时间执行这个命令行操作。因此,引入了自动引导。您始终可以使用以下命令手动使用引导。

在本例中,我们假设要构建一个 3 节点 consul 集群。

有两种选项可以进行手动引导

  • 在 2 个节点上运行命令:在节点 B 和节点 C 上,您可以执行以下操作 -

$ consul join <Node A Address>
  • 在 1 个节点上运行命令 -

$ consul join <Node B Address> <Node C Address>

使用 DNS 转发

DNS 通过端口 53提供服务。DNS 转发可以使用BIND、dnsmasqiptables来完成。默认情况下,Consul代理运行一个监听8600端口的DNS服务器。通过向Consul代理的DNS服务器提交DNS请求,您可以获得运行您感兴趣的服务的节点的IP地址。

Consul DNS 接口通过SRV 记录提供服务的端口信息。如果不在代码中手动添加逻辑,您通常仅限于您正在查询的服务的 IP 地址信息(即记录)。

最好的选择是拥有多个 BIND 服务器,每个服务器在本地运行一个 Consul 代理。BIND 服务器收到的任何查询都将转发到其本地 Consul Agent DNS 服务器。

使用绑定

我们可以使用绑定功能来使用 DNS 转发。可以使用以下命令来完成。

$ sudo apt-get install bind9 bind9utils bind9-doc

输出将如以下屏幕截图所示。

绑定功能

让我们使用以下命令编辑 /etc/bind/named.conf 文件。

$ sudo vim /etc/bind/named.conf

在文件中,请在代码的最后一行下方添加以下行。

options {
   directory "/var/cache/bind";
   recursion yes;
   allow-query { localhost; };
   
   forwarders {
      8.8.8.8;
      8.8.4.4;
   };
   dnssec-enable no;
   dnssec-validation no;
   auth-nxdomain no; # conform to RFC1035
   listen-on-v6 { any; };
};
include "/etc/bind/consul.conf";

输出将如以下屏幕截图所示。

绑定命令

您可以使用以下 Bind 命令来配置 Consul。

$ sudo vim /etc/bind/consul.conf

创建文件时添加以下行 -

zone "consul" IN {
   type forward;
   forward only;
   forwarders { 127.0.0.1 port 8600; };
};

现在您可以使用以下命令开始运行 consul 代理。(记得还要重新启动bind9服务。)

$ sudo service bind9 restart
$ consul agent -server -bootstrap-expect 1 -data-dir = /tmp/consul -configdir = [Path]

系统需要配置为向本地 Consul 代理的 DNS 服务器发送查询。这是通过更新系统上的resolv.conf文件以指向 127.0.0.1 来完成的。在大多数情况下,Consul 需要配置为在端口 53 上运行。

您可以将以下信息添加到/etc/resolv.conf:

nameserver 127.0.0.1

DNS缓存

Consul 为所有 DNS 结果提供“0 TTL”(生存时间)值。这可以防止任何缓存。然而,由于 TTL 值的原因,可以将其设置为允许 Consul 下游缓存 DNS 结果。较高的 TTL 值会减少 Consul 服务器上的查找次数并加快客户端的查找速度,但代价是结果越来越陈旧。

为此,我们将使用以下方法使用 DNS 缓存 -

$ sudo apt-get install dnsmasq

输出将如以下屏幕截图所示。

域名解析

现在,我们可以做一个非常简单的配置 -

$ echo "server = /consul/127.0.0.1#8600" > /etc/dnsmasq.d/10-consul

我们在这里所做的只是指定 consul 服务的 DNS 请求,这些请求将由端口 8600 上 127.0.0.1 的 DNS 服务器处理。除非您更改 consul 默认值,否则这应该可以工作。

正常情况下,应该使用以下命令。

$ dig @127.0.0.1 -p 8600 web.service.consul

对于Dnsmasq,您应该使用以下命令。

$ dig web.service.consul

输出将如以下屏幕截图所示。

网络服务

Consul - 查询节点

在本章中,我们将学习如何使用以下函数查询节点 -

  • 使用挖掘
  • 使用监控命令
  • 使用监视命令
  • 通过注册外部服务

让我们详细了解每个功能。

使用挖掘

Consul 在 127.0.0.1:8600 上侦听 Consul 中的 DNS 查询。它确定哪些节点可提供服务的方式是使用检查,可以是:

  • 执行并返回nagios 兼容代码的脚本。

  • 返回 HTTP 响应代码的 HTTP 检查。

  • TCP 检查检查端口是否打开。

尝试dig的一般命令是 -

$ dig @127.0.0.1 -p <port> <service-name>.consul

现在,让我们尝试一个示例dig命令 -

$ dig @127.0.0.1 -p 8600 web.service.consul

输出将如以下屏幕截图所示。

挖

使用监控命令

它用于连接并显示正在运行的 Consul 代理的日志。该命令将显示最近的日志。它还允许您以相对较高的日志级别记录代理。它由您可以遵循的各种日志级别组成,例如跟踪、调试、信息、警告和错误。

让我们尝试以下命令 -

$ consul monitor

输出将如以下屏幕截图所示。

监控命令

您还可以使用-log-level、-rpc-address 等子命令来设置监控命令。默认情况下,RPC 地址为 127.0.0.1:8400。欲了解更多信息,请点击此处

使用监视命令

该命令为我们提供了一种机制来监视节点列表、服务成员、键值等的变化。它还使用视图的最新值调用一个进程。如果未指定进程,则当前值将处理为STDOUT,这可能是在 Consul 中检查数据的有用方法。Consul Watch Command 帮助有多种不同的选项,如下面的屏幕截图所示 -

监视命令

让我们尝试使用-type = service进行演示,如以下命令所示。

$ consul watch -type = service -service = consul

手表类型

有关此主题的更多信息,您可以单击此处

通过注册外部服务

注册后,DNS 接口将能够返回服务的相应“A 记录”或 CNAME 记录。让我们注册一个外部服务,例如 Amazon,如以下代码块和屏幕截图所示。

$ sudo curl -X PUT -d '{"Datacenter": "dc1", "Node": "amazon",
"Address": "www.amazon.com",
"Service": {"Service": "shop", "Port": 80}}'
http://127.0.0.1:8500/v1/catalog/register

注册外部服务

上面的命令指定了一个名为 shop 的服务。该节点称为 amazon,其 URL 在端口 80 上位于www.amazon.com。让我们检查 consul 上的输出,以确保我们已正确安装此服务。为此,请打开浏览器窗口 localhost:8500。

注册外部服务

要删除该服务,我们只需使用以下命令即可。

$ curl -X PUT -d '{"Datacenter": "dc1", "Node": "amazon"}'
http://127.0.0.1:8500/v1/catalog/deregister

删除服务

让我们检查它的 UI,如下面的屏幕截图所示。

删除服务

Consul - 故障转移事件

在本章中,我们将学习 Consul 中的故障转移事件。这将在以下功能的帮助下完成 -

  • 单集群故障
  • 杰普森测试
  • 多集群故障
  • 拍摄快照

让我们详细了解其中的每一个。

单集群故障

在单个集群故障中,位于其中一个数据中心的集群开始出现故障。在每种情况下,重要的是要确保在发生故障转移时系统不仅可以防止故障转移,而且还拥有可以依赖的备份。为了防止 Consul 故障转移事件,我们将使用称为 Consul 警报的东西。主要项目可以在https://github.com/AcalephStorage/consul-alerts找到。

Consul-alerts 是一个高度可用的守护进程,用于根据 Consul 健康检查发送通知和提醒。该项目在 localhost:9000 运行守护程序和 API,并使用默认数据中心 (dc1) 连接到本地 consul 代理 (localhost:8500)。

有两种方法可以开始该项目。第一种方法是通过GO安装。对于已安装并配置 GO 的用户,他们可以按照以下步骤操作 -

$ go get github.com/AcalephStorage/consul-alerts
$ go install
$ consul-alerts start

最后一个命令可以轻松地用于覆盖 consul-alert、datacenter 选项、consul-acl 令牌等的默认端口。该命令也可以编写如下 -

$ consul-alerts start --alert-addr = localhost:9000 --consul-addr = localhost:8500
--consul-dc = dc1 --consul-acl-token = ""

第二种方法涉及用户使用Docker。这两种方法在不同的场景中同样有用。为了通过 Docker 使用 Consul-alerts,我们可以使用以下命令从 Docker Hub 中提取镜像。

$ docker pull acaleph/consul-alerts

领事警报

对于 Docker 方法,我们可以考虑以下三个选项 -

  • 使用容器本身内置的 Consul Agent。
  • 使用在另一个 Docker 容器上运行的 Consul Agent。
  • 使用 Consul 警报通过远程 Consul 实例进行链接。

现在让我们详细讨论这两个问题。

使用容器本身内置的Consul Agent

让我们使用以下命令启动 consul 代理 -

$ docker run -ti \
   --rm -p 9000:9000 \
   --hostname consul-alerts \
   --name consul-alerts \  
   --entrypoint = /bin/consul \
   acaleph/consul-alerts \
   agent -data-dir /data -server -bootstrap -client = 0.0.0.0

在这里,我们将重写标志--entrypoint提到的 Consul入口点。除此之外,我们还通过使用-p 标志、使用标志 -data-dir 和客户端 0.0.0.0 提及使用的端口、数据目录 /data 来引导客户端。

入口点

在新的终端窗口上,让我们启动 consul-alerts 选项。

$ docker exec -ti consul-alerts /bin/consul-alerts start --alertaddr = 0.0.0.0:9000
--log-level = info --watch-events --watch-checks

在上面的步骤中,我们正在执行 consul-alerts 以交互模式启动。警报地址端口为 9000。手表会在 consul 检查的同时检查 consul 代理是否已启用。

警报选项

我们可以清楚地看到领事警报已轻松启动,并且它已经注册了新的健康检查并添加了领事代理。数据中心取dc1,可根据用户更改。

使用在另一个 Docker 容器上运行的 Consul Agent

在这里,您可以使用任何类型的 consul 映像在 Docker 容器上运行。使用 consul-alerts 镜像,我们可以轻松地将 consul 容器与 consul-alerts 容器链接起来。这是使用--link 标志完成的。

注意- 在使用以下命令之前,请确保 consul 容器已在另一个终端上运行。

$ docker run -ti \
   -p 9000:9000 \
   --hostname consul-alerts \
   --name consul-alerts \
   --link consul:consul \
   acaleph/consul-alerts start \
   --consul-addr=consul:8500 \
   --log-level = info --watch-events --watch-checks

使用 Consul 警报通过远程 Consul 实例进行链接

在这里,我们应该使用以下命令来使用 Consul 警报来链接远程 consul 实例。

$ docker run -ti \
   -p 9000:9000 \
   --hostname consul-alerts \
   --name consul-alerts \
   acaleph/consul-alerts start \
   --consul-addr = remote-consul-server.domain.tdl:8500 \
   --log-level = info --watch-events --watch-checks

杰普森测试

Jespen 是一个为测试任何系统中的部分容忍和网络而编写的工具。它通过在系统上创建一些随机操作来测试系统。Jepsen 是用 Clojure 编写的。不幸的是,对于演示,Jepsen 测试需要使用数据库系统形成大量集群,因此超出了此处讨论的范围。

Jepsen 的工作原理是在五个不同的主机上设置测试数据存储。它为被测数据存储创建一个客户端,指向五个节点中的每一个发送请求。它还创建了一系列特殊的客户端,称为“Nemesis”,它们会在集群中造成严重破坏,例如使用iptables切断节点之间的链接。然后,它继续向不同节点同时发出请求,同时交替分区和修复网络。

在测试运行结束时,它修复集群,等待集群恢复,然后验证系统的中间状态和最终状态是否符合预期。一些摘录是从这里摘录的。

有关 Jepsen 测试的更多信息,请查看此处

多集群故障

在多集群故障转移事件期间,部署在多个数据中心的集群无法支持客户所支持的服务。Consul 使我们能够确保当发生此类情况之一时,Consul 具有帮助您在此类情况下启用服务的功能。

为此,我们将研究一个项目,该项目可以帮助我们将 Consul 从一个集群复制到多个集群。该项目为我们提供了一种使用 consul-replicate 守护进程在多个 Consul 数据中心复制 K/V 对的方法。您可以在https://github.com/hashicorp/consul-replicate上查看此 Hashicorp 项目。尝试这个项目的一些先决条件包括 -

  • 戈兰
  • 码头工人
  • 领事
  • git

让我们开始使用以下命令 -

注意- 在运行以下命令之前,请确保您的计算机上已正确安装和配置 Git。

$ git 克隆- https://github.com/hashicorp/consul-replicate.git

输出将如以下屏幕截图所示。

克隆

$ cd consul-replicate
$ make

输出将如以下屏幕截图所示。

复制

如果您在构建二进制文件时遇到一些问题,您还可以尝试使用以下命令手动拉取 Docker 映像 -

$ docker pull library/golang:1.7.4

上述命令将创建 bin/consul-replicate,它可以作为二进制文件调用。下表显示了它涵盖的子命令的完整列表 -

选项 描述
授权 基本身份验证用户名(和可选密码),以冒号分隔。没有默认值。
领事* 要查询的 consul 实例的位置(可以是 IP 地址或 FQDN)以及端口。
最大陈旧 查询的最大陈旧度。如果指定,Consule 将在所有服务器之间分配工作,而不仅仅是领导者。默认值为 0(无)。
安全套接字层 与 Consul 交谈时使用 HTTPS。需要将 consule 服务器配置为提供安全连接服务。默认值为 false。
SSL 验证 通过 SSL 连接时验证证书。这需要使用-ssl。默认值是true。
系统日志 将日志输出发送到 syslog(除了 stdout 和 stderr)。默认值为 false
系统日志工具 发送到系统日志时使用的工具。这需要使用-syslog。默认为本地
代币 Consul API 令牌。没有默认值。
前缀* 源前缀包括带有选项的目标前缀,以冒号 ( :)分隔。此选项是附加的,可以多次指定以复制多个前缀。
排除 复制期间要排除的前缀。此选项是附加选项,可以多次指定以排除多个前缀。
等待 复制前等待稳定的最小值(:最大值),以冒号(:)分隔。如果省略可选最大值,则假定为所需最小值的 4 倍。没有默认值。
重试 与 API 通信时 Consule 返回错误时等待的时间。默认值为 5 秒。
配置 磁盘上配置文件或配置文件目录的路径,相对于当前工作目录。CLI 上指定的值优先于配置文件中指定的值。没有默认值。
日志级别 输出的日志级别。这适用于 stdout/stderr 日志记录以及 syslog 日志记录(如果启用)。有效值为“debug”、“info”、“warn”和“err”。默认值为“warn”。
一次 运行 Consule Replicate 一次并退出(与守护进程的默认Behave相反)。(仅限 CLI)
版本 输出版本信息并退出。(仅限 CLI)

拍摄快照

快照是在备份时管理 Consul 集群的基本且重要的部分。默认情况下,Consul为我们提供了保存consul集群快照的方法。Consul 为我们提供了四个单独的子命令,我们可以使用它们来创建快照,它们是 -

  • 领事快照保存
  • 领事快照代理
  • 领事快照检查
  • Consul快照恢复

让我们详细了解其中的每一个。

领事快照保存

该命令设置为检索 Consul 服务器状态的Atomics时间点快照,其中包括键/值条目、服务目录、准备好的查询、会话和 ACL。快照将保存到提到的文件名中。

$ consul snapshot save <name-of-the-file>.snap

输出将如以下屏幕截图所示。

快照保存

要检查当前目录中是否存在该文件,请通过在当前目录中运行它来检查它。如果是非领导节点,请执行以下命令 -

$ consul snapshot save -stale <name-of-file>.snap

领事快照代理

此子命令启动一个进程,该进程拍摄 Consul 服务器状态的快照并将其保存在本地,或将它们推送到可选的远程存储服务。

快照代理

领事快照检查

它用于检查 Consul 服务器状态的时间点快照,其中包括键/值条目、服务目录、准备好的查询、会话和 ACL。该命令可以执行如下 -

注意- 请记住,以下命令只能在保存快照的目录中运行。

$ consul snapshot save <name-of-the-file>.snap

输出将如以下屏幕截图所示。

快照检查

领事快照恢复

快照恢复命令用于恢复Consul服务器状态的时间点快照,其中包括键/值条目、服务目录、准备好的查询、会话和ACL。快照是从保存的备份文件中读取的。

注意- 请记住,以下命令只能在保存快照的目录中运行。

$ consul snapshot restore <name-of-the-file>.snap

输出将如以下屏幕截图所示。

快照恢复

如果您正在使用AWS的Consul,这个项目可能会帮助您节省一些时间 - https://github.com/pshima/consul-snapshot

领事 - 使用 UI

在本章中,我们将学习如何使用 Consul UI(用户界面)并了解其重要组件。

Consul UI设置

Consul 为我们提供了一个有用的界面,使用它我们可以轻松地管理事物。您可以轻松地在您想要的任何端口上调出 consul 用户界面。Consul UI 可以分为三个重要部分,它们是 -

  • ACL - 一组规则,可轻松锁定集群

  • 数据中心- 使您能够轻松管理数据中心并使用集群。

  • 节点- Consul 集群正在使用的节点上的快速更新

使用领事用户界面

为了使用Consul UI,我们必须在Consul项目站点上安装Hashicorp团队提供的UI包。那么,让我们尝试从源下载它并开始使用它。请在每个命令之前使用sudo,以防显示“权限被拒绝”错误。

$ mkdir /opt/consul-ui
$ cd /opt/consul-ui
$ wget https://releases.hashicorp.com/consul/0.7.2/consul_0.7.2_web_ui.zip
$ unzip consul_0.7.2_web_ui.zip
$ rm consul_0.7.2_web_ui.zip

您可以在任何代理上使用以下命令查看 Consul UI 的输出。

$ consul agent -dev -ui -data-dir /tmp/consul

输出将如以下屏幕截图所示。

代理人

默认情况下,您将在http://localhost:8500/ui观察 UI 。/ui 部分与 consul 的 HTTP API 相同。

要通过 Docker 使用 Consul UI,请针对 Docker 映像 (progrium/consul) 运行以下命令 -

$ docker run -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h node1 progrium/consul
-server -bootstrap -ui-dir /ui

输出将如以下屏幕截图所示。

普罗格隆/领事

Consul UI 的特点

您可以通过查看 Consul UI 的一些功能来开始浏览它,例如 -

  • 节点
  • 前交叉韧带
  • 核心价值
  • 设置
  • 数据中心
  • 服务

让我们详细了解其中的每一个。

节点

UI Dashboard 上 Nodes 的基本用法可以观察到,如下图所示。

用户界面仪表板

当您单击特定节点(例如本例中的 node1)时,我们可以看到该节点上的信息可以轻松地视为 -

节点1

您可以随时从 Consul 取消注册该节点。它使得从高级领事集群的角度管理节点变得容易。

ACL(访问控制列表)

Consul 最好的功能之一是访问控制列表。您可以为不同数据中心的不同集群编写不同的权限。打开 ACL 最简单的方法之一是在 Consul 的数据目录中添加一个新的 json 文件。要启用和更新 ACL,您可以在设置字段中添加主 ACL 令牌,然后使用 ACL 选项卡刷新它

欲了解更多信息,请查看此处

ACL 选项卡

核心价值

Consul 的键值选项默认出现在 Consul UI 中。您可以使用 Consul UI 创建自己的密钥。它还提供了一个选项来创建一个文件夹来存储您的密钥。

核心价值

设置

您可以在屏幕右上角查看 Consul UI 的设置选项。单击该选项后,您可以轻松地看到 Consul 为您提供了一个选项,您可以使用该选项配置其本地存储设置和令牌系统以进行验证。

设置

数据中心

数据中心选项可以通过选择轻松更改和切换。Consul UI 会自动更新对 Consul 正在处理的数据中心数量的检测。

服务

Consul UI 还为您提供了一个“服务”选项卡来配置和查看当前使用 Consul 部署的服务。它为我们提供了根据节点配置服务的选项。

Consul - 在 AWS 上使用 Consul

在本章中,我们将学习如何在AWS(Amazon Web Services)上使用Consul。

AWS 的特点

在 AWS 中使用 Consul 时有用的一些功能是:

  • 易于维护集群状态。
  • 可扩展性和高可用性。
  • 用于管理跨多个数据中心的集群的出色用户界面。
  • 易于使用的命令行选项。

如果您正在寻找一种解决方案,我们可以使用 Docker 轻松在 AWS 上部署 Consul。查看以下链接 - https://github.com/dwmkerr/terraform-consul-cluster

AWS部署

为了使用AWS,我们可以从为其创建VPC开始。为了在 AWS 中部署 consul,我们将使用 AWS 服务提供的快速入门模板。该模板可以在https://aws.amazon.com/quickstart/architecture/consul/轻松找到。

在本章中,我们假设您已经了解 AWS 的基础知识。AWS CloudFormation 模板将创建以下组件 -

  • 跨三个可用区具有公有子网和私有子网的VPC

  • 一个Seed Consul 服务器和一个Seed 客户端以及两个 Auto Scaling 组。

  • 您可以选择创建 3、5 或 7 个服务器。客户端数量默认设置为三个,但用户可以配置。

  • Dnsmasq,作为安装的一部分为 Consul 安装和配置。

  • 使用bootstrap_expect选项的 Consul 集群。

请看下图,了解不同组件是如何互连的。

互联

使用AWS

请确保您已使用 Web 控制台登录您的 AWS 基础设施。现在,请将以下URL输入到浏览器窗口中。输入 URL 并按 Enter 键后,AWS 网站将打开。

使用AWS

对于此演示,我们将选择将其部署到新的 VPC(虚拟私有云)中。您可以随时通过以下链接检查您的 AWS VPC 管理 – https://<awsregion>.console.aws.amazon.com/vpc/home。对于首次使用的用户,默认区域是美国西俄勒冈州。因此,您可以直接访问 URL – https://us-west-2.console.aws.amazon.com/vpc/home。

专有网络管理

正如您所看到的,AWS 的 VPC 服务正在运行,并且您没有 VPC,即已经在您的 AWS 账户上运行/配置。现在,请根据您的选择单击 AWS 上的“部署到新 VPC”或“部署到现有 VPC”选项。您可以在网站上查看该选项,如以下屏幕截图所示。

专有网络服务

单击上述选项后,您可以看到它打开了另一个窗口,类似于下图所示。

创建堆栈

正如您在模板中看到的,AWS 已代表您选择了 URL。它还使您可以根据需要自由定制云形成模板。如果需要,您可以对其进行自定义,然后单击“下一步”按钮继续。

指定详细信息

正如您所看到的,您可以在此处配置各种不同的值和选项。对于某些更改,您可以根据您的选择重命名它,以替换名称 HashiCorp-Consul。请根据您的方便随意更改其他选项。

配置

正如您在上面看到的,可以根据您的选择定制多个选项。正如您在 Consul 设置部分中看到的,默认的 Consul Cluster 实例类型是t2.medium。您可以将其更改为您选择的实例。

- 将允许范围填写为 0.0.0.0/0 以允许任何 IP 地址。

默认情况下,consul 服务器的数量为 3。您可以将其更改为五个,以便在 consul 环境中测试更多服务器。在快速启动配置下,您可以看到还使用了S3 存储桶,并且默认将其命名为快速启动引用。完成更改后,单击屏幕底部的“下一步”按钮。

选项

在上面的屏幕截图中,您可以看到有一个使用标签的选项,以便更好地识别和使用。除此之外,您还可以选择 IAM 角色,以向其他人提供对您的 VPC 堆栈的访问权限。您可以根据您选择的选项进行选择。

如需更多高级选项,请选择高级选项卡,您可以在其中为您的 VPC 启用 Amazon SNS 的通知。完成详细信息后,请继续下一步选项。

审查

上面的屏幕显示您查看了所选领事堆栈的详细信息。您可以查看为 VPC 堆栈选择的选项,然后转到屏幕底部,选中创建 IAM 资源的确认框,然后单击“创建”按钮以完成堆栈的形成。

您可以在 AWS 管理控制台的 CloudFormation Stack 部分下检查输出。根据 VPC 输出,您还可以在 AWS 控制台的 VPC 部分查看它,如下面的屏幕截图所示。

云形成

如果您只是测试 Consul 模板,请确保删除您使用过的资源。您可以通过删除 CloudFormation 部分下的 CloudFormation Stack 和 VPC 仪表板上的 VPC 来轻松完成此操作。