Consul手册
简介
Consul包含多个组件,但是作为一个整体,为你的基础设施提供服务发现和服务配置的工具.他提供以下关键特性:
1、服务发现Consul的客户端可用提供一个服务,比如api或者mysql,另外一些客户端可用使用Consul去发现一个指定服务的提供者.通过DNS或者HTTP应用程序可用很容易的找到他所依赖的服务.
2、健康检查Consul客户端可用提供任意数量的健康检查,指定一个服务(比如:webserver是否返回了200OK状态码)或者使用本地节点(比如:内存使用是否大于90%).这个信息可由operator用来监视集群的健康.被服务发现组件用来避免将流量发送到不健康的主机
3、Key/Value存储应用程序可用根据自己的需要使用Consul的层级的
4、Key/Value存储.比如动态配置,功能标记,协调,领袖选举等等,简单的HTTPAPI让他更易于使用
5、多数据中心:Consul支持开箱即用的多数据中心.这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域
Consul面向DevOps和应用开发者友好.是他适合现代的弹性的基础设施.
基础架构
Consul是一个分布式高可用的系统.包含一些基础
每个提供服务给Consul的节点都运行了一个Consulagent.发现服务或者设置和获取key/value存储的数据不是必须运行agent.这个agent是负责对节点自身和节点上的服务进行健康检查的
Agent与一个和多个ConsulServer进行交互.ConsulServer用于存放和复制数据.server自行选举一个领袖.虽然Consul可以运行在一台server,但是建议使用3到5台来避免失败情况下数据的丢失.每个数据中心建议配置一个server集群.
基础设施中需要发现其他服务的组件可以查询任何一个Consul的server或者agent.Agent会自动转发请求到server.
每个数据中运行了一个Consulserver集群.当一个跨数据中心的服务发现和配置请求创建时.本地ConsulServer转发请求到远程的数据中心并返回结果.
俯瞰图
Consul的架构俯瞰图如下:
Consul主要特点
Consul 的主要特点是:
服务发现:Consul 的客户端可以注册服务,例如
api
ormysql
,其他客户端可以使用 Consul 发现给定服务的提供者。使用 DNS 或 HTTP,应用程序可以轻松找到它们所依赖的服务。健康检查:Consul 客户端可以提供任意数量的健康检查,或者与给定服务相关联(“网络服务器是否返回 200 OK”),或者与本地节点相关联(“内存利用率是否低于 90%”)。操作员可以使用此信息来监控集群的健康状况,服务发现组件使用它来将流量从不健康的主机中路由出去。
KV 存储:应用程序可以将 Consul 的分层键/值存储用于任意数量的目的,包括动态配置、特征标记、协调、领导者选举等。简单的 HTTP API 使其易于使用。
安全服务通信:Consul 可以为服务生成和分发 TLS 证书以建立相互 TLS 连接。 意图 可用于定义允许通信的服务。可以通过可以实时更改的意图轻松管理服务分段,而不是使用复杂的网络拓扑和静态防火墙规则。
多数据中心:Consul 支持开箱即用的多个数据中心。这意味着 Consul 的用户不必担心构建额外的抽象层以扩展到多个区域。
服务网格的好处
服务网格的一些好处包括:
服务发现
应用程序健康监控
负载均衡
自动故障转移
交通管理
加密
可观察性和可追溯性,
身份验证和授权,
网络自动化
利用服务网格的一个常见用例是实现零信任模型。在零信任模型中,应用程序需要基于身份的访问,以确保服务网格内的所有通信都使用 TLS 证书进行身份验证并在传输过程中加密。
API 网关与服务网格
API 网关是一个集中式访问点,用于处理传入的客户端请求并将其交付给服务。API 网关充当控制平面,允许操作员和开发人员管理传入的客户端请求并根据请求应用不同的处理逻辑。API 网关会将传入的请求路由到相应的服务。API 网关的主要功能是处理请求并将服务的回复返回给客户端。
服务网格专门从事服务的网络管理和服务之间的通信。网格负责跟踪服务及其健康状态、IP 地址和流量路由,并确保服务之间的所有流量都经过身份验证和加密。与 API 网关不同,服务网格将跟踪所有已注册服务的生命周期,并确保将请求路由到服务的健康实例。API 网关经常与负载均衡器一起部署,以确保将流量定向到健康且可用的服务实例。网格减少了负载平衡器的占用空间,因为路由职责以分散的方式处理。
API 网关可以与服务网格一起使用,以通过服务网格桥接外部网络(非网格)。
安装部署
安装(二进制)
yum install bind-utils -y
wget https://releases.hashicorp.com/consul/1.11.4/consul_1.11.4_linux_amd64.zip #根据不同系统选择不同版本
yum install -y unzip
unzip consul_1.11.4_linux_amd64.zip
mv consul /usr/bin/ && chmod a+x /usr/bin/consul
#验证
consul
安装(从源代码编译)
git clone https://github.com/hashicorp/consul.git
make dev
#或者
##通过在构建之前设置以下环境变量来指定您的目标系统:
#GOOS: 目标操作系统。有效值包括: linux, darwin, windows, solaris, freebsd.
#GOARCH: 目标架构。有效值包括: 386, amd64, arm,arm64
export GOOS=linux GOARCH=amd64
make dev
consul version
运行agent
完成Consul的安装后,必须运行agent.agent可以运行为server或client模式.每个数据中心至少必须拥有一台server.建议在一个集群中有3或者5个server.部署单一的server,在出现失败时会不可避免的造成数据丢失
其他的agent运行为client模式.一个client是一个非常轻量级的进程.用于注册服务,运行健康检查和转发对server的查询.agent必须在集群中的每个主机上运行.
启动agent
consul agent -dev
#Consul
Agent启动并输出了一些日志数据.从这些日志中你可以看到,我们的agent运行在server模式并且声明作为一个集群的领袖.额外的本地镀锌被标记为一个健康的成员.
#查看成员
consul members
#members命令的输出是基于gossip协议是最终一致的.意味着,在任何时候,通过你本地agent看到的结果可能不是准确匹配server的状态.为了查看到一致的信息,使用HTTPAPI(将自动转发)到ConsulServer上去进行查询:
curl localhost:8500/v1/catalog/nodes
#除了HTTPAPI,DNS接口也可以用来查询节点.注意,你必须确定将你的DNS查询指向Consul agent的DNS服务器,这个默认运行在8600端口.DNS条目的格式(例如"Armons-MacBook-Air.node.consul")
dig @127.0.0.1 -p 8600 Armons-MacBook-Air.node.consul
停止Agent
你可以使用Ctrl-C优雅的关闭Agent.中断Agent之后你可以看到他离开了集群并关闭.
服务
注册服务
定义一个服务可以通过提供服务定义或者调用HTTPAPI来注册一个服务.服务定义文件是注册服务的最通用的方式.所以我们将在这一步使用这种方式.我们将会建立在前一步我们覆盖的代理配置。
首先,为Consul配置创建一个目录.Consul会载入配置文件夹里的所有配置文件.在Unix系统中通常类似/etc/consul.d(.d后缀意思是这个路径包含了一组配置文件).
mkdir /etc/consul.d
echo '{"service":{"name":"web","tags":["rails"],"port":80}}' \
>/etc/consul.d/web.json
#现在重启agent,设置配置目录:
consul agent -dev -config-dir/etc/consul.d
查询服务
一旦agent启动并且服务同步了.我们可以通过DNS或者HTTP的API来查询服务.
#DNS API让我们首先使用DNS API来查询.在DNS API中,服务的DNS名字是NAME.service.consul.虽然是可配置的,但默认的所有DNS名字会都在consul命名空间下.这个子域告诉Consul,我们在查询服务,NAME则是服务的名称.对于我们上面注册的Web服务.它的域名是web.service.consul:[
dig @127.0.0.1 -p 8600 web.service.consul
dig @127.0.0.1 -p 8600 web.service.consul SRV
#SRV记录告诉我们web这个服务运行于节点docker04.node.dc1.consul的80端口.DNS额外返回了节点的A记录.
#HTTP API除了DNS API之外,HTTP API也可以用来进行服务查询
curl http://localhost:8500/v1/catalog/service/web
更新服务
服务定义可以通过配置文件并发送SIGHUP给agent来进行更新.这样你可以让你在不关闭服务或者保持服务请求可用的情况下进行更新.另外HTTPAPI可以用来动态的添加,移除和修改服务.
Consul 代理
Consul 的核心流程。代理维护成员信息、注册服务、运行检查、响应查询等。代理必须在属于 Consul 集群的每个节点上运行。
代理以客户端或服务器模式运行。客户端节点是构成集群大部分的轻量级进程。它们与服务器节点交互以进行大多数操作,并保持非常少的自身状态。客户端在运行服务的每个节点上运行。
生命周期
代理可以手动启动,也可以通过自动化或程序化过程启动。新启动的代理不知道集群中的其他节点。
代理加入集群,使代理能够发现代理对等点。join代理在发出命令时或根据自动加入配置启动时加入集群。
关于代理的信息被传递到整个集群。结果,所有节点最终都会相互了解。
如果代理是服务器,现有服务器将开始复制到新节点。
启动代理
consul agent <options>
配置
常用配置设置
配置文件(在向 Consul 注册服务时也称为服务定义文件)中常用以下设置来配置 Consul 代理:
范围 | 描述 | 默认 |
---|---|---|
| 指定代理节点名称的字符串值。 详情请参阅 | 机器的主机名 |
| 确定代理是否在服务器模式下运行的布尔值。 详情请参阅 |
|
| 指定代理在哪个数据中心运行的字符串值。有关详细信息, 请参阅-datacenter。 |
|
| 字符串值,指定用于存储代理状态数据的目录。 详情请参阅 | 没有 |
| 指定记录代理报告的级别的字符串值。 详情请参阅 |
|
| 字符串值数组,指定启动后要加入的一个或多个代理地址。代理将继续尝试加入指定的代理,直到成功加入另一个成员。 详情请参阅 | 没有 |
| 嵌套对象块,定义绑定到代理以进行内部集群通信的地址。 | |
| 定义绑定到代理地址的端口的嵌套对象块。 有关详细信息,请参阅(链接到地址选项)。 |
所需端口
DNS: The DNS server (TCP and UDP) | 8600 |
---|---|
HTTP: The HTTP API (TCP Only) | 8500 |
HTTPS: The HTTPs API | disabled (8501)* |
gRPC: The gRPC API | disabled (8502)* |
LAN Serf: The Serf LAN port (TCP and UDP) | 8301 |
Wan Serf: The Serf WAN port (TCP and UDP) | 8302 |
server: Server RPC address (TCP Only) | 8300 |
Sidecar Proxy Min: Inclusive min port number to use for automatically assigned sidecar service registrations. | 21000 |
Sidecar Proxy Max: Inclusive max port number to use for automatically assigned sidecar service registrations. | 21255 |
#使用静态网络接口名称
consul agent -advertise '{{ GetInterfaceIP "eth0" }}'
#在特定 CIDR 中使用地址
consul agent -bind '{{ GetPrivateInterfaces | include "network" "10.0.0.0/8" | attr "address" }}'
#使用静态网络接口名称
consul agent -bind '{{ GetInterfaceIP "eth0" }}'
#对可转发且向上的网络接口名称使用正则表达式匹配
consul agent -bind '{{ GetAllInterfaces | include "name" "^eth" | include "flags" "forwardable|up" | attr "address" }}'
#将 consul 客户端接口绑定到私有 IPv4 接口
$ consul agent -dev -client '{{ GetPrivateInterfaces | exclude "type" "ipv6" | join "address" " " }}'
#将 consul 客户端接口绑定到私有 IP 地址和环回
consul agent -dev -client '{{ GetPrivateInterfaces | join "address" " " }} {{ GetAllInterfaces | include "flags" "loopback" | join "address" " " }}'
#排除以“br-”开头的私有接口
consul agent -dev -client '{{ GetPrivateInterfaces | exclude "name" "br.*" | join "address" " " }}'
#使用 DNS 条目
consul agent -retry-join "consul.domain.internal"
#使用 IPv4
consul agent -retry-join "10.0.4.67"
#使用非默认的 Serf LAN 端口
consul agent -retry-join "192.0.2.10:8304"
#使用 IPv6
consul agent -retry-join "[::1]:8301"
#使用多个地址
consul agent -retry-join "consul.domain.internal" -retry-join "10.0.4.67"
#使用云自动加入
consul agent -retry-join "provider=aws tag_key=..."
配置文件
datacenter = "east-aws"
data_dir = "/opt/consul"
log_level = "INFO"
node_name = "foobar"
server = true
watches = [
{
type = "checks"
handler = "/usr/bin/health-check-handler.sh"
}
]
telemetry {
statsite_address = "127.0.0.1:2180"
}
{
"datacenter": "east-aws",
"data_dir": "/opt/consul",
"log_level": "INFO",
"node_name": "foobar",
"server": true,
"watches": [
{
"type": "checks",
"handler": "/usr/bin/health-check-handler.sh"
}
],
"telemetry": {
"statsite_address": "127.0.0.1:2180"
}
}
注意:下面描述的所有 TTL 值都由 Go 的time包解析,并具有以下 格式规范:“持续时间字符串是可能有符号的十进制数序列,每个都有可选的分数和单位后缀,例如 '300ms', ' -1.5h' 或 '2h45m'。有效的时间单位是 'ns'、'us'(或 'µs')、'ms'、's'、'm'、'h'。
详见
https://www.consul.io/docs/agent/options
集群
每个集群中的节点都必须要一个唯一的名字.Consul默认会使用机器的hostname.我们可以使用-node手动覆盖他.
使用-bind指定一个绑定的地址让Consul在这个地址上进行监听,这个地址必须可以被其他集群成员访问到.绑定地址不是必须提供,Consul选择第一个私有IP进行监听,不过最好还是指定一个.生产环境的服务器通常有多个网络接口.所以指定一个不会让Consul绑错网络接口.
第一个节点将扮演集群的唯一server,使用-server指定他.-bootstrap-expect选项提示Consul我们期待加入的server节点的数量.这个选项的作用是启动时推迟日志复制
#第一个节点
consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul-node=hdp2 -bind=192.168.137.32 -config-dir /etc/consul.d
#其他节点
consul agent -data-dir /tmp/consul-node=hdp3 -bind=192.168.137.33 -config-dir /etc/consul.d
#进入第一节点服务 将其他节点加入
consul join 192.168.137.33
#注意防火墙端口问题
#查看成员
consul members
#或者
consul agent -config-dir /etc/consul.d/ -data-dir /tmp/consul-node=hdp3 --bind=192.168.137.33 -join=192.168.137.32
#启动时自动加入集群
consul agent -atlas-join -atlas=ATLAS_USERNAME/infrastructure -atlas-token="YOUR_ATLAS_TOKEN"
#查询节点
dig @127.0.0.1 -p 8600 hdp3.node.consul
dig @127.0.0.1 -p 8600 hdp2.node.consul
# 启动集群
sudo ./consul agent -server -bootstrap-expect 2 -data-dir=data -node=n1 -bind=0.0.0.0 -client=0.0.0.0 &
#搭建管理工具
consul自带的WEB UI,Web ui是consul提供的可视化的服务web界面,可以对key/value和服务、节点进行操作
a) 下载consul web ui(包含一个html和一个static文件件),和本机中的consul放到同级目录。
b) 在本机启动consul,需要设置-ui-dir ./webui
sudo ./consul agent -server -bootstrap-expect 2 -data-dir=data -node=n3 -bind=10.0.0.7 -ui-dir=webui -client 0.0.0.0 &
consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul-node=hdp2 -bind=192.168.137.32 -config-dir /etc/consul.d -ui=true -client 0.0.0.0
#配置生效顺序:
命令行>环境变量>配置文件
#命令行配置:
-bootstrap:启动模式,此模式下,节点可以选举自己为leader,一个数据中心只能有一个此模式启动的节点。机群启动后,新启动的节点不建议使用这种模式。
-bootstrap-expect:设定一个数据中心需要的服务节点数,可以不设置,设置的数字必须和实际的服务节点数匹配。consul会等待直到数据中心下的服务节点满足设定才会启动集群服务。初始化leader选举,不能和bootstrap混用。必须配合-server配置。
-bind:绑定的内部通讯地址,默认0.0.0.0,即,所有的本地地址,会将第一个可用的ip地址散播到集群中,如果有多个可用的ipv4,则consul启动报错。[::]ipv6,TCP UDP协议,相同的端口。防火墙配置。
-client:客户端模式,http dns,默认127.0.0.1,回环令牌网址
-config-file:配置文件位置
-config-dir:配置文件所在文件夹,会加载其下所有配置文件,.json或者.hcl文件,加载顺序为字母表顺序;可用配置多个此配置,从而加载多个文件夹,子文件夹的配置不会被加载。
-config-format:配置文件格式,配置了,则加载相应个是的文件。不配置,则consul自动识别。
-data-dir:状态数据存储文件夹,所有的节点都需要。文件夹位置需要不收consul节点重启影响,必须能够使用操作系统文件锁,unix-based系统下,文件夹文件权限为0600,注意做好账户权限控制,
-datacenter:数据中心名称,默认dc1,一个数据中心的所有节点都必须在一个LAN中。
-dev:开发模式,去掉所有持久化选项,内存服务器模式。
-disable-host-node-id:不使用host信息生成node ID,适用于同一台服务器部署多个实例用于测试的情况。随机生成nodeID
-dns-port:v7.0以后,自定义dns 端口,覆盖默认8600
-enable-script-checks:是否允许使用脚本进行健康检查,默认false,最好配置enable acl
-encrypt:consul网络通讯加密key,base64加密,16比特;consul keygen产生。集群中的每个实例必须提供相同的,只需提供一次,然后会保存到数据文件。重启自动加载。consul节点启动后提供,会被忽略。
-hcl:添加hcl格式配置,和已有的配置合并。可以使用多个此配置。
-http-port:http api端口,覆盖默认的8500。适用于云环境指定。
-log-file:日志记录文件,如果没有提供文件名,则默认Consul-时间戳.log
-log-level:日志级别,默认info,包含:trace,debug,info,warn,err;consul monitor监控
-log-rotate-bytes:新日志文件生成大小阈值。
-log-rotate-rotation:新日志生成时间阈值
-join:需要加入的其它节点地址,可以多次使用,加入多个节点。
-retry-join:会进行加入重试,适用于认定加入节点最终会正常的情况。ipv4,ipv6,dns
-retry-interval:上述,重试间隔,默认30s
-retry-max:重试次数,默认0,无限次重试
-join-wan, -retry-join-wan, -retry-interval-wan, -retry-max-wan
-node:节点名称,默认主机名
-node-id:节点ID,
-pid-file:consul 存储 pid 的文件位置,用于主动发信号。如停止节点,重载配置等。
-protocol:使用的协议,升级时使用。consul -v查看协议版本
-raft-protocol:使用raft协议版本,默认3
-raft-snapshot-threshold:raft执行快照,提交次数阈值。一般不需要设置,io密集型应用可以调高。避免所有的节点同一时间快照。此值过大,会造成相应日志文件变大,节点重启恢复会耗费更长时间。1.1.0后,默认16384,之前8192.
-raft-snapshot-interval:执行快照间隔,影响类似上个配置,1.1.0后默认30s,之前5s。
-rejoin:节点会尝试重新加入集群。
-server:服务端节点模式。
-server-port:服务端RPC端口,v1.2.2后提供。
-non-voting-server:服务节点不参与选举,接受日志复制,用于横向扩展,服务查询请求。(类比zookeeper 观察者节点)
-syslog:linux OSX系统,配置日志输出到系统日志。
-ui:内置web ui界面。
-ui-dir:web ui 资源文件夹,使用此配置,则不需也不能使用再-ui配置。
#默认使用端口:
服务端RPC:默认8300,TCP。
Serl LAN:处理LAN gossip,默认8301,TCP UDP。
Serl WAN:处理LAN gossip,默认8302,TCP UDP。
HTTP API:8500,TCP.
DNS:8600,TCP,UDP.
HTTP API 结构
验证
curl \
--header "X-Consul-Token: <consul token>" \
http://127.0.0.1:8500/v1/agent/members
curl \
--header "Authorization: Bearer <consul token>" \
http://127.0.0.1:8500/v1/agent/members
备注:https://www.consul.io/api-docs
健康检查
健康检查是服务发现的关键组件.预防使用到不健康的服务.
定义检查和服务类似,一个检查可以通过检查定义或HTTPAPI请求来注册.我们将使用和检查定义来注册检查.和服务类似,因为这是建立检查最常用的方式.在第二个节点的配置目录建立两个定义文件:
echo '{"check":{"name":"ping","shell":"ping -c1 163.com>/dev/null","ttl": "5s"}}'>/etc/consul.d/ping.json
echo '{
"check": {
"id": "api",
"name": "HTTP API on port 80",
"http": "http://localhost:80/health",
"tls_server_name": "",
"tls_skip_verify": false,
"method": "POST",
"header": { "Content-Type": ["application/json"] },
"body": "{\"method\":\"health\"}",
"interval": "10s",
"timeout": "1s"
}
}'>/etc/consul.d/web.json
curl http://localhost:8500/v1/health/state/critical
键值数据存储
Consul提供了一个易用的键/值存储.这可以用来保持动态配置,协助服务协调,领袖选举,做开发者可以想到的任何事情.
ConsulTemplate
ConsulTemplate提供一个方便的方式从Consul获取数据通过consul-template的后台程序保存到文件系统
下载
https://releases.hashicorp.com/consul-template/
备注:https://www.consul.io/docs