在上一篇文章裏面,咱們講了如何搭建帶有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...
文章以後會第一時間發於微信, 歡迎關注個人微信公衆號,你們一塊兒交流學習