在上一篇文章里面,我們講了如何搭建帶有Acl控制的Consul集群。
這一篇文章主要講述一下上一篇文章那一大串配置文件的含義。
1.配置說(shuō)明
1.1 勘誤
上一篇文章關(guān)于機(jī)器規(guī)劃方面肠仪,consul client agent的端口寫的有誤。這里再貼一下正確的機(jī)器規(guī)劃备典。
1.2 我們先來(lái)看一下consul server agent的配置异旧。
上一節(jié)中,提供了三個(gè)配置文件提佣,consul-server1.json, consul-server2.json以及consul-server3.json吮蛹。
其中consul-server1.json參數(shù)最多,這里就以它來(lái)說(shuō)明各個(gè)配置的含義:
{
"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"
}
}
}
- datacenter 此標(biāo)志表示代理運(yùn)行的數(shù)據(jù)中心拌屏。如果未提供潮针,則默認(rèn)為“dc1”。 Consul擁有對(duì)多個(gè)數(shù)據(jù)中心的一流支持倚喂,但它依賴于正確的配置每篷。同一數(shù)據(jù)中心中的節(jié)點(diǎn)應(yīng)在同一個(gè)局域網(wǎng)內(nèi)。
- primary_datacenter: 這指定了對(duì)ACL信息具有權(quán)威性的數(shù)據(jù)中心端圈。必須提供它才能啟用ACL焦读。
- bootstrap_expect: Consul將等待指定數(shù)量的服務(wù)器可用,然后才會(huì)引導(dǎo)群集舱权。這允許自動(dòng)選擇初始領(lǐng)導(dǎo)者矗晃。
- start_join: 一個(gè)字符串?dāng)?shù)組,指定是其他的consul server agent的地址宴倍。這里這樣配置张症,會(huì)在啟動(dòng)時(shí),嘗試將consul-server2鸵贬,consul-server3這兩個(gè)節(jié)點(diǎn)加進(jìn)來(lái)俗他,形成一個(gè)集群。
- retry_join: 允許start_join時(shí)失敗時(shí)恭理,繼續(xù)重新連接拯辙。重試的時(shí)間間隔,可以用retry_interval設(shè)置颜价,默認(rèn)是30s;重試的最大次數(shù)涯保,可以用retry_max設(shè)置,默認(rèn)是0周伦,也就是無(wú)限次重試夕春。關(guān)于retry_interval和retry_max,這里都是用的默認(rèn)值专挪。
- bind_addr: 內(nèi)部群集通信綁定的地址及志。這是群集中所有其他節(jié)點(diǎn)都應(yīng)該可以訪問的IP地址片排。默認(rèn)情況下,這是“0.0.0.0”速侈,這意味著Consul將綁定到本地計(jì)算機(jī)上的所有地址率寡,并將第一個(gè)可用的私有IPv4地址通告給群集的其余部分。如果有多個(gè)私有IPv4地址可用倚搬,Consul將在啟動(dòng)時(shí)退出并顯示錯(cuò)誤冶共。如果指定“[::]”,Consul將通告第一個(gè)可用的公共IPv6地址每界。如果有多個(gè)可用的公共IPv6地址捅僵,Consul將在啟動(dòng)時(shí)退出并顯示錯(cuò)誤。 Consul同時(shí)使用TCP和UDP眨层,并且兩者使用相同的端口庙楚。如果您有防火墻,請(qǐng)務(wù)必同時(shí)允許這兩種協(xié)議趴樱。
- advertise_addr: 更改我們向群集中其他節(jié)點(diǎn)通告的地址馒闷。默認(rèn)情況下,會(huì)使用-bind參數(shù)指定的地址.
- server: 是否是server agent節(jié)點(diǎn)叁征。
- connect.enabled: 是否啟動(dòng)Consul Connect窜司,這里是啟用的。
- node_name:節(jié)點(diǎn)名稱航揉。
- data_dir: agent存儲(chǔ)狀態(tài)的目錄。
- enable_script_checks: 是否在此代理上啟用執(zhí)行腳本的健康檢查金刁。有安全漏洞帅涂,默認(rèn)值就是false,這里單獨(dú)提示下尤蛮。
- enable_local_script_checks: 與enable_script_checks類似媳友,但只有在本地配置文件中定義它們時(shí)才啟用它們。仍然不允許在HTTP API注冊(cè)中定義的腳本檢查产捞。
- log-file: 將所有Consul Agent日志消息重定向到文件醇锚。這里指定的是/opt/consul/log/目錄。
- log_rotate_bytes:指定在需要輪換之前應(yīng)寫入日志的字節(jié)數(shù)坯临。除非指定焊唬,否則可以寫入日志文件的字節(jié)數(shù)沒有限制
- log_rotate_duration:指定在需要旋轉(zhuǎn)日志之前應(yīng)寫入日志的最長(zhǎng)持續(xù)時(shí)間。除非另有說(shuō)明看靠,否則日志會(huì)每天輪換(24小時(shí)赶促。單位可以是"ns", "us" (or "μs"), "ms", "s", "m", "h", 比如設(shè)置值為24h
- encrypt:用于加密Consul Gossip 協(xié)議交換的數(shù)據(jù)挟炬。在啟動(dòng)各個(gè)server之前鸥滨,配置成同一個(gè)UUID值就行嗦哆,或者你用命令行consul keygen 命令來(lái)生成也可以。
- acl.enabled: 是否啟用acl.
- acl.default_policy: “allow”或“deny”; 默認(rèn)為“allow”婿滓,但這將在未來(lái)的主要版本中更改老速。當(dāng)沒有匹配規(guī)則時(shí),默認(rèn)策略控制令牌的行為凸主。在“allow”模式下橘券,ACL是黑名單:允許任何未明確禁止的操作。在“deny”模式下秕铛,ACL是白名單:阻止任何未明確允許的操作.
- acl.enable_token_persistence: 可能值為true或者false约郁。值為true時(shí),API使用的令牌集合將被保存到磁盤但两,并且當(dāng)代理重新啟動(dòng)時(shí)會(huì)重新加載鬓梅。
- acl.tokens.master: 具有全局管理的權(quán)限,也就是最大的權(quán)限谨湘。它允許操作員使用眾所周知的令牌密鑰ID來(lái)引導(dǎo)ACL系統(tǒng)绽快。需要在所有的server agent上設(shè)置同一個(gè)值,可以設(shè)置為一個(gè)隨機(jī)的UUID紧阔。這個(gè)值權(quán)限最大坊罢,注意保管好。
- acl.tokens.agent: 用于客戶端和服務(wù)器執(zhí)行內(nèi)部操作.比如catalog api的更新擅耽,反熵同步等活孩。
1.3 再來(lái)說(shuō)下consul-client1的相關(guān)配置。
我再貼一下配置信息乖仇。
{
"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的地址。
另外還沒有提過(guò)的配置就是client_addr乃沙, ui, ports.http .
下面依次說(shuō)明:
- client_addr: Consul將綁定客戶端接口的地址起趾,包括HTTP和DNS服務(wù)器
- ui: 啟用內(nèi)置Web UI服務(wù)器和對(duì)應(yīng)所需的HTTP路由
- ports.http: 更改默認(rèn)的http端口。
2. ACL Token的用法
2.1 ACL Token 有什么用呢警儒?
可以有人會(huì)說(shuō)训裆,你上面讓我又是搭建環(huán)境,又是看配置說(shuō)明蜀铲,我建好了一個(gè)這么一個(gè)帶ACL控制的Consul集群有什么用呢边琉?
ACL 全稱 Access Control List,也就是訪問控制列表的意思蝙茶,現(xiàn)在我們生成了帶有ACL控制的集群艺骂,就意味不是誰(shuí)都能來(lái)向我注冊(cè)的,也不是誰(shuí)都能像我獲取服務(wù)列表-- 也就是你想對(duì)Consul執(zhí)行任何操作隆夯,你得對(duì)應(yīng)的令牌钳恕,也就是ACL Token别伏。
2.2 不帶Token行不行?
為了模擬一般的Http請(qǐng)求忧额,我這里下載一個(gè)Postman, 是的這里沒有用命令行curl厘肮。
我們現(xiàn)在postman輸入
http://127.0.0.1:7110/v1/catalog/nodes
會(huì)發(fā)現(xiàn)一個(gè)節(jié)點(diǎn)都拿不到:
此時(shí)如果加上master token, 也就是訪問
http://127.0.0.1:7110/v1/catalog/nodes?token=cd76a0f7-5535-40cc-8696-073462acc6c7
會(huì)發(fā)現(xiàn)可以拿到所有節(jié)點(diǎn)的數(shù)據(jù)(下圖只截取一部分)
2.3 不帶token是不行,那能不能帶權(quán)限小點(diǎn)的token呢睦番?
前面說(shuō)過(guò)master token是權(quán)限最大的token类茂,假如這樣給出去,各個(gè)部分都拿來(lái)用托嚣。如果兩個(gè)不同的部分注冊(cè)名稱一樣的服務(wù)該怎么辦巩检,取消注冊(cè)了其他部門的服務(wù)又該怎么辦∈酒簦總之兢哭,權(quán)限能不能給小點(diǎn),答案是可以的夫嗓。
首先說(shuō)一下目標(biāo):
1.不同部門的服務(wù)必須要有自己的前綴迟螺,比如deptA表示部門A,比如deptB表示部門B
2.不同部門只能更改自己的服務(wù)舍咖。
2.3.1 先給兩個(gè)部門各注冊(cè)一個(gè)服務(wù)
注冊(cè)服務(wù)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"
}
}
在截個(gè)圖,當(dāng)返回status為200時(shí)排霉,表示成功注冊(cè)
此時(shí)可以在consul web ui中進(jìn)行查看窍株,打開consul-client1所在的機(jī)器,在瀏覽器中攻柠,輸入http://127.0.0.1:7110/ui/dc1/services夹姥,( 注意在此之前你需要先設(shè)置consul web ui的token,上一篇文章末尾已經(jīng)提及)辙诞,此時(shí)會(huì)看到
類似地,在注冊(cè)個(gè)deptA-pingMe1的服務(wù)
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"
}
}
2.3.2. 生成兩個(gè)token轻抱,讓部門A飞涂,B各自管理自己的服務(wù)
首先我們來(lái)生成部門A的policy, 意思度所有節(jié)點(diǎn)具有寫權(quán)限(寫權(quán)限包括讀)祈搜,并且只能寫deptA開頭的服務(wù)较店。
2.3.2.1先生成部門A的token
node_prefix "" {
policy = "write"
}
service_prefix "deptA"{
policy = "write"
}
下面是具體的生成過(guò)程
1.新建policy并保存
2.生成token
3.查看token列表,并點(diǎn)擊deptA-policy那一項(xiàng)查看并復(fù)制token
2.3.2. 2.在生成部門B的token
只需要把policy稍作修改就可以容燕,其他部門和部門A的類似梁呈,這里就不貼圖了。
node_prefix "" {
policy = "write"
}
service_prefix "deptB"{
policy = "write"
}
2.3.用不同的token來(lái)獲取服務(wù)列表
最后我們拿到部門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測(cè)試一下官卡,看看不同token返回的服務(wù)列表
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
可以發(fā)現(xiàn)deptA-token只能看到部門A的服務(wù)蝗茁,deptB-token只能看到部門B的服務(wù),master-token可以看到所以的寻咒。
另外取消注冊(cè)哮翘,注冊(cè)之類的驗(yàn)證大家可以自己試試,都與上面的方式差不多毛秘,只不過(guò)要使用不同的Http API
饭寺,https://www.consul.io/api/agent/service.html,在這個(gè)地址你可以看到consul 提供的關(guān)于服務(wù)相關(guān)的api叫挟。
參考:
https://www.consul.io/api/agent/service.html
https://www.consul.io/docs/agent/options.html