Consul集群¶
我们成功运行一个 代理 ( agent ),在其上注册了 服务 ( service ),并发起查询。 此外,我们也配置了 Consul 互连 ( Connect ),实现服务间 连接加密 和 权限控制 。 为了尽量简洁地演示 Consul 的使用方法,我们没有讨论 可扩展 的 生产级架构 , 但这是构建服务管理基础设施的关键。 现在,我们要搭建一个真实的 集群 ,由多个成员节点组成。
Consul 代理 启动后,刚开始对其他节点一无所知。 换句话讲,它是一个孤立的单节点集群。 代理 需要加入一个现有的集群,以便发现其他集群成员。 只要知道集群中任一成员,即可加入该集群。 加入之后, 代理 将与该成员通讯,发现其他集群成员。 代理 可以加入其他任何 代理 ,不仅仅是 服务器 模式的那些。
启动代理¶
为了模拟更真实的集群环境,我们借助 Vagrant 工具创建两个 节点 ( node )。 Vagrantfile 可以在 这里 找到。
先启动实验所需的两个节点:
$ ls
Vagrantfile
$ vagrant up
一旦系统就绪,我们便可 ssh 登录上去,开始配置 Consul 集群。 先登录第一个节点:
$ vagrant ssh n1
前面,我们使用了 -dev
参数,以便快速启动服务,方便开发调试。
然而,这在集群环境中是不适合的。
之后,我们将抛弃 -dev
参数,并用其他集群参数来替换。
集群内每个节点名字必须唯一。
默认, Consul 使用 机器名 作为节点名,但我们将通过 -node
参数显示指定。
另外,我们通过 -bind
参数指定 绑定地址 ( bind address ),
这是 Consul 的 监听地址 ,必须能被其他节点访问到。
严格上讲, 绑定地址 不是必要的,但提供一下会更好。
默认, Consul 会监听所有 IPv4 接口,但可能会提示因 私有地址不唯一 而启动失败。
由于生产服务器一般是 多网卡 的,指定 绑定地址 可避免 Consul 错误监听其他网卡。
第一个节点作为集群唯一一个 服务器模式 节点,需要指定 -server
参数。
-bootstrap-expect
参数指定集群 节点数 ,
可让 日志复制 ( replicated log )推迟到所有节点均成功加入之后才开始。
这个文档 有更详细的介绍。
还有,我们将 -enable-script-checks
设置为 true
以便可以执行外部脚本进行 健康检查 。
这个功能我们会在 下节 中用到。
最后, -config-dir
参数指定服务以及健康检查 配置 所在的目录。
将以上命令行参数合在一起,便得到以下 consul agent
命令:
vagrant@n1:~$ consul agent -server -bootstrap-expect=1 \
-data-dir=/tmp/consul -node=agent-one -bind=172.20.20.10 \
-enable-script-checks=true -config-dir=/etc/consul.d
接着,新开一个终端,登上另一个节点:
$ vagrant ssh n2
这次,我们通过 -bind
参数绑定第二个节点的地址,并通过 -node
参数指定节点名为 agent-two
。
由于第二个节点不以 服务器 模式运行,我们去掉了 -server
参数。
组合起来,便形成以下 consul agent
命令:
vagrant@n2:~$ consul agent -data-dir=/tmp/consul -node=agent-two \
-bind=172.20.20.11 -enable-script-checks=true \
-config-dir=/etc/consul.d
至此,我们成功运行了两个 Consul 节点:一个是 服务器 模式,一个是 客户端 模式。
然而,两个 代理 均不知对方的存在,都以为自己处于单节点集群。
运行 consul members
便可确认这一点,你会发现集群成员只有一个。
加入集群¶
现在,通知第一个 代理 加入第二个,先登录 n1
节点:
$ vagrant ssh n1
可以看到,目前集群还只有一个成员:
vagrant@n1:~$ consul members
Node Address Status Type Build Protocol DC Segment
agent-one 172.20.20.10:8301 alive server 1.4.1 2 dc1 <all>
执行以下命令,让当前代理加入第二个代理, IP 为 172.20.20.11
:
vagrant@n1:~$ consul join 172.20.20.11
Successfully joined cluster by contacting 1 nodes.
这时,两个代理都会输出一些日志,从中可以看到加入集群的信息。 再次查看集群成员,可以看到两个 代理 都知道对方的存在了:
vagrant@n1:~$ consul members
Node Address Status Type Build Protocol DC Segment
agent-one 172.20.20.10:8301 alive server 1.4.1 2 dc1 <all>
agent-two 172.20.20.11:8301 alive client 1.4.1 2 dc1 <default>
注解
代理 新加入 Consul 集群,只需知道其中某个节点的地址即可。 成功加入后, 代理 间可借助通讯获得完整的成员信息。
自动加入集群¶
理想状态下,新节点启动后应该 自动加入 Consul 集群 ,无需人工干预。
借助 AWS 、 谷歌云 或 Azure 的 实例发现 功能,
Consul 只需配置一个指定的 键值对 ( key/value )便能实现 自动组群 ( auto-join )。
这个方案无需任何 硬编码 ( hardcode )配置,即可让新节点自动加入已有集群。
另外,指定 -join
命令行参数, 硬编码 其他节点地址,也是可行的。
查询节点¶
与查询服务类似, Consul 也提供 API 用于查询节点自身, HTTP 与 DNS 均可。
DNS 接口,名字结构为 NAME.node.consul
或者 NAME.node.DATACENTER.consul
。
如果 数据中心 ( datacenter )部分省略, Consul 则搜索本地数据中心。
例如,我们可以在节点一( agent-one
)上查询节点二( agent-two
)的地址:
vagrant@n1:~$ dig @127.0.0.1 -p 8600 agent-two.node.consul
;; QUESTION SECTION:
;agent-two.node.consul. IN A
;; ANSWER SECTION:
agent-two.node.consul. 0 IN A 172.20.20.11
除了服务查询,具备节点查询能力对 系统管理 ( system administration )任务意义非凡。 例如,需要通过 SSH 登录某节点时,通过接口便可查到地址信息。