運(yùn)維小姐姐說這篇Consul集群和ACL配置超給力(保姆級(jí))

前言

上一篇簡(jiǎn)單介紹了Consul单鹿,并使用開發(fā)模式(dev)進(jìn)行流程演示,但在實(shí)際開發(fā)中需要考慮Consul的高可用和操作安全性营密,所以接著來聊聊集群和ACL的相關(guān)配置澄步,涉及到的命令會(huì)在環(huán)境搭建過程中詳細(xì)介紹冰蘑。

正文

關(guān)于集群,第一反應(yīng)就是多搞幾臺(tái)機(jī)器(或者容器等)村缸,將其關(guān)聯(lián)在一塊祠肥,提供功能即可;在搭建集群環(huán)境之前梯皿,需要對(duì)幾個(gè)角色進(jìn)行熟悉仇箱,因?yàn)樵贑onsul中,它們至關(guān)重要东羹。見下圖(以一個(gè)數(shù)據(jù)中心為例):

image-20210320132943457
  • 數(shù)據(jù)中心(DataCenter):Consul運(yùn)行的節(jié)點(diǎn)集連接在一起稱為數(shù)據(jù)中心剂桥;在數(shù)據(jù)中心中,各個(gè)Consul節(jié)點(diǎn)可以以服務(wù)器(Server)或客戶端模式(Client)運(yùn)行属提;為了保證可用性和高性能权逗,通常一個(gè)數(shù)據(jù)中心內(nèi)推薦3~5個(gè)服務(wù)器(不超過5個(gè)),客戶端個(gè)數(shù)建議不要超過5000個(gè)(具體根據(jù)業(yè)務(wù)決定)垒拢。

  • 客戶端模式(Client):客戶端負(fù)責(zé)注冊(cè)服務(wù)旬迹、運(yùn)行健康檢查并將相關(guān)RPC轉(zhuǎn)發(fā)給服務(wù)器,相對(duì)來說是無狀態(tài)的求类。Client+LAN gossip協(xié)議組成了一個(gè)數(shù)據(jù)中心中的節(jié)點(diǎn)集奔垦,通信效率高。

  • 服務(wù)器模式(Server):服務(wù)器包含客戶端的功能尸疆,每個(gè)Server還參與選舉椿猎,響應(yīng)RPC查詢,轉(zhuǎn)發(fā)信息給ServerLeader等寿弱;另外還負(fù)責(zé)維護(hù)Consul的集群狀態(tài)(持久化):包括其他服務(wù)器和客戶端的信息犯眠、哪些服務(wù)可供發(fā)現(xiàn)、哪些服務(wù)允許相互通信症革;每個(gè)Consul數(shù)據(jù)中心必須至少有一個(gè)服務(wù)器筐咧。

  • 服務(wù)器領(lǐng)導(dǎo)者(Server Leader):除了包含Server的功能外,還負(fù)責(zé)同步數(shù)據(jù)到各個(gè)Server;每一個(gè)集群中只能有一個(gè)ServerLeader量蕊,保證集群內(nèi)數(shù)據(jù)一致铺罢。

在整個(gè)集群中是通過網(wǎng)絡(luò)進(jìn)行關(guān)聯(lián),需要多個(gè)端口實(shí)現(xiàn)對(duì)應(yīng)功能残炮,如上圖韭赘;端口簡(jiǎn)介:

image-20210320141456194

了解到Consul的架構(gòu)及各個(gè)角色功能,接下來就是實(shí)操啦势就。

1. 搭建集群

在這里泉瞻,就不搞那么多機(jī)器了,兩臺(tái)搭集群苞冯,一臺(tái)服務(wù)器模式袖牙,一臺(tái)客戶端模式(電腦有限,不想搞那么多虛擬機(jī))抱完,原理是一樣的贼陶,主要還是著重說說過程:

1.1 啟動(dòng)一個(gè)Server(就一臺(tái)Server,那它肯定是Leader了)

這里演示在啟動(dòng)節(jié)點(diǎn)前,將配置文件目錄和data創(chuàng)建好巧娱,如下:

image-20210320174907497

使用命令啟動(dòng):

consul agent -server -bootstrap-expect 1 -datacenter=dc_zoe -config-dir=./config -data-dir ./data -node=s1 -ui -rejoin -bind=192.168.1.6 -client 0.0.0.0 

啟動(dòng)起來時(shí)包含一些節(jié)點(diǎn)信息,如下:

image-20210320173149295

命令解析

  • agent:Consul的核心進(jìn)程烘贴,每個(gè)節(jié)點(diǎn)都需要代理的形式運(yùn)行禁添;

  • -server:代表是Server模式,如果沒有-server就代表是Client模式桨踪;

  • -bootstrap-expect:在一個(gè)數(shù)據(jù)中心中期望的Server的節(jié)點(diǎn)個(gè)數(shù)老翘,直到啟動(dòng)Server個(gè)數(shù)達(dá)到設(shè)置的個(gè)數(shù)時(shí),集群才能起作用锻离,并從中選舉出一個(gè)ServerLeader;

  • -bootstrap:手動(dòng)指定Server為L(zhǎng)eader铺峭;當(dāng)Server個(gè)數(shù)大于0時(shí),該參數(shù)不能和-bootstrap-expect一起使用(以上命令中沒有用到)汽纠;

  • -datacenter:指定數(shù)據(jù)中心的名稱卫键;

  • -config-dir:指定配置文件目錄,這里指定的是當(dāng)前目錄下的config目錄虱朵,Consul會(huì)自動(dòng)加載里面所有Json格式的配置文件(.json結(jié)尾)莉炉;

  • -data-dir:指定節(jié)點(diǎn)運(yùn)行時(shí)數(shù)據(jù)狀態(tài)保存的路徑,這里將其對(duì)應(yīng)的數(shù)據(jù)保存在當(dāng)前文件夾下的data目錄中碴犬;

  • -node:指定節(jié)點(diǎn)的名稱絮宁,在集群中必須是唯一的,默認(rèn)是主機(jī)名服协;

  • -ui:使用默認(rèn)UI界面绍昂,Consul提供一個(gè)UI項(xiàng)目,下載可以指定對(duì)應(yīng)的目錄,使用-ui-dir 指定對(duì)應(yīng)的UI目錄即可窘游;

  • -rejoin:忽略之前的斷開唠椭,重新啟動(dòng)時(shí)會(huì)嘗試加入集群;

  • -bind:指定綁定的地址张峰,該地址通常用來在集群內(nèi)部通訊泪蔫,集群內(nèi)的所有節(jié)點(diǎn)地址都必須正常通訊;

  • -client:Consul服務(wù)監(jiān)聽的地址喘批,這個(gè)地址提供HTTP/DNS/RPC等服務(wù)撩荣,默認(rèn)是127.0.0.1,所以外部不能訪問饶深,UI通過IP地址也不能訪問餐曹;如果需要提供服務(wù),將其指定為0.0.0.0即可敌厘。

  • -encrypt:指定一個(gè)秘鑰台猴,在通訊時(shí)進(jìn)行加密,這個(gè)秘鑰可以通過consul keygen生成俱两,在同一個(gè)集群中饱狂,各節(jié)點(diǎn)必須使用相同的秘鑰;

以上列舉常用的參數(shù)宪彩,還有一些不太常用的休讳,小伙伴如果用到去官網(wǎng)上查查(偷偷告訴小伙伴,參數(shù)還可以統(tǒng)一放在配置文件中哦)尿孔。

如果是多個(gè)Server俊柔,只需在每臺(tái)機(jī)器上執(zhí)行以上命令即可,根據(jù)Server數(shù)量活合,修改bootstrap-expect后面的數(shù)量即可雏婶,然后再改改bind后面的地址即可。

1.2 啟動(dòng)一個(gè)Client

啟動(dòng)一個(gè)Client和Server幾乎一樣白指,只是不用指定Server參數(shù)留晚,默認(rèn)就是客戶端模式,命令如下:

 consul agent -datacenter=dc_zoe -config-dir=./config -data-dir ./data -node=c1 -bind=192.168.1.8 -client 0.0.0.0

這樣Client 就啟動(dòng)起來了

image-20210320235618123

如果是多個(gè)Client侵续,在各臺(tái)機(jī)器上執(zhí)行以上命令即可倔丈,只是改改bind的地址即可。

1.3 將節(jié)點(diǎn)加入到集群中

上面只是將各節(jié)點(diǎn)啟動(dòng)状蜗,如果是Server節(jié)點(diǎn)需五,不是Leader的話,會(huì)一直提示找不到Leader轧坎;如果是Client節(jié)點(diǎn)宏邮,就會(huì)提示找不到對(duì)應(yīng)的Server節(jié)點(diǎn);因?yàn)橐粋€(gè)集群中至少得有一個(gè)Server,在Server中必須得要有且只有一個(gè)ServerLeader蜜氨。所以節(jié)點(diǎn)啟動(dòng)之后械筛,下一步就是要將各節(jié)點(diǎn)加入到集群中,通常的做法是在各個(gè)節(jié)點(diǎn)上執(zhí)行以下命令:

 consul join 192.168.1.6 # 通常后面跟的地址是ServerLeader的地址

執(zhí)行命令之后飒炎,對(duì)應(yīng)的節(jié)點(diǎn)就加入到集群中了埋哟,可以通過UI看到節(jié)點(diǎn):

image-20210321000630141

也可以通過命令查看:

image-20210321000739204

最終這樣一個(gè)簡(jiǎn)單集群就搭建完成了,流程就是這樣郎汪,其余的就是節(jié)點(diǎn)個(gè)數(shù)的問題赤赊。

2. ACL配置

Consul使用 Access Control Lists(ACL-訪問控制列表)來保護(hù)對(duì)UI、API煞赢、CLI抛计、服務(wù)通信和代理通信的訪問;ACL的核心是將規(guī)則分組為策略照筑,然后將一個(gè)或多個(gè)策略與令牌相關(guān)聯(lián)吹截。

Consul使用token的形式進(jìn)行安全控制訪問,這里的token就是隨機(jī)的字符串凝危,有了token就有對(duì)應(yīng)的操作權(quán)限啦波俄;就好比之前說到WebAPI接口加訪問控制一樣,通過一個(gè)授權(quán)token就可以訪問相關(guān)的接口資源蛾默。

配置ACL的前提是所有節(jié)點(diǎn)都需要將ACL啟用弟断,然后還要一個(gè)bootstrap token,因?yàn)獒槍?duì)子權(quán)限(策略)生成token的時(shí)候需要用到趴生,就好比MySQL中的root用戶一樣,只有有了root權(quán)限才能給其他用戶分配更多的權(quán)限昏翰。接下就以UI的訪問和Services的控制進(jìn)行ACL配置演示苍匆,其他基本上都一樣,重點(diǎn)就是規(guī)劃好策略規(guī)則棚菊。

首先在各節(jié)點(diǎn)啟動(dòng)時(shí)將ACL啟用浸踩,在配置文件夾目錄中(這里目錄名是config)增加acl.hcl文件(每個(gè)節(jié)點(diǎn)都需要加),內(nèi)容如下:

acl = {
  enabled = true
  default_policy = "deny"
  enable_token_persistence = true 
 }

參數(shù)說明:

  • enabled=true 代表開啟ACL统求;

  • default_policy=“deny”默認(rèn)為allow检碗,如果需要自定義權(quán)限,需要將其設(shè)置為deny码邻;

  • enable_token_persistence =true開啟token持久化折剃,將token持久化到磁盤上;

這里需要注意一點(diǎn)像屋,之前說配置目錄下的Json文件會(huì)被自動(dòng)加載怕犁,其實(shí)還有hcl文件也會(huì)被自動(dòng)加載,這里用hcl的形式演示一下奏甫。 配置文件準(zhǔn)備好之后阵子,重新啟動(dòng)節(jié)點(diǎn)即可(集群中的所有節(jié)點(diǎn)都需要用上),訪問UI試試色乾,就會(huì)彈出如下界面:

image-20210322123052531

點(diǎn)擊登錄杈湾,需要輸入一個(gè)Token漆撞,如果是在配置文件中配置于宙,輸入配置的token即可,如果沒有配置至会,可以在運(yùn)行時(shí)生成一個(gè)bootstrap token奉件,在任意一個(gè)Server中執(zhí)行consul acl bootstrap命令獲得該bootstrap token县貌;Consul中token都很重要凑懂,需要保存好。

image-20210322123426117

將生成的bootstrap token輸入在登錄框中摆碉,然后就可以正常獲取信息啦巷帝;

image-20210322123725996

bootstrap token權(quán)限很大锅睛,不可能每個(gè)小伙伴都擁有,就像MySQL的root權(quán)限一樣辣垒,只能有個(gè)別的人知道印蔬。其他用戶的權(quán)限需單獨(dú)控制侥猬;Consul也是如此,針對(duì)不同權(quán)限策略退唠,生成對(duì)應(yīng)的token鹃锈,使用這個(gè)token就只能訪問或操作對(duì)應(yīng)權(quán)限范圍內(nèi)的資源。

UI方式配置

ACL的配置其他token可以通過命令的形式瞧预,也可以通過UI界面的形式(因?yàn)楝F(xiàn)在有bootstrap token超級(jí)權(quán)限)屎债,這里通過UI的形式很方便的,三步走:

  • 創(chuàng)建策略:

    image-20210322132923632

    策略其他信息基本上沒啥說的垢油,主要是規(guī)則(Rules)的配置盆驹,通常主要針對(duì)節(jié)點(diǎn)(node)、服務(wù)(service)躯喇、鍵值對(duì)(K/V)進(jìn)行配置,可以模糊指定廉丽,也可以具體指定雅倒,如下:

    node_prefix "":節(jié)點(diǎn)前綴為空,代表所有的節(jié)點(diǎn)都使用策略弧可;

    service_prefix "":服務(wù)前綴為空棕诵,代表所有的服務(wù)都使用策略;

    service "Code6688Name":指定對(duì)應(yīng)的服務(wù)使用策略凿将;

    key_prefix "redis/":只對(duì)前綴有"redis/"的key使用對(duì)應(yīng)策略校套;

    key "dashboard-app":指定對(duì)應(yīng)的key使用策略;

    以上指定策略的范圍是比較常用的方式牧抵,具體可以參照官網(wǎng)笛匙;

    規(guī)則中關(guān)于策略(policy)通常有以下幾種:

    read:只能查詢侨把;

    write:可查可寫;

    deny:不能讀不能寫妹孙;

    其他細(xì)節(jié)可以參考ACL官方配置文檔秋柄。

  • 根據(jù)策略生成token:

    有了策略之后,接下來就要針對(duì)策略生成對(duì)應(yīng)的token啦蠢正,如下:

    image-20210322134443553

    在對(duì)應(yīng)彈出框中輸入對(duì)應(yīng)的信息即可骇笔,如下:

    image-20210322134848450

    保存之后就生成對(duì)應(yīng)的token,可以進(jìn)入到詳細(xì)頁看到生成的token嚣崭,直接將token給別人用即可。

    image-20210322135437509
  • 使用token:

    ui測(cè)試说榆,直接將token發(fā)給其他小伙伴荠卷,登錄時(shí)輸入即可,如果是其他操作慎冤,帶上token即可;對(duì)于自己界面測(cè)試撬即,切換一下token就可以啦粒竖,如下:

    image-20210322135736693

    切換之后岁歉,界面中除了node能查出信息,其他都不能使用,操作Key/Value,還報(bào)如下錯(cuò)誤:

    image-20210322135909568

    在服務(wù)注冊(cè)或服務(wù)發(fā)現(xiàn)中使用該token猴伶,也不能注冊(cè)和查詢服務(wù)成功塌西,如下:

    image-20210322140206071

    如果是用配置文件進(jìn)行服務(wù)注冊(cè)他挎,在配置文件中也要指定token,否則注冊(cè)服務(wù)不成功捡需,如下:

    image-20210322141401332

    服務(wù)發(fā)現(xiàn)也是一個(gè)道理:

    image-20210322140520950

    直接使用HTTP API也是一樣需要帶上token:

    image-20210322151431903
    命令方式

UI配置的這種形式是不是夠直接办桨,命令的方式我就不演示的了吧,步驟的一樣站辉,只是全靠命令即可,如下:

  • 編寫規(guī)則文件狸相;

    image-20210322145642624
  • 根據(jù)規(guī)則文件生成策略捐川;

    image-20210322150002783
  • 根據(jù)策略生成token;

    image-20210322150248490
  • 使用token;

    有了token就可以能干對(duì)應(yīng)權(quán)限范圍的事了逸尖,具體使用就不介紹了古沥,不管是UI瘸右、還是API查詢,小伙伴自己體驗(yàn)一下吧(上面已經(jīng)說到)岩齿。

注: 以上步驟中開啟ACL之后太颤,沒有統(tǒng)一配置好超級(jí)管理員的boostrap token,所以每次操作都需要帶上-token參數(shù)盹沈。

總結(jié)

集群再加ACL訪問控制配置就先說到這啦龄章,文中更主要的是提供相關(guān)思路,并沒有把所有權(quán)限配置方式舉例演示(比較多)乞封,剩下小伙伴自己嘗試吧做裙;通過上一篇(來,Consul 服務(wù)發(fā)現(xiàn)入個(gè)門(一看就會(huì)的那種))的使用肃晚,再加上這篇的集群環(huán)境和ACL配置思路介紹锚贱,小伙伴應(yīng)該日常使用沒問題了吧;其余的功能根據(jù)業(yè)務(wù)需要再去研究吧关串,我如果有對(duì)應(yīng)的應(yīng)用場(chǎng)景拧廊,依然會(huì)第一時(shí)間分享。下期聊聊網(wǎng)關(guān)吧~~~

感謝小伙伴的:點(diǎn)贊晋修、收藏和評(píng)論吧碾,下期繼續(xù)~~~
一個(gè)被程序搞丑的帥小伙,關(guān)注"Code綜藝圈"墓卦,跟我一起學(xué)~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末倦春,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子趴拧,更是在濱河造成了極大的恐慌溅漾,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件著榴,死亡現(xiàn)場(chǎng)離奇詭異添履,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)脑又,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門暮胧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人问麸,你說我怎么就攤上這事往衷。” “怎么了严卖?”我有些...
    開封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵席舍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我哮笆,道長(zhǎng)来颤,這世上最難降的妖魔是什么汰扭? 我笑而不...
    開封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮福铅,結(jié)果婚禮上萝毛,老公的妹妹穿的比我還像新娘。我一直安慰自己滑黔,他們只是感情好笆包,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著略荡,像睡著了一般庵佣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上撞芍,一...
    開封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天秧了,我揣著相機(jī)與錄音,去河邊找鬼序无。 笑死验毡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的帝嗡。 我是一名探鬼主播晶通,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼哟玷!你這毒婦竟也來了狮辽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤巢寡,失蹤者是張志新(化名)和其女友劉穎喉脖,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抑月,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡树叽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谦絮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片题诵。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖层皱,靈堂內(nèi)的尸體忽然破棺而出性锭,到底是詐尸還是另有隱情,我是刑警寧澤叫胖,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布草冈,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏怎棱。R本人自食惡果不足惜方淤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蹄殃。 院中可真熱鬧,春花似錦你踩、人聲如沸诅岩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吩谦。三九已至,卻和暖如春膝藕,著一層夾襖步出監(jiān)牢的瞬間式廷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工芭挽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滑废,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓袜爪,卻偏偏與公主長(zhǎng)得像蠕趁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辛馆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容