在上一篇文章里面,咱们讲了如何搭建带有Acl控制的Consul集群。
这一篇文章主要讲述一下上一篇文章那一大串配置文件的含义。html
上一篇文章关于机器规划方面,consul client agent的端口写的有误。这里再贴一下正确的机器规划。node
上一节中,提供了三个配置文件,consul-server1.json, consul-server2.json以及consul-server3.json。
其中consul-server1.json参数最多,这里就以它来讲明各个配置的含义:web
{ "datacenter":"dc1", "primary_datacenter":"dc1", "bootstrap_expect":1, "start_join":[ "10.211.55.25", "10.211.55.26" ], "retry_join":[ "10.211.55.25", "10.211.55.26" ], "advertise_addr": "10.211.55.28", "bind_addr": "10.211.55.28", "server":true, "connect":{ "enabled":true }, "node_name":"consul-server1", "data_dir":"/opt/consul/data/", "enable_script_checks":false, "enable_local_script_checks":true, "log_file":"/opt/consul/log/", "log_level":"info", "log_rotate_bytes":100000000, "log_rotate_duration":"24h", "encrypt":"krCysDJnrQ8dtA7AbJav8g==", "acl":{ "enabled":true, "default_policy":"deny", "enable_token_persistence":true, "tokens":{ "master":"cd76a0f7-5535-40cc-8696-073462acc6c7", "agent":"deaa315d-98c5-b9f6-6519-4c8f6574a551" } } }
我再贴一下配置信息。json
{ "datacenter":"dc1", "primary_datacenter":"dc1", "advertise_addr": "10.211.55.27", "start_join":[ "10.211.55.25", "10.211.55.26", "10.211.55.28" ], "retry_join":[ "10.211.55.25", "10.211.55.26", "10.211.55.28" ], "bind_addr":"10.211.55.27", "node_name":"consul-client1", "client_addr":"0.0.0.0", "connect":{ "enabled":true }, "data_dir":"/opt/consul/data/", "log_file":"/opt/consul/log/", "log_level":"info", "log_rotate_bytes":100000000, "log_rotate_duration":"24h", "encrypt":"krCysDJnrQ8dtA7AbJav8g==", "ui":true, "enable_script_checks":false, "enable_local_script_checks":true, "disable_remote_exec":true, "ports":{ "http":7110 }, "acl":{ "enabled":true, "default_policy":"deny", "enable_token_persistence":true, "tokens":{ "agent":"deaa315d-98c5-b9f6-6519-4c8f6574a551" } } }
这里,start_join, retry_join都是指定的server agent的地址。
另外尚未提过的配置就是client_addr, ui, ports.http .
下面依次说明:bootstrap
能够有人会说,你上面让我又是搭建环境,又是看配置说明,我建好了一个这么一个带ACL控制的Consul集群有什么用呢?api
ACL 全称 Access Control List,也就是访问控制列表的意思,如今咱们生成了带有ACL控制的集群,就意味不是谁都能来向我注册的,也不是谁都能像我获取服务列表-- 也就是你想对Consul执行任何操做,你得对应的令牌,也就是ACL Token。数组
为了模拟通常的Http请求,我这里下载一个Postman, 是的这里没有用命令行curl。
咱们如今postman输入
http://127.0.0.1:7110/v1/catalog/nodes
会发现一个节点都拿不到:浏览器
此时若是加上master token, 也就是访问
http://127.0.0.1:7110/v1/catalog/nodes?token=cd76a0f7-5535-40cc-8696-073462acc6c7
会发现能够拿到全部节点的数据(下图只截取一部分)安全
前面说过master token是权限最大的token,假如这样给出去,各个部分都拿来用。若是两个不一样的部分注册名称同样的服务该怎么办,取消注册了其余部门的服务又该怎么办。总之,权限能不能给小点,答案是能够的。
首先说一下目标:
1.不一样部门的服务必需要有本身的前缀,好比deptA表示部门A,好比deptB表示部门B
2.不一样部门只能更改本身的服务。服务器
注册服务deptA-pingbaidu1, 注意这里选择的PUT方法。
PUT http://127.0.0.1:7110/v1/agent/service/register?token=cd76a0f7-5535-40cc-8696-073462acc6c7 { "ID": "deptA-pingbaidu1", "Name": "deptA-pingbaidu", "Tags": [ "primary", "v1" ], "Address": "127.0.0.1", "Port": 8000, "Meta": { "my_version": "4.0" }, "EnableTagOverride": false, "Check": { "DeregisterCriticalServiceAfter": "90m", "HTTP": "http://www.baidu.com/", "Interval": "10s" } }
在截个图,当返回status为200时,表示成功注册
此时能够在consul web ui中进行查看,打开consul-client1所在的机器,在浏览器中,输入http://127.0.0.1:7110/ui/dc1/services,( 注意在此以前你须要先设置consul web ui的token,上一篇文章末尾已经说起),此时会看到
相似地,在注册个deptA-pingMe1的服务
PUT http://127.0.0.1:7110/v1/agent/service/register?token=cd76a0f7-5535-40cc-8696-073462acc6c7 { "ID": "deptB-pingMe1", "Name": "deptB-pingMe", "Tags": [ "primary", "v1" ], "Address": "127.0.0.1", "Port": 7000, "Meta": { "my_version": "4.0" }, "EnableTagOverride": false, "Check": { "DeregisterCriticalServiceAfter": "90m", "HTTP": "https://blog.csdn.net/yellowstar5", "Interval": "10s" } }
首先咱们来生成部门A的policy, 意思度全部节点具备写权限(写权限包括读),而且只能写deptA开头的服务。
node_prefix "" { policy = "write" } service_prefix "deptA"{ policy = "write" }
下面是具体的生成过程
1.新建policy并保存
2.生成token
3.查看token列表,并点击deptA-policy那一项查看并复制token
只须要把policy稍做修改就能够,其余部门和部门A的相似,这里就不贴图了。
node_prefix "" { policy = "write" } service_prefix "deptB"{ policy = "write" }
最后咱们拿到部门A和部门B的token,以及master的token
我这里deptA的token是:8764c083-0acb-e11e-433d-8d8803db9bd2
deptB的token是: 052f467f-9581-cc7c-a8a5-84d8df51dc9d
master token是: d76a0f7-5535-40cc-8696-073462acc6c7
下面用postman测试一下,看看不一样token返回的服务列表
deptA-token
http://127.0.0.1:7110/v1/agent/services?token=8764c083-0acb-e11e-433d-8d8803db9bd2
deptB-token
http://127.0.0.1:7110/v1/agent/services?token=052f467f-9581-cc7c-a8a5-84d8df51dc9d
master-token
http://127.0.0.1:7110/v1/agent/services?token=cd76a0f7-5535-40cc-8696-073462acc6c7
能够发现deptA-token只能看到部门A的服务,deptB-token只能看到部门B的服务,master-token能够看到因此的。
另外取消注册,注册之类的验证你们能够本身试试,都与上面的方式差很少,只不过要使用不一样的Http API
,https://www.consul.io/api/age...,在这个地址你能够看到consul 提供的关于服务相关的api。
参考:
https://www.consul.io/api/age...
https://www.consul.io/docs/ag...
文章以后会第一时间发于微信, 欢迎关注个人微信公众号,你们一块儿交流学习