目录

这篇文章作者:最爱喝酸奶。文章有稍微改动。很简单通俗易懂的介绍consul及集群部署,很适合新手阅读。

Consul介绍

Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。Consul 是分布式的、高可用的、可横向扩展的。

官网:https://www.consul.io,最新版本:1.8.3

概念

  • Agent

    是在 Consul 集群的每个成员上长期运行的守护进程,通过命令 consul agent 启动运行。由于所有节点都必须运行一个 Agent,因此 Agent 可以分为 client 或 Server。

    所有的 Agent 都可以运行DNS或HTTP接口,并负责运行监测和保持服务同步

  • Client

    是将所有RPC转发到 Server 的 Agent。Client 是相对无状态的,Client 唯一执行的后台活动是加入 LAN gossip 池。这只有最小的资源开销,且只消耗少量的网络带宽

  • Server

    是一个有一组扩展功能的 Agent,这些功能包括参与 Raft 选举、维护集群状态、响应RPC查询、与其他数据中心交互 WAN gossip 和转发查询给 leader 或远程的数据中心

  • Datacenter

    是一个私有的、低延迟和高带宽的网络环境。这不包括通过公网的通信,但就目的而言,单个 EC2 中的多个可用区域被视为数据中心的一部分

  • Consensus

    一致性。Consul 使用 Consensus 协议(具体由 Raft 算法实现)来提供一致性(由 CAP 定义),表明 leader 选举和事务的顺序达成一致

  • Gossip

    Consul 使用 Gossip 协议来管理成员资格并向集群广播消息。Serf 提供了完整的 Gossip 协议,可用于多种目的,而 Consul 建立在 Serf 之上。

    Gossip 涉及节点到节点的随机通信,主要是通过UDP。Gossip 协议也被称为 Epidemic 协议(流行病协议)

  • LAN Gossip

    指包含所有位于同一局域网或数据中心的节点的 LAN gossip 池

  • WAN Gossip

    指仅包含 Server 的 WAN gossip 池。这些 Server 主要分布在不同的数据中心,通常通过Internet或者广域网进行通信

  • RPC

    远程过程调用。一种 请求/响应 机制,允许 Client 向 Server 发起请求

架构图

在这里插入图片描述

可以看到有两个数据中心,每个数据中心中都有 Client 和 Server。Server的数量建议是 3 或 5 台,这能平衡故障情况下的可用性和集群性能。Server 数量越多,达成一致性也会越慢,但是 Client 的数量没有限制。

其次,数据中心中的所有 Agent 都加入 gossip 协议,这意味着存在一个给定数据中心的所有 Agent 的 gossip 池。这样做有几个目的:

    1. 不需要为 Client 配置 Server 地址,发现是自动完成的;
    1. 检测 Agent 故障的工作不是放在 Server 上、而是分布式的,这使得故障检测更具可伸缩性;
    1. 它被用作一个消息层,已通知何时发生重要事件(例如 leader 选举)

每个数据中心的 Server 都是单个 Raft 对等集的一部分,这意味着它们将共同选举出一个 leader,leader 负责处理所有查询和事务。作为 consensus 协议的一部分,事务必须复制到所有对等方。由于这一需求,当 非 leader Server 收到RPC请求时,它将转发给 leader Server。

Server 还作为 WAN gossip 池的一部分运行。WAN gossip 池与 LAN gossip 池不同,因为它针对Internet更高的延迟进行了优化,并且仅包含其他 Consul Server。WAN gossip 池的目的是允许数据中心以一种低接触的方式发现彼此,在线连接新的数据中心就像加入现有的 WAN gossip 池一样简单。由于 Server 都在 WAN gossip 池中运行,因此它还支持跨数据中心请求。Server 收到其他数据中心的请求时,会将其转发到正确的数据中心的随机 Server,然后该 Server 可以转发给本地的 leader。这就让数据中心之间的耦合非常低,由于故障检测、连接缓存和多路复用,跨数据中心的请求相对较快且可靠。

通常,不会在不同的 Consul 数据中心之间复制数据。当请求另一个数据中心的资源时,本地 Consul Server 将RPC请求转发到该资源的远程 Consul Server 并返回结果。如果远程数据中心不可用,那么这些资源也将不可用,但这不会影响本地数据中心。在某些特殊情况下,可以复制有限的数据子集,例如使用 Consul 内置的 ACL复制 功能,或使用诸如 consul-replicate 之类的外部工具。

特点

  • 多数据中心

    Consul 支持任意数量的数据中心,而不需要复杂的配置

    服务网格/服务细分:Consul Connect通过自动TLS加密和基于身份的授权来实现安全的服务间通信。

    应用程序可以在服务网格配置中使用sidecar代理来为入站和出站连接建立TLS连接,而根本不知道Connect

  • 服务发现

    Consul 使服务易于注册自己,并通过DNS或HTTP接口发现其他服务。诸如SaaS提供程序之类的外部服务也可以注册

  • 运行状态检测

    Consul 提供了健康检查的机制,与服务发现的集成可防止将流量路由到不正常的主机,并启用服务级别的断路器

  • Key/Value 存储

    灵活的kv存储可以实现动态配置、功能标记、leader选举等,简单的HTTP API使它可以在任何地方轻松使用

端口

Consul最多需要6个不同的端口才能正常工作,某些端口需要使用TCP、UDP或同时使用这两种协议。

  • DNS

    DNS server(TCP和UDP) 8600

  • HTTP

    HTTP API(仅TCP) 8500

  • HTTPS

    HTTPs API disabled(8501)*

  • gRPC

    gRPC API disabled(8502)*

  • LAN Serf

    Serf LAN 端口(TCP和UDP) 8301

  • Wan Serf

    Serf WAN 端口(TCP和UDP) 8302

  • server

    server RPC 地址(仅TCP) 8300

  • Sidecar Proxy Min

    包含的最小端口号,用于自动分配的sidecar服务注册 21000

  • Sidecar Proxy Max

    包含的最大端口号,用于自动分配的sidecar服务注册 21255

对于HTTPSgRPC,表中指定的端口为推荐值。

环境准备

机器主机说明:

CentOS 7.8 192.168.30.128 Server
CentOS 7.8 192.168.30.129 Server
CentOS 7.8 192.168.30.130 Server
CentOS 7.8 192.168.30.131 Client

全部关闭防火墙和selinux:

systemctl stop firewalld && systemctl disable firewalld

sed -i 's/=enforcing/=disabled/g' /etc/selinux/config  && setenforce 0

Consul安装运行

安装consul

Install Consul | Consul - HashiCorp Learn

mkdir /software && cd /software

wget https://releases.hashicorp.com/consul/1.8.3/consul_1.8.3_linux_amd64.zip

unzip consul_1.8.3_linux_amd64.zip

mv consul /usr/local/bin/

consul version

Consul v1.8.3
Revision a9322b9c7
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)

consul -autocomplete-install                #命令补全

然后打开新的窗口即可。

命令参数:

acl            与 Consul 的ACL进行交互
agent          运行一个 Consul agent
catalog        与 Consul 的目录进行交互
config         与 Consul 的配置进行交互
connect        与 Consul 的Connect子系统进行交互
debug          记录 Consul operators 的调试归档
event          触发一个新事件
exec           在 Consul 节点上执行命令
force-leave    强制一个集群成员进入离开状态,一般用来强制删除发生故障或已关闭且没有正常离开的节点
info           对 Consul operators 提供调试的信息
intention      与通过Connect对服务的访问控制交互
join           将 Consul agent 加入集群
keygen         生成新的加密密钥
keyring        检查和修改 gossip 池中使用的加密密钥
kv             与 k/v 存储进行交互
leave          Consul agent 正常离开集群并关闭
lock           在 k/v 存储中的给定前缀处创建一个锁
login          使用所请求的auth方法将提供的第三方凭据交换为新创建的 Consul ACL令牌
logout         销毁从 consul login 命令中创建的 Consul 令牌
maint          提供对节点或服务的维护模式的控制
members        列出 Consul 集群的所有成员
monitor        用于连接并追踪正在运行的 Consul agent 的日志
operator       为 Consul operators 提供集群级别的工具
reload         触发 agent 配置文件的重载
rtt            估计两个节点之间的网络往返时间
services       与注册的服务进行交互
snapshot       保存、还原和检查 Consul Server 状态以进行灾难恢复
tls            内置帮助创建Consul TLS的CA和证书
validate       对 Consul 的配置文件或目录执行完整性测试
version        显示 Consul 版本信息
watch          监视 Consul 特定数据视图(节点列表,服务成员,k/v等)中的更改

运行Agent

Agent 可以运行为 Server 或 Client 模式,每个数据中心至少有一个 Server。一个集群中建议有3个或5个 Server,单个 Server 在出现故障时会不可避免的造成数据丢失。

Client是一个非常轻量级的进程,用于注册服务、健康检查和转发对 Server 的查询。Agent 必须在集群中的每个节点上运行。

consul agent -dev               #开发模式

新开一个窗口

consul members              #查看集群成员

Node    Address         Status  Type    Build  Protocol  DC   Segment
master  127.0.0.1:8301  alive   server  1.8.3  2         dc1  

可以看到当前节点名称、运行的地址、健康状态以及集群角色等信息,添加-detailed可以看到额外的信息。

分别使用HTTP和DNS接口查看信息:

curl localhost:8500/v1/catalog/nodes                #HTTP API查看

[
    {
        "ID": "f134d82f-1c59-50be-8437-8feb9c1a9351",
        "Node": "master",
        "Address": "127.0.0.1",
        "Datacenter": "dc1",
        "TaggedAddresses": {
            "lan": "127.0.0.1",
            "lan_ipv4": "127.0.0.1",
            "wan": "127.0.0.1",
            "wan_ipv4": "127.0.0.1"
        },
        "Meta": {
            "consul-network-segment": ""
        },
        "CreateIndex": 10,
        "ModifyIndex": 12
    }
]

yum install -y bind-utils

dig @127.0.0.1 -p 8600 master.node.consul               #DNS接口查看

;; QUESTION SECTION:
;master.node.consul.		IN	A

;; ANSWER SECTION:
master.node.consul.	0	IN	A	127.0.0.1

停止Agent

consul leave -http-addr=127.0.0.1:8500              #正常退出

consul force-leave -http-addr=127.0.0.1:8500                #强制退出

注册服务

mkdir -p /consul/config

echo '{"service": {"name": "nginx", "tags": ["web"], "port": 80}}' | sudo tee /consul/config/nginx.json

consul agent -dev -config-dir=/consul/config

通过HTTP API和DNS接口查看,

curl http://localhost:8500/v1/catalog/service/nginx

dig @127.0.0.1 -p 8600 nginx.service.consul

Consul集群

创建 consul server

mkdir -p /consul/{config,data}

consul agent -server -bootstrap-expect=3  \
    -data-dir=/consul/data \
    -node=agent128 -bind=192.168.30.128 \
    -enable-script-checks=true -config-dir=/consul/config \
    -client 0.0.0.0 -ui &> /consul/data/consul.log &

参数:

-node:节点的名称 
-bind:绑定的一个地址,用于节点之间通信的地址,可以是内外网,必须是可以访问到的地址 
-server:表示这个节点是个Server
-bootstrap-expect:表示期望提供的Server节点数目。数目一达到,它就会被激活,然后就是leader了
-data-dir:Agent用于存储状态的数据目录,这是所有Agent所必需的
-datacenter:指明数据中心的名字,默认是"dc1"。同一数据中心中的节点应位于单个LAN上
-client:将Client接口(包括HTTP和DNS服务器)绑定到的地址
-ui:启动UI

其他两台机器也创建 consul server,与 192.168.30.128 类似。

创建consul client

mkdir -p /consul/{config,data}

consul agent -data-dir=/consul/data \
    -node=agent131 -bind=192.168.30.131 \
    -enable-script-checks=true -config-dir=/consul/config \
    -client 0.0.0.0 -ui &> /consul/data/consul.log &

加入集群

除 192.168.30.128 外的其他机器加入集群,

consul join 192.168.30.128

consul members

Node      Address              Status  Type    Build  Protocol  DC   Segment
agent128  192.168.30.128:8301  alive   server  1.8.3  2         dc1  
agent129  192.168.30.129:8301  alive   server  1.8.3  2         dc1  
agent130  192.168.30.130:8301  alive   server  1.8.3  2         dc1  
agent131  192.168.30.131:8301  alive   client  1.8.3  2         dc1  

可以看得,集群中有3个server和1个client,它们在数据中心dc1中。

访问ui

打开http://192.168.30.128:8500/ui,访问consul ui界面,

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

可以看到,之前演示注册的web服务nginx是正常状态,节点agent130是集群 leader。

配置kv

consul kv 是consul的核心功能,并随consul agent一起安装。consul kv允许用户存储索引对象,尽管其主要用途是存储配置参数和元数据。

consul kv 数据存储在server上,可以由任何agent(client或server)访问。consul允许在所有server之间自动复制数据,如果发生故障,拥有一定数量的server将减少数据丢失的风险。

数据存储位于server上的数据目录中,为确保在完全中断的情况下不会丢失数据,可以使用 consul snapshot 命令备份数据。

另外,还可以通过 consul kv 子命令、HTTP API 和 Consul UI 访问kv存储。

在这里插入图片描述

kv当前为空,即没有存储配置信息。

查询数据:

consul kv get --recurse             #查询所有数据

新建数据:

consul kv put username lzx              #创建kv对

consul kv get username

lzx

在这里插入图片描述

更新数据:

consul kv put username liu              #更新kv对

consul kv get username

liu

删除数据:

consul kv delete username               #删除kv对

consul kv get username

Error! No key exists at: username

阅读原文


本文收藏来自互联网,仅用于学习研究,著作权归原作者所有,如有侵权请联系删除

markdown @tsingchan

引用格式为收藏注解,比如本句就是注解,非作者原文。