Consul 快速指南



Consul - 简介

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

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

  • 健康检查状态 − 它可以提供任意数量的健康检查。服务发现组件使用它来将流量从不健康的宿主机路由出去。

  • 键值存储 − 它可以将 Consul 的分层键值存储用于任意数量的目的,包括动态配置、特性标志、协调、领导者选举等。

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

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

服务发现

服务发现是 Consul 最重要的功能之一。它被定义为使用服务发现的各种服务和网络协议来查找服务。服务发现的使用对分布式系统来说是一个福音。这是当今大型行业在环境中采用分布式系统发展过程中面临的主要问题之一。

与 Etcd 和 Zookeeper 的比较

当我们查看该领域的其他服务发现工具时,我们有两个流行的选项。过去,一些软件行业的巨头一直在使用它。这些工具是EtcdZookeeper

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

属性 Consul Etcd Zoo Keeper
用户界面 可用
RPC 可用 可用
健康检查 HTTP API HTTP API TCP
键值 3种一致性模式 良好的一致性 强一致性
令牌系统 可用
语言 Golang Golang Java

Consul - 成员和代理

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

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

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

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

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

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

  • 集群地址 − 集群中 Consul 代理之间通信使用的地址和端口集。所有其他节点都必须能够访问此地址。

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

Consul - 架构

在一个数据中心中运行的 Consul 工作的架构图最好描述如下:

Architecture

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

每个服务器使用 RPC 的概念与其自己的客户端交互。客户端之间的通信是由于如下所述的八卦协议。可以使用 TCP 或八卦通信方法提供与互联网设施的通信。这种通信直接与三个服务器中的任何一个联系。

Raft 算法

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

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

下图描述了 Raft 算法的工作流程模型:

Raft Algorithm

键值数据

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

kv := consul.KV()

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

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

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

  • − 它是一个斜杠 URL 名称。例如 – sites/1/domain。

  • CreateIndex − 首次创建键时分配的索引号。

  • ModifyIndex − 最后更新键时分配的索引号。

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

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

  • − 它是一个最大为 512kb 的字节数组。

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

协议类型

Consul 中有两种类型的协议,分别称为:

  • 共识协议和
  • 八卦协议

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

共识协议

Consul 使用共识协议来提供 CAP 定理中描述的一致性。此协议基于 Raft 算法。在实现共识协议时,使用 Raft 算法,其中 Raft 节点始终处于三种状态之一:跟随者、候选者或领导者。

八卦协议

八卦协议可用于管理成员身份,在集群之间发送和接收消息。在 Consul 中,八卦协议的使用有两种方式,WAN(无线局域网)和LAN(局域网)。有三个已知的库可以实现八卦算法来发现对等网络中的节点:

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

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

  • Smudge − 它用 Go 编写,并使用 UDP 交换状态信息。

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

远程过程调用

RPC 可以表示为远程过程调用的缩写。这是一种程序用于请求另一程序服务的协议。此协议可以位于网络上的另一台计算机上,而无需确认网络详细信息。

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

Consul - 安装

为了演示目的,我们将使用开发模式下的 consul 代理 -dev 模式。仅对于本地机器设置,我们将进行单系统 Consul 设置。请不要在生产环境中使用此单节点 Consul 集群。正如 HashiCorp 在单节点 Consul 集群的案例中已经提到的那样,数据丢失是不可避免的

安装 Consul

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

Installing Consul

您可以将二进制包解压到机器的下载部分。

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

现在让我们使用-dev标志启动 Consul。

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

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

Dev Flag

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

$ consul members

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

Memebers

如果您想将其他节点加入此节点:

$ 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 − 与键值存储交互。

  • leave − 离开 Consul 集群并将其关闭,无需强制。

  • lock − 执行命令以保持锁。

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

  • members − 它列出 Consul 集群的成员。

  • monitor − 它从 Consul 代理流式传输日志。

  • operator − 它为 Consul 运营商提供了一组工具。

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

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

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

  • version − 打印当前 Consul 版本。

  • watch − 监视 Consul 中的变化。

Consul 模板

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

consul 模板将生成在 **`/tmp/<文件名>.conf.tmpfl`** 。模板使用的语言为 **HashiCorp 配置语言 (HCL)**。

您可以从此 页面 下载 consul-template。

Template

尝试使用以下命令:

$ ./consul-template -h

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

Template Output

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

$ 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 template 二进制文件,请运行以下命令:

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

通过之前的命令,进程已启动。稍后您可以打开另一个终端并查看使用以下命令完全渲染的 nginx.conf 文件。

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

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

Output

Consul - 与微服务的协同工作

在本章中,我们将了解微服务如何与 Consul 协同工作。我们还将学习以下组件如何影响 Consul。

  • 使用 Docker
  • 构建 Registrator 用于服务发现
  • 使用 rkt 和 Nomad

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

使用 Docker

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

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

假设您的系统已安装并正确配置了 Docker。让我们尝试从 Docker Hub 下载镜像,运行以下命令:

$ docker pull progrium/consul

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

Pull Progrium

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

  • 8400 (RPC)
  • 8500 (HTTP)
  • 8600 (DNS)

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

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

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

Pull Made

您还可以使用以下命令启用 Consul 的 UI 模式:

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

您可以在 **https://127.0.0.1:8500** 上查看基于 UI 的输出。以下屏幕截图让您更好地了解基于 UI 的输出。

UI based

为了在不同节点上的多个 Docker 容器上使用 consul,我们可以在不同节点上运行以下命令:

在 Node1 上

$ 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)"

在 Node2 上

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

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

在 Node3 上

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

构建 Registrator 用于服务发现

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

$ docker pull gliderlabs/registrator:latest

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

gliderlabs

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

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

gliderlabs

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

$ docker ps -a

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

docker ps

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

$ docker logs registrator

使用 rkt 和 Nomad

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

对于 Consul,我们可以使用 Rkt Registrator 来处理 Consul 的服务发现。这个针对 rkt 的 Registrator 项目正在开发中,**不建议用于生产环境**。

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

$ ./rkt

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

Rkt Registrator

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

Nomad 工具

最常用和最受欢迎的选项之一是 Nomad 工具。Nomad 是一种用于管理机器集群并在其上运行应用程序的工具。它类似于 **Mesos** 或 **Kubernetes**。默认情况下,Nomad 在自身内部包含 Docker 和 rkt 驱动程序。因此,如果您正在寻找使用 Consul 进行大规模部署容器的方法,Nomad 可能是一个不错的解决方案。查看 https://www.nomadproject.io/docs/drivers/rkt.html 以获取有关 Nomad 的更多信息。

Consul - 引导和DNS

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

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

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

自动引导

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

$ sudo consul info

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

Automatic Bootstrapping

此命令将显示 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>
  • 在一个节点上运行命令:

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

使用 DNS 转发

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

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

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

使用 Bind

我们可以使用 Bind 函数进行 DNS 转发。可以使用以下命令完成:

$ sudo apt-get install bind9 bind9utils bind9-doc

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

Bind function

让我们使用以下命令编辑 /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 command

您可以使用以下 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 使用“0 TTL”(生存时间)值提供所有 DNS 结果。这可以防止任何缓存。但是,由于 TTL 值,可以将其设置为允许 DNS 结果在 Consul 的下游进行缓存。较高的 TTL 值减少了对 Consul 服务器的查找次数并加快了客户端的查找速度,但代价是结果越来越陈旧。

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

$ sudo apt-get install dnsmasq

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

dnsmasq

现在,我们可以进行一个非常简单的配置:

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

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

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

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

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

$ dig web.service.consul

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

web.service

Consul - 查询节点

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

  • 使用 dig
  • 使用 Monitor 命令
  • 使用 Watch 命令
  • 通过注册外部服务

让我们详细了解这些函数。

使用 Dig

Consul 在 consul 的 127.0.0.1:8600 上监听 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

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

dig

使用 Monitor 命令

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

让我们尝试以下命令:

$ consul monitor

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

Monitor Command

您还可以使用子命令(例如 -log-level 和 -rpc-address)设置 monitor 命令。默认情况下,RPC 地址为 127.0.0.1:8400。更多信息,请点击 此处

使用 Watch 命令

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

Watch Command

让我们使用 **-type = service** 尝试一个演示,如下面的命令所示。

$ consul watch -type = service -service = consul

Watch Type

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

通过注册外部服务

注册后,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

Registering External Services

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

Registering External Services

要删除服务,我们可以简单地使用以下命令。

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

Remove Service

让我们检查一下 UI,如下图所示。

Remove Service

Consul - 故障转移事件

本章,我们将学习 Consul 中的故障转移事件。这将借助以下功能实现:

  • 单集群故障
  • Jepsen 测试
  • 多集群故障
  • 拍摄快照

让我们详细了解一下这些内容。

单集群故障

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

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

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

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

最后一个命令可以轻松地用于覆盖 consul-alert 的默认端口、数据中心选项、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

Consul-Alerts

在 Docker 方法中,我们可以考虑以下三个选项:

  • 使用容器本身内置的 Consul 代理。
  • 使用在另一个 Docker 容器中运行的 Consul 代理。
  • 使用 Consul-alerts 连接到远程 Consul 实例。

现在让我们详细讨论一下这些内容。

使用容器本身内置的 Consul 代理

让我们使用以下命令启动 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 的 **entrypoint**。同时,我们通过使用 **-p 标志、数据目录 /data** (使用标志 -data-dir)和客户端 0.0.0.0 来引导客户端。

Entrypoint

在新终端窗口中,让我们启动 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 检查。

Alerts Option

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

使用在另一个 Docker 容器中运行的 Consul 代理

在这里,您可以使用任何类型的 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-alerts 连接到远程 Consul 实例

在这里,我们应该使用以下命令来使用 Consul-alerts 连接到远程 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

Jepsen 测试

Jepsen 是一个用于测试任何系统中的部分容错和网络的工具。它通过对系统进行一些随机操作来测试系统。**Jepsen 使用 Clojure 编写**。不幸的是,对于演示,Jepsen 测试需要大量的集群形成和数据库系统,因此不在本文讨论范围内。

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

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

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

多集群故障

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

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

  • Golang
  • Docker
  • Consul
  • Git

让我们从以下命令开始:

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

**$ git clone** - https://github.com/hashicorp/consul-replicate.git

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

Git Clone

$ cd consul-replicate
$ make

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

Replicate

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

$ docker pull library/golang:1.7.4

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

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

拍摄快照

快照对于在备份情况下管理 Consul 集群至关重要。默认情况下,Consul 为我们提供了一种保存 Consul 集群快照的方法。Consul 为我们提供了四个单独的子命令,我们可以使用它们来创建快照,它们是:

  • Consul snapshot save
  • Consul snapshot agent
  • Consul snapshot inspect
  • Consul snapshot restore

让我们详细了解一下这些内容。

Consul Snapshot Save

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

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

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

Snapshot Save

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

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

Consul Snapshot Agent

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

Snapshot Agent

Consul Snapshot Inspect

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

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

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

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

Snapshot Inspect

Consul Snapshot Restore

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

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

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

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

Snapshot Restore

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

Consul - 使用UI

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

Consul UI 设置

Consul 提供了一个方便易用的界面,让我们可以轻松管理各种事物。您可以轻松地在任何您想要的端口启动 Consul 用户界面。Consul UI 可以分为三个主要部分:

  • ACL(访问控制列表) – 一套规则,可以轻松锁定您的集群。

  • 数据中心 – 使您可以轻松管理数据中心并处理您的集群。

  • 节点 – 快速了解 Consul 集群正在使用的节点。

使用 Consul UI

为了使用 Consul UI,我们必须安装 HashiCorp 团队在 Consul 项目站点上提供的 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

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

Agent

默认情况下,您将在https://127.0.0.1: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

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

progrium/consul

Consul UI 的功能

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

  • 节点
  • ACL
  • 键值对
  • 设置
  • 数据中心
  • 服务

让我们详细了解一下这些内容。

节点

可以在下面的屏幕截图中看到 UI 仪表板上节点的基本用法。

UI Dashboard

当您点击某个特定节点(在本例中为 node1)时,我们可以看到节点信息很容易查看,例如:

node1

您可以随时从 Consul 注销节点。这使得从高级 Consul 集群的角度轻松管理节点。

ACL(访问控制列表)

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

更多信息,请查看此处

ACL Tab

键值对

Consul UI 默认情况下提供 Consul 的键值对选项。您可以使用 Consul UI 创建您自己的键。它还提供创建文件夹来存储密钥的选项。

Key/Value

设置

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

Settings

数据中心

数据中心选项可以根据您的选择轻松更改和切换。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

  • 一个种子 Consul 服务器和一个种子客户端,以及两个自动扩展组。

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

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

  • 使用bootstrap_expect选项的 Consul 集群。

查看下图以了解不同组件如何互连。

Interconnected

使用 AWS

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

Using the AWS

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

VPC Management

您可以看到 AWS 的 VPC 服务正在运行,并且您的 AWS 帐户中没有正在运行/配置的 VPC。现在,请根据您的选择点击 AWS 上的“部署到新 VPC”选项或“部署到现有 VPC”选项。您可以在网站上看到该选项,如下图所示。

VPC service

点击上述选项后,您可以看到它会打开另一个窗口,类似于如下所示的窗口。

Create Stack

如您所见,URL 已由 AWS 为您选择。它还使您可以自由地自定义 CloudFormation 模板。您可以根据需要自定义它,然后点击“下一步”按钮继续。

Specify Details

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

Configure

如上所示,可以根据您的选择自定义多个选项。如您在 Consul 设置部分中所见,默认的 Consul 集群实例类型为t2.medium。您可以根据您的选择更改它。

注意 – 将允许的范围填写为 0.0.0.0/0 以允许任何 IP 地址。

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

Options

在上图中,您可以看到可以使用标签来更好地识别和使用。除此之外,您还可以选择 IAM 角色,以允许其他人访问您的 VPC 堆栈。您可以根据您的选择进行选择。

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

Review

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

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

CloudFormation

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

广告