Consul服务注册发现
Consul是一个轻量级的服务注册与发现工具, 支持集群, 支持k/v存储, 支持对服务的健康检查. 同类工具有etcd, zookeeper等..
二进制安装
https://releases.hashicorp.com/consul/1.2.2/consul_1.2.2_linux_amd64.zip
下载并解压, 然后拷贝二进制文件到 /usr/local/bin
快速启动consul
开发模式启动consul是最快的方式
consul agent -dev -config-dir=/etc/consul -bind=0.0.0.0 -client=0.0.0.0
参数说明
-
agent
-- 使用agent模式跑起来 -
-dev
-- 使用开发模式启动agent -
-config-dir
-- 配置文件目录, 这里存放json文件以文件的形式注册服务 -
-bind=0.0.0.0
-- 绑定集群通讯的ip地址, 默认是127.0.0.1 -
-client=0.0.0.0
-- 绑定客户端API,DNS等服务监听的地址, 默认是127.0.0.1
Consul主配置文件
/etc/consul/config.json
{
"acl_datacenter": "aliyun", # 开启ACL必选 数据中心名称, 表示启用acl的数据中心, all表示所有数据中心
"acl_default_policy": "deny", # 可选 默认为allow, 所有操作都允许 改为deny即表示开启acl(既白名单模式), 第一次启动consul请勿配置deny否则自己进不去
"acl_master_token": "5d79de96-106f-11e7-9381-005056abff5a", # 开启ACL必选 这个token必须是uuid格式, 任何可生成uuid的工具生成, 在访问API时必须带上此uuid, 包括UI界面, UI界面点击右侧的setting进入后, 在ACL TOKEN中填入acl_master_token的值, 点击save 即可配置ACL
"bootstrap_expect": 2, # 在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap公用
"client_addr": "0.0.0.0",
"bind_addr": "0.0.0.0",
"advertise_addr": "192.168.1.200", # 当服务器有多个私网IP时, 必须指定一个IP作为集群通信IP, 需要个bind_addr一起使用
"data_dir": "/opt/consul",
"datacenter": "aliyun", # 数据中心名称
"dns_config": { # DNS发现功能的配置
"allow_stale": true,
"enable_truncate": true,
"node_ttl": "60s",
"service_ttl": {
"*": "5s"
}
},
"enable_script_checks": true, # 允许服务使用脚本进行健康检查
"encrypt": "NnKESxGToysca68P7FM2sA==", # consul的server和client通信秘钥 使用consul keygen创建, 不管server还是client都要这个参数和相同的值
"log_level": "INFO", # 日志记录等级
"node_name": "consulServer1", # 本节点名称
"server": true, # consul以server模式启动
"ui": true # 启用UI界面
}
注: 关于ACL的配置还有:
acl_down_policy
ACL数据中心脱机时要执行的操作策略acl_ttl
缓存ACL的生存时间acl_agent_master_token
当ACL数据中心不可用或服务器(Client)脱机时,可用于访问服务器(Client)Agent API的特殊令牌; 请参阅ACL Agent Tokenacl_agent_token
用于agent内部操作的特殊令牌,有关详细信息,请参阅ACL Agent Tokenacl_master_token
用于引导ACL系统的特殊令牌, 请参阅 首次启动时的ACLacl_token
用于未提供令牌的客户端请求的默认令牌; 这通常配置为对服务的只读访问权限,以便在代理上启用DNS服务发现
Consul的CLI启动参数绝大部分都也可以配置在config.json中, 但有些参数在json中配置时名称和cli中使用有所不同
详见官方文档 https://www.consul.io/docs/agent/options.html#configuration-files
Consul监听的端口
协议 | 端口 | 说明 |
---|---|---|
tcp | 8300 | Server 服务器节点与集群通讯 |
tcp | 8301 | Cluster LAN -- 集群sever间通信 |
udp | 8301 | Cluster LAN -- 集群sever间通信 |
tcp | 8302 | Cluster WAN -- 集群sever间通信 |
udp | 8302 | Cluster WAN -- 集群sever间通信 |
tcp | 8500 | Client HTTP Server -- 节点对外HTTP服务 |
tcp | 8600 | Client DNS Server(TCP) -- 节点对外DSN服务 |
udp | 8600 | Client DNS Server(UDP) -- 节点对外DNS服务 |
这些端口在config.json或者启动参数中都是可以修改的
本地json文件服务注册
/etc/consul/web.json
{
"service": {
"checks": [ # 健康检查配置
{
"tcp": ":80", # 检查模式, tcp, http, https, script几种模式, :80表示访问本机任何ip的80端口
"interval": "5s",
"timeout": "1s"
}
],
"id": "web-1", # 服务id
"name": "web-1", # 服务名称
"port": 80 , # 服务端口
"tags": [ # 标签
"urlprefix-/web" # 给fabio使用的标签, 后面会详细说
]
}
}
Consul的UI界面
cli方式启动时必须 -ui
启动UI界面
config.json方式配置时需要增加 { "ui": ture }
才能启动UI界面
http://x.x.x.x:/8500/ui 可以进入UI界面
服务健康检查
常见的有http, script, tcp等, 同一个服务可以有多种检查方法,例如:
{
"checks": [
{
"id": "chk1",
"name": "mem",
"args": ["/bin/check_mem", "-limit", "256MB"], # 带参数的script类型检查
"interval": "5s",
"timeout": "1s"
},
{
"id": "chk2",
"name": "/health",
"http": "http://localhost:5000/health", # http类型检查
"tls_skip_verify": false,
"method": "POST",
"header": {"x-foo":["bar", "baz"]},
"interval": "15s",
"timeout": "1s"
},
{
"id": "chk3",
"name": "cpu",
"script": "/bin/check_cpu", # 不带参数的script检查
"interval": "10s"
},
...
]
}
更多健康检查方法和参数详见官方文档
https://www.consul.io/docs/agent/checks.html
ConsulAPI
请参见 官方文档 https://www.consul.io/api/agent.html
Consul集群配置
Consul集群配置要注意几点:
- ACL 权限要配好, 不然权限不足会导致servers/clients之间不能通信
- encrypt 所有server, client节点的通信秘钥必须一致
手动加入集群方法
[root@localhost ~]# consul join 192.168.1.xxx
Successfully joined cluster by contacting 1 nodes.
自动加入集群方法
- consul agent CLI方式启动参数
-retry-join="192.168.1.1 192.168.1.2 192.168.1.3"
- config.json配置文件方式启动参数
{ "retry_join": ["192.168.1.1", "192.168.1.2","192.168.1.3"] }
注: retry-join参数允许失败, 未指定重试次数和间隔将永远尝试, 直到成功未知
Consul ACL访问控制列表
如何进入ACL管理界面?
1.打开UI界面
2.点击导航栏右侧的Settings
3.将consul配置文件中的 acl_master_token
拷贝粘贴到web界面中的ACL TOKEN
4.点击Save按钮
5.再点击导航栏中的ACL菜单
创建ACL策略
策略内容
key "" { # 针对访问k/v存储的策略
policy = "read" # 只读
}
service "fabio-" { # 针对访问服务的策略(仅针对以"fabio-"开头命名的服务
policy = "write" # 可读可写
}
service "" { # 针对访问服务的策略 (所有服务)
policy = "read" # 可读
}
node "" { # 针对访问节点信息的策略 (所有节点)
policy = "read" # 可读
}
agent "" { # 针对访问agent代理信息的策略 (所有agent)
policy = "read" # 可读
}
session "" {
policy = "write"
}
UI界面创建ACL策略示例
策略对象 | 说明 |
---|---|
agent |
Agent API中的实用程序操作,而不是服务和检查注册 |
event |
在Event API中检索时间和触发事件 |
key |
KV Store API中的键/值存储操作 |
keyring |
密钥环API中的密钥环操作 |
node |
Catalog API,Health API,Prepared Query API,Network Coordinate API和Agent API中的节点级目录操作 |
operator |
除Keyring API之外的Operator API中的集群级操作 |
query |
发现查询的查询操作 |
service |
Catalog API,Health API,Prepared Query API和Agent API中的服务级目录操作 |
session |
会话API操作 |
ACL策略类型
-
read
只读 -
write
读写 -
deny
不能读也不能写
API操作ACL详见官方API文档 https://www.consul.io/docs/guides/acl.html#rule-specification
Network Segments 网格
待完善
Consul 监控
待完善
Fabio反向代理
Fabio是为consul而生的一个反向代理服务器, 支持负载均衡, http, https, tcp等. 你可以把它想象成nginx, 与nginx不同的是fabio可以根据consul服务的tag来进行自动转发请求
安装Fabio
首先需要安装git 和go环境 使用yum安装即可
# yum -y install git golang
获取fabio
# go get github.com/eBay/fabio
拷贝fabio二进制文件到彬bin目录
# cp go/bin/fabio /usr/local/bin/
拷贝配置文件到etc目录
# cp go/src/github.com/eBay/fabio/fabio.properties /etc/
/etc/fabio.properties常见配置
proxy.addr = :9999 # fabio代理监听端口
proxy.localip = # 代理监听的本地ip地址, 默认是空也就是0.0.0.0
proxy.strategy = rnd # 代理策略 rr(轮训)和rnd(基于微秒时间随机分配)
proxy.matcher = prefix # fabio反代请求给consul的匹配方式, prefix是使用uri前缀匹配, glob是使用通配符匹配(通配符不是正则表达式哦, 虽然有些相通)
proxy.maxconn = 10000 # 缓存的连接数
registry.consul.addr = localhost:8500 # fabio 去个consul服务注册自己? 一般指定任意一个client的8500端口即可
registry.consul.token = # fabio去consul注册自己时, 需要使用的token(当consul启用了acl才需要)
registry.consul.kvpath = /fabio/config # fabio在consul的k/v数据库中写入数据的路径
# fabio转发请求到consul时, 如果使用prefix策略, 则需要指定前缀是啥
# 比如 当请求fabio地址http://fabio_ip:9999/urlprefix-/webService
# fabio将会把请求转发到consul中tag为"urlprefix-/webService"的服务
# 也就是说"urlprefix-"是fabio和consule服务注册者在consul注册服务打标签时约定的标签前缀
registry.consul.tagprefix = urlprefix-
fabio还有很多关于反代的参数, 比如代理https时使用的证书, http头的修改等等配置, 详情参见官方文档 https://fabiolb.net/ref/
自定义代理路由
fabio默认会按照proxy.matcher配置的匹配方法自动向consul转发请求, 当然也可以自定义路由进行转发
如何配置自定义转发路由规则?
登陆consul的UI界面, 在Key/Value中创建
Key:
fabio/config
Value:
route add serviceName1 /abc http://192.168.1.1/
如下图所示
转发的路由规则语法请参见官方文档
https://fabiolb.net/cfg/
查看Fabio路由表
http://fabio_ip:9998/routes
路由有各种Option, 这些Option在add route自定义路由或consul注册服务时都需要注意
比如consul注册如下服务时:
{
"service": {
"checks": [
{
"tcp": ":443",
"interval": "5s",
"timeout": "1s"
}
],
"id": "web-2",
"name": "web-2",
"port": 443 ,
"tags": [
"urlprefix-/web2, proto=https, tlsskipverify=true"
]
}
}
consul注册服务时已定义好如果fabio向自己转发请求时自己应该告诉fabio些什么:
-
urlprefix-/web2
: 当用户请求fabio(你)的uri前缀是"/urlprefix-/web2"的时候才转发到consul(我)这个服务(注意urlprefix-/web2在tag里时前面时没有/的) -
proto=https
:consul(我)的这个服务是https的 -
tlsskipverify=true
:fabio(你)在访问consul(我)的这个服务时请跳过证书检查
比如在fabio新增一个路由时:
route add web2 /web2 https://x.x.x.x:8080/ opts "proto=https, tlsskipverify=true"
这个自定义路由是fabio告诉自己, 当匹配到uri为/web2的请求时, 应该将请求转发的目标是什么, 转发给目标时需要哪些参数:
-
proto=https
目标是https协议 -
tlsskipverify=true
转发给目标时, 忽略目标的ssl证书检查