使用docker安装consul
- 查找consul
docker search consul
- 下载consul
docker pull consul
- 下载指定版本的consul
docker pull consul:1.4.2
启动consul
- 启动示例(server-leader模式)
docker run -d --name consul_server1 -p 8400:8400 -p 8500:8500 -p 8600:53/udp -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' consul agent -server -bind=127.0.0.1 -bootstrap-expect=1 -node=consul_server1 -ui -client 0.0.0.0
参数说明
docker 程序参数说明:
- -d 以守护进程方式运行(后台)
- —name docker app 容器名,未指定,则随机生成
- -p 端口暴露,容器内部服务端口与物理机端口映射格式;说明:物理机端口:容器内部服务端口
- -e 系统环境变量
consul 服务参数说明:
CONSUL_LOCAL_CONFIG
consul服务配置, 参数内容:Json格式- -server 指定启动模式为server
- -bind 集群内部各节点通讯地址
- -bootstrap-expect 集群服务,标识datacenter需要参与选举集群节点数, 一旦指定该参数,则集群服务只会在节点数符合预期值,服务才能启动
- -node 节点名字
- -ui 启用内置Consul管理界面
- -client 客户端绑定地址,默认为127.0.0.1
- 启动示例(server模式)
docker run -d --net=host -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' consul agent -server -bind=127.0.0.1 -retry-join=127.0.0.1 -bootstrap-expect=3
参数说明
- —net 标志指定希望在哪个网络上运行该容器
- -retry-join 指定要加入那个节点,启动集群服务, 单节点可不指定
- 启动示例(client模式)
docker run -d --net=host -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' consul agent -bind=127.0.0.1 -retry-join=127.0.0.1
- 查看集群状态
docker exec -t node1 consul members
consul使用
注册服务
- 调用
curl http://consul:8500/v1/agent/service/register
PUT 注册一个服务. - request body:
{
"ID": "userServiceId", //服务id
"Name": "userService", //服务名
"Tags": [ //服务的tag,自定义,可以根据这个tag来区分同一个服务名的服务
"primary",
"v1"
],
"Address": "127.0.0.1",//服务注册到consul的IP,服务发现,发现的就是这个IP
"Port": 8000, //服务注册consul的PORT,发现的就是这个PORT
"EnableTagOverride": false,
"Check": { //健康检查部分
"DeregisterCriticalServiceAfter": "90m",
"HTTP": "http://www.baidu.com", //指定健康检查的URL,调用后只要返回20X,consul都认为是健康的
"Interval": "10s" //健康检查间隔时间,每隔10s,调用一次上面的URL
}
}
- 示例:
- 请求:
curl http://172.17.0.4:8500/v1/agent/service/register -X PUT -i -H "Content-Type:application/json" -d '{
"ID": "userServiceId",
"Name": "userService",
"Tags": [
"primary",
"v1"
],
"Address": "127.0.0.1",
"Port": 8000,
"EnableTagOverride": false,
"Check": {
"DeregisterCriticalServiceAfter": "90m",
"HTTP": "http://www.baidu.com",
"Interval": "10s"
}
}'
- 响应:
HTTP/1.1 200 OK
Vary: Accept-Encoding
Date: Wed, 20 Feb 2019 02:28:33 GMT
Content-Length: 0
发现服务
- 调用
curl http://127.0.0.1:8500/v1/catalog/service/userService
GET 发现一个服务 - 示例:
- 请求:
curl http://172.17.0.4:8500/v1/catalog/service/userService
- 响应:
[
{
"Address": "172.17.0.4",
"CreateIndex": 880,
"ID": "e6e9a8cb-c47e-4be9-b13e-a24a1582e825",
"ModifyIndex": 880,
"Node": "node3",
"NodeMeta": {},
"ServiceAddress": "127.0.0.1",
"ServiceEnableTagOverride": false,
"ServiceID": "userServiceId",
"ServiceName": "userService",
"ServicePort": 8000,
"ServiceTags": [
"primary",
"v1"
],
"TaggedAddresses": {
"lan": "172.17.0.4",
"wan": "172.17.0.4"
}
}
]
存储配置
- 示例:
- 定义值
curl -X PUT -d 'test' http://127.0.0.1:8500/v1/kv/web/key1?flags=42
- 修改值
curl -X PUT -d 'newval' http://127.0.0.1:8500/v1/kv/web/key1?flags=734
发现配置
获取特定的值
curl -s http://127.0.0.1:8500/v1/kv/web/key1 | python -m json.tool
集群搭建
以部署3个节点的集群为例
前期准备
部署3个节点
- 节点名自定,示例为: c1,c2,c3
- 在当前目录分别新建三个目录c1,c2,c3
- 分别在c1,c2,c3目录创建目录config,data
- 启动第一个节点 c1
sudo docker run --name=c1 -v ${pwd}/c1/config:/consul/config -v ${pwd}/c1/data:/consul/data -p 8500:8500 consul agent -server -client=0.0.0.0 -bind=0.0.0.0 -dev
设置其他节点需要加入服务的IP
- 控制台输出具体IP说明c1启动成功
IP=$(sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' c1); echo $IP
- 启动其他节点 c2,c3
sudo docker run --name c2 -v ${pwd}/c2/config:/consul/config -v ${pwd}/c2/data:/consul/data consul agent -server -bind=0.0.0.0 -join=$IP
sudo docker run --name c3 -v ${pwd}/c3/config:/consul/config -v ${pwd}/c3/data:/consul/data consul agent -server -bind=0.0.0.0 -join=$IP
访问管理界面
http://localhost:8500
- 看到三个节点注册成功
配置权限
集群模式权限配置
启用ACL配置
以
集群搭建
->以部署3个节点的集群为例
章节的集群服务为示例
- 停止server节点c1
启用ACL
- 在
$(pwd)/c1/config/
新增配置文件master-token.json
- 内容:
json { "acl_master_token":"d9f1928e-1f84-407c-ab50-9579de563df5", "acl_datacenter":"dc1", "acl_default_policy":"deny", "acl_down_policy":"deny" }
- 在
- `acl_master_token`: 自生成
- 在线: [https://1024tools.com/uuid](https://1024tools.com/uuid)
- 以Linux为例可以使用系统的`uuidgen`生成,其他系统自行研究
- 其他参数值,根据示例填写即可, 各个参数说明参见 [https://www.consul.io/docs/agent/options.html](https://www.consul.io/docs/agent/options.html)
- 重新启动server节点
- 此时加入c1的agent如果没有配置
acl
,则会看到下面的sync失败信息
2019/02/26 07:11:32 [DEBUG] raft-net: 172.17.0.4:8300 accepted connection from: 172.17.0.3:56894
2019/02/26 07:11:32 [INFO] consul: New leader elected: b23c446d3390
2019/02/26 07:11:33 [WARN] agent: Node info update blocked by ACLs
2019/02/26 07:11:46 [WARN] agent: Coordinate update blocked by ACLs
2019/02/26 07:12:12 [WARN] agent: Coordinate update blocked by ACLs
2019/02/26 07:12:28 [WARN] agent: Coordinate update blocked by ACLs
2019/02/26 07:12:51 [WARN] agent: Coordinate update blocked by ACLs
为其他agent节点的创建token,用于加入集群进行Token认证
- 通过API接口进行创建,其中
X-Consul-Token
为先前生成的uuid值 - 请求:
curl \ --request PUT \ --header "X-Consul-Token: d9f1928e-1f84-407c-ab50-9579de563df5" \ --data \ '{ "Name": "Agent Token", "Type": "client", "Rules": "node \"\" { policy = \"write\" } service \"\" { policy = \"read\" }" }' http://127.0.0.1:8500/v1/acl/create
- 通过API接口进行创建,其中
- 响应:
{ "ID": "0a4381bb-80d2-85fa-6ffa-1c2a9948d421" }
在c1节点更新节点Token
通过API接口进行更新,其中
X-Consul-Token
为先前生成的uuid值Token
:为上一步请求,响应生成的IDcurl \
--request PUT \
--header "X-Consul-Token: d9f1928e-1f84-407c-ab50-9579de563df5" \
--data \
'{
"Token":"0a4381bb-80d2-85fa-6ffa-1c2a9948d421"
}' http://10.0.90.35:8500/v1/agent/token/acl_agent_token
停止其他节点,并为其他agent设置
acl
- 分别在对应agent节点目录下的config创建配置文件
acl.json
acl.json
内容:{ "acl_datacenter": "dc1", "acl_down_policy": "extend-cache", "acl_agent_token": "0a4381bb-80d2-85fa-6ffa-1c2a9948d421" }
- 分别在对应agent节点目录下的config创建配置文件
- 重新启动其他节点
设置策略
说明
- 策略配置可通过UI管理界面和API接口两种
策略类型有三种
- read: 对consul服务只读
- write: 对consul服务允许读写
- deny: 对consul服务拒绝读写
策略格式
- 以HCL语言(HCL stands for HashiCorp Language)格式编写
- 详情查看说明 https://learn.hashicorp.com/consul/advanced/day-1-operations/acl-guide
示例
- 在管理界面
ACL
->Policies
新建策略 New Policy
->Name
- 填写策略名:如:
test
- 填写策略名:如:
New Policy
->Rules
填写符合
HCL
要求的策略,如:- 针对服务service:
service "spring-boot-admin-service" { policy = "write" } service "spring-api-gateway" { policy = "write" }
- 针对服务service:
- 在管理界面
- 针对节点 node:```
node “spring-boot-admin-service-node-1” { policy = “write” }
- 针对配置, K/V配置
key “” { policy = “read” } key “foo/“ { policy = “write” } ```
设置ACL
常见问题
- consul KV 备份与恢复