领事 – 快速指南
领事 – 快速指南
领事 – 简介
Consul 是一个基于 Hashicorp 的工具,用于在您的基础设施中发现和配置各种不同的服务。它基于并构建在 Golang 之上。构建 Consul 的核心原因之一是维护分布式系统中存在的服务。Consul 提供的一些重要功能如下。
-
服务发现– 使用 DNS 或 HTTP,应用程序可以轻松找到它们所依赖的服务。
-
健康检查状态– 它可以提供任意数量的健康检查。服务发现组件使用它来路由流量远离不健康的主机。
-
Key/Value Store – 它可以将 Consul 的分层键/值存储用于任何目的,包括动态配置、功能标记、协调、领导者选举等。
-
多数据中心部署– Consul 支持多个数据中心。它用于构建额外的抽象层以扩展到多个区域。
-
Web UI – Consul 为其用户提供了一个漂亮的 Web 界面,使用它可以轻松使用和管理 consul 中的所有功能。
服务发现
服务发现是 Consul 最重要的功能之一。它被定义为检测不同的服务和发现服务所使用的网络协议。服务发现的使用为分布式系统带来了福音。这是当今大型行业面临的主要问题之一,随着分布式系统在其环境中的进步。
与 Etcd 和 Zookeeper 的比较
当我们查看该领域中的其他服务发现工具时,我们有两个流行的选择。软件行业的一些主要参与者过去一直在使用它。这些工具是Etcd和Zookeeper。
让我们考虑下表来比较每个工具的不同方面。我们还将了解他们每个人在内部使用的内容。
Properties | 领事 | 等 | 动物园管理员 |
---|---|---|---|
User Interface | 可用的 | ||
RPC | 可用的 | 可用的 | |
Health Check | HTTP API | HTTP API | TCP |
Key Value | 3 一致性模式 | 良好的一致性 | 强一致性 |
Token System | 可用的 | ||
Language | 高朗 | 高朗 | 爪哇 |
领事 – 会员和代理人
Consul 成员可以定义为部署 consul 集群的不同代理和服务器模式的列表。Consul 为我们提供了一个命令行功能,使用它我们可以轻松列出与 consul 关联的所有代理。
Consul 代理是 Consul 的核心进程。代理维护成员资格信息、注册服务、运行检查、响应查询等。任何代理都可以以两种模式之一运行:客户端或服务器。这两种模式可以根据使用 consul 时决定的角色来使用。领事代理通过向我们提供以下列出的信息来提供帮助。
-
节点名称– 这是机器的主机名。
-
数据中心– 代理配置为运行的数据中心。每个节点都必须配置为向其数据中心报告。
-
服务器– 它指示代理是在服务器模式还是客户端模式下运行。服务器节点参与共识仲裁,存储集群状态并处理查询。
-
Client Addr – 它是代理用于客户端接口的地址。它包括 HTTP、DNS 和 RPC 接口的端口。
-
Cluster Addr – 它是用于集群中领事代理之间通信的地址和端口集。该地址必须可由所有其他节点访问。
在下一章中,我们将了解 Consul 的架构。
领事 – 建筑
consul 在一个数据中心工作的架构图可以最好地描述如下 –
正如我们所观察到的,Consul 管理着三个不同的服务器。工作架构通过 using raft 算法工作,这有助于我们从三个不同的服务器中选出领导者。然后根据Follower和Leader等标签对这些服务器进行标记。顾名思义,追随者负责遵循领导者的决定。所有这三个服务器都进一步相互连接以进行任何通信。
每个服务器都使用 RPC 的概念与其自己的客户端进行交互。由于下面提到的八卦协议,客户端之间的通信是可能的。可以使用 TCP 或 gossip 通信方法使与 Internet 设施的通信可用。此通信与三个服务器中的任何一个直接联系。
Raft 算法
Raft 是一种用于管理复制日志的共识算法。它依赖于CAP 定理的原理,该定理指出,在存在网络分区的情况下,必须在一致性和可用性之间做出选择。并非 CAP 定理的所有三个基本原理都可以在任何给定时间点实现。一个人必须在最好的情况下权衡其中的任何两个。
一个Raft Cluster包含多个服务器,通常是奇数。例如,如果我们有五台服务器,它将允许系统容忍两次故障。在任何给定时间,每个服务器都处于以下三种状态之一:Leader、Follower或Candidate。在正常操作中,只有一个领导者,所有其他服务器都是追随者。这些追随者处于被动状态,即他们自己不发出任何请求,而只是响应领导者和候选人的请求。
下图描述了 raft 算法使用的工作流模型 –
键值数据
从 Consul 的 0.7.1 版本开始,引入了单独的键值数据。KV 命令用于通过命令行与 Consul 的键值存储进行交互。它公开了用于从存储中插入、更新、读取和删除的顶级命令。为了获取 Key/Value 对象存储,我们调用了 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 – 在键/值条目上获取新锁时创建的索引号
-
Flags – 应用程序可以使用它来设置自定义值。
-
Value – 它是一个最大 512kb 的字节数组。
-
会话– 可以在创建会话对象后设置。
协议类型
Consul 中有两种类型的协议,称为 –
- 共识协议和
- 八卦协议
现在让我们详细了解它们。
共识协议
Consul 使用共识协议来提供 CAP 定理所描述的一致性。该协议基于 Raft 算法。在实现共识协议时,使用 Raft 算法,其中 raft 节点始终处于以下三种状态中的任何一种:跟随者、候选者或领导者。
八卦协议
gossip 协议可用于管理成员资格、跨集群发送和接收消息。在 consul 中,gossip 协议的使用有两种方式,WAN(无线局域网)和LAN(局域网)。有三个已知的库,它们可以实现 Gossip 算法来发现对等网络中的节点 –
-
teknek-gossip – 它与 UDP 一起使用并用 Java 编写。
-
gossip-python – 它利用 TCP 堆栈,也可以通过构建的网络共享数据。
-
Smudge – 它是用 Go 编写的,并使用 UDP 来交换状态信息。
Gossip 协议还被用于实现和维护分布式数据库一致性或与其他类型的数据保持一致状态,计算未知大小网络中的节点数量,稳健地传播新闻,组织节点等。
远程过程调用
RPC 可以表示为远程过程调用的缩写形式。它是一个程序用来从另一个程序请求服务的协议。此协议可以位于网络上的另一台计算机中,而无需确认网络详细信息。
在 Consul 中使用 RPC 的真正美妙之处在于,它帮助我们避免了大多数发现服务工具前一段时间确实存在的延迟问题。在 RPC 之前,Consul 过去只有基于TCP和UDP的连接,这对大多数系统都很好,但不适用于分布式系统。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 – 验证配置文件。
-
事件– 启动一个新事件。
-
exec – 在 Consul 节点上执行命令。
-
force-leave – 强制集群成员离开集群。
-
info – 它为我们提供了操作员的调试信息。
-
join – 使 Consul 代理加入集群。
-
keygen – 生成新的加密密钥。
-
keyring – 管理八卦层加密密钥。
-
kv – 与键值存储交互。
-
leave – 离开 Consul 集群并强制关闭它。
-
lock – 执行一个命令来按住一个锁。
-
MAINT -到控制节点或服务维护模式。
-
成员– 它列出了 Consul 集群的成员。
-
monitor – 它从 Consul 代理流式传输日志。
-
operator – 它为我们提供了一组用于 Consul 操作员的工具。
-
reload – 它触发代理重新加载配置文件。
-
rtt – 它估计节点之间的网络往返时间。
-
快照– 它保存、恢复和检查 Consul 服务器状态的快照。
-
version – 打印当前的 Consul 版本。
-
watch – 注意领事的变化。
领事模板
consul-template 为我们提供了一个守护进程,它查询 Consul 实例并更新文件系统上任意数量的指定模板。当更新过程完成时,consul-template 可以选择运行任意命令。此选项可帮助我们设置 consul 集群,而无需我们自己手动完成所有操作。
consul 模板将在/tmp/<name-of-file>.conf.tmpfl 处形成。根据Hashicorp 配置语言(HCL)编写模板的语言。
你可以从这个页面下载 consul-template 。
使用以下命令尝试一下 –
$ ./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
输出将如以下屏幕截图所示。
配置文件可能看起来像 –
{{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 集线器拉下图像 –
$ docker pull progrium/consul
输出将如以下屏幕截图所示。
我们将通过以下方式发布一些带有端口的接口(在 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
输出将如以下屏幕截图所示。
您还可以使用以下方法为 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 个 peer 连接,然后才能自引导并成为工作集群。
在继续之前,我们需要通过检查容器来获取容器的内部 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
在 Node3 上
$ docker run -d --name node3 -h node3 progrium/consul -server -join $JOIN_IP
用于服务发现的构建注册器
Registrator 通过在容器上线时检查容器,自动为任何 Docker 容器注册和注销服务。我们即将使用的 Registrator 目前支持可插拔服务注册,目前包括Consul、Etcd和SkyDNS2。当我们通过网络与不同的服务交互时,强烈建议使用 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 的主要原因是为了提高安全性,这是 Docker 在 2013-14 年仍处于开发阶段时面临的危机问题之一。
至于 Consul,我们可以使用 Rkt Registrator 与 Consul 一起进行服务发现。rkt 涵盖的这个特定的 Registrator 项目正在开发中,不推荐用于生产级使用。
您可以通过转到其路径并运行以下命令来检查 rkt 是否已安装。
$ ./rkt
您可以检查输出以检查它是否正确安装,如下面的屏幕截图所示。
要试用 rkt 和 Consul,请查看 – https://github.com/r3boot/rkt-registrator。
游牧工具
其中最常用和最喜欢的选项是游牧的工具。Nomad 是一种用于管理机器集群并在其上运行应用程序的工具。它类似于Mesos或Kubernetes。默认情况下,Nomad 自身包含 Docker 和 rkt 驱动程序。因此,如果您正在寻找使用 Consul 进行容器的大规模部署。Nomad 可能是一个很好的解决方案。查看 – https://www.nomadproject.io/docs/drivers/rkt.html了解更多关于 Nomad 的信息。
领事 – 引导和 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、dnsmasq和iptables来完成。默认情况下,Consul 代理运行一个 DNS 服务器,侦听端口 8600。通过向 Consul 代理的 DNS 服务器提交 DNS 请求,您可以获得运行您感兴趣的服务的节点的 IP 地址。
Consul DNS 接口通过SRV 记录提供服务的端口信息。无需在代码中手动添加逻辑,您通常仅限于所查询服务的 IP 地址信息(即记录)。
最好的选择是有多个 BIND 服务器,每个服务器都在本地运行 Consul 代理。BIND 服务器收到的任何查询都将转发到其本地 Consul 代理 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 值,它可以设置为允许 DNS 结果与 Consul 的下游一起缓存。较高的 TTL 值会减少 Consul 服务器上的查找次数并加快客户端的查找速度,但代价是结果越来越陈旧。
为此,我们将使用以下方法使用 DNS 缓存 –
$ sudo apt-get install dnsmasq
输出将如以下屏幕截图所示。
现在,我们可以做一个非常简单的配置 –
$ echo "server = /consul/127.0.0.1#8600" > /etc/dnsmasq.d/10-consul
我们在这里所做的只是指定领事服务的 DNS 请求,这些请求将由端口 8600 上 127.0.0.1 的 DNS 服务器处理。除非您更改领事默认值,否则这应该可以工作。
在正常情况下,应该使用以下命令。
$ 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 代理的日志。此命令将显示最近的日志。它还允许您以相对较高的日志级别记录代理。它由各种日志级别组成,您可以遵循这些级别,例如 – Trace、Debug、Info、Warn 和 Err。
让我们尝试以下命令 –
$ 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 位于www.amazon.com 的80 端口。让我们检查 consul 上的输出以确保我们已正确安装此服务。为此,请在 localhost:8500 打开浏览器窗口。
要删除该服务,我们可以简单地使用以下命令。
$ curl -X PUT -d '{"Datacenter": "dc1", "Node": "amazon"}' http://127.0.0.1:8500/v1/catalog/deregister
让我们检查它的 UI,如下面的屏幕截图所示。
领事 – 故障转移事件
在本章中,我们将了解 Consul 中的故障转移事件。这将在以下功能的帮助下完成 –
- 单集群故障
- 杰普森测试
- 多集群故障
- 拍摄快照
让我们详细了解其中的每一个。
单集群故障
在单个集群故障中,放置在其中一个数据中心的集群开始出现故障。在每种情况下,重要的是要确保在发生故障转移时,系统不仅可以防止它,而且还有一个可以依赖的备份。为了防止 Consul Failover 事件,我们将使用称为 Consul-alerts 的东西。主要项目可以在 – https://github.com/AcalphStorage/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、数据中心选项、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 代理。
- 使用 Consul-alerts 链接到远程 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使用标志 -data-dir 和客户端作为 0.0.0.0提及使用的端口来引导客户端。
在新的终端窗口中,让我们启动 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。watch 会检查 consul 代理是否已启用以及 consul 检查。
我们可以清楚地看到,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
杰普森测试
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 clone – https://github.com/hashicorp/consul-replicate.git
输出将如以下屏幕截图所示。
$ cd consul-replicate $ make
输出将如以下屏幕截图所示。
如果您在构建二进制文件时遇到一些问题,您也可以尝试使用以下命令手动拉取 Docker 镜像 –
$ docker pull library/golang:1.7.4
上述命令将创建 bin/consul-replicate,它可以作为二进制调用。下表显示了它涵盖的子命令的完整列表 –
Option | 描述 |
---|---|
auth | 基本身份验证用户名(和可选密码),以冒号分隔。没有默认值。 |
consul* | 要查询的 consul 实例的位置(可能是 IP 地址或 FQDN)和端口。 |
max-stale | 查询的最大陈旧度。如果指定,Consule 将在所有服务器之间分配工作,而不仅仅是领导者。默认值为 0(无)。 |
ssl | 与 Consul 交谈时使用 HTTPS。需要将领事服务器配置为服务器安全连接。默认值为假。 |
ssl-verify | 通过 SSL 连接时验证证书。这需要使用-ssl。默认值是true。 |
syslog | 将日志输出发送到 syslog(除了 stdout 和 stderr)。默认值为 false |
syslog-facility | 发送到系统日志时使用的工具。这需要使用 -syslog。默认为本地 |
token | 领事 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 服务器状态的原子时间点快照,其中包括键/值条目、服务目录、准备查询、会话和 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
输出将如以下屏幕截图所示。
领事快照恢复
snapshot restore 命令用于恢复 Consul 服务器状态的时间点快照,其中包括键/值条目、服务目录、准备好的查询、会话和 ACL。从保存的备份文件中读取快照。
注意– 请记住,以下命令只能在保存快照的目录中运行。
$ consul snapshot restore <name-of-the-file>.snap
输出将如以下屏幕截图所示。
如果您正在使用 AWS 开发 Consul,这个项目可能会帮助您节省一些时间 – https://github.com/pshima/consul-snapshot。
领事 – 使用 UI
在本章中,我们将学习如何使用 Consul UI(用户界面)并了解其重要组件。
领事 UI 设置
Consul 为我们提供了一个有用的界面,使用它我们可以轻松地管理事物。您可以轻松地在您想要的任何端口上调出 consul 用户界面。Consul UI 可以分为三个重要部分,它们是 –
-
ACL – 一组规则,可轻松锁定您的集群
-
数据中心– 使您能够轻松管理数据中心并与您的集群一起工作。
-
节点– 快速更新 Consul 集群正在使用的节点
使用领事 UI
为了使用 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 的一些功能来开始浏览它,例如 –
- 节点
- 访问控制列表
- 核心价值
- 设置
- 数据中心
- 服务
让我们详细了解其中的每一个。
节点
可以观察 UI 仪表板上节点的基本用法,如下面的屏幕截图所示。
在我们的例子中,当你点击像 node1 这样的特定节点时,我们可以看到节点上的信息可以很容易地被视为 –
您可以随时从 Consul 注销节点。从高级领事集群的角度来看,它可以轻松管理节点。
ACL(访问控制列表)
Consul 的最佳功能之一是访问控制列表。您可以为不同数据中心的不同集群编写不同的权限。打开 ACL 的最简单方法之一是在 Consul 的数据目录中添加一个新的 json 文件。要启用和更新 ACL,您可以在设置字段中添加主 ACL 令牌,并使用 ACL 选项卡刷新它
欲了解更多信息,请查看这里
核心价值
Consul 的 Key Value 选项默认出现在 Consul UI 中。您可以使用 Consul UI 创建自己的密钥。它还提供了一个选项来创建一个文件夹来存储您的密钥。
设置
您可以检查屏幕右上角的 Consul UI 的设置选项。单击该选项后,您可以轻松看到 Consul 为您提供了一个选项,您可以使用该选项配置其本地存储设置和令牌系统以进行验证。
数据中心
数据中心选项可以通过选择轻松更改和切换。Consul UI 会自动更新对 Consul 正在处理的数据中心数量的检测。
服务
Consul UI 还为您提供了一个服务选项卡,用于配置和查看当前使用 Consul 部署的服务。它为我们提供了根据节点配置服务的选项。
领事 – 在 AWS 上使用领事
在本章中,我们将学习如何在 AWS(亚马逊网络服务)上使用 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 个服务器。默认情况下,客户端的数量设置为 3,但它是用户可配置的。
-
Dnsmasq,作为安装的一部分为 Consul 安装和配置。
-
使用bootstrap_expect选项的Consul 集群。
查看下图以了解不同组件是如何互连的。
使用 AWS
请确保您已经使用 Web 控制台登录到您的 AWS 基础设施。现在,请将以下URL放入浏览器窗口。输入 URL 并按 Enter 键后,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 Setup 部分看到的,默认的 Consul Cluster 实例类型是t2.medium。您可以将其更改为您选择的实例。
注意– 将允许范围填充为 0.0.0.0/0 以允许任何 IP 地址。
默认情况下,consul 服务器的数量为 3。您可以将其更改为 5,以便在 consul 环境中测试更多服务器。在快速启动配置下,您可以看到默认情况下还使用了一个S3 存储桶并将其命名为快速启动参考。完成更改后,单击屏幕底部的下一步按钮。
在上面的截图中,您可以看到有一个选项可以使用标签,以便更好地识别和使用。除此之外,您还可以选择 IAM 角色,以便为其他人提供对您的 VPC 堆栈的访问。您可以根据您选择的选项进行选择。
如需更多高级选项,请选择高级选项卡,您可以在其中为您的 VPC 启用 Amazon SNS 以接收通知。完成详细信息后,请继续下一步选项。
上面的屏幕显示您查看了您选择的 consul 堆栈的详细信息。您可以查看 VPC 堆栈的选定选项并继续到屏幕底部,选中确认创建 IAM 资源的框,然后继续单击创建按钮以完成堆栈的形成。
您可以在 AWS 管理控制台的 CloudFormation Stack 部分下检查输出。根据 VPC 输出,您还可以在 AWS 控制台的 VPC 部分进行检查,如下面的屏幕截图所示。
如果您只是测试 Consul 模板,请确保删除您使用过的资源。您可以通过删除 CloudFormation 部分下的 CloudFormation Stack 和 VPC 仪表板上的 VPC 来轻松完成此操作。