運維小姐姐說這篇Consul叢集和ACL配置超給力(保姆級)

Code綜藝圈發表於2021-03-26

前言

上一篇簡單介紹了Consul,並使用開發模式(dev)進行流程演示,但在實際開發中需要考慮Consul的高可用和操作安全性,所以接著來聊聊叢集和ACL的相關配置,涉及到的命令會在環境搭建過程中詳細介紹。

正文

關於叢集,第一反應就是多搞幾臺機器(或者容器等),將其關聯在一塊,提供功能即可;在搭建叢集環境之前,需要對幾個角色進行熟悉,因為在Consul中,它們至關重要。見下圖(以一個資料中心為例):

image-20210320132943457

  • 資料中心(DataCenter):Consul執行的節點集連線在一起稱為資料中心;在資料中心中,各個Consul節點可以以伺服器(Server)或客戶端模式(Client)執行;為了保證可用性和高效能,通常一個資料中心內推薦3~5個伺服器(不超過5個),客戶端個數建議不要超過5000個(具體根據業務決定)。
  • 客戶端模式(Client):客戶端負責註冊服務、執行健康檢查並將相關RPC轉發給伺服器,相對來說是無狀態的。Client+LAN gossip協議組成了一個資料中心中的節點集,通訊效率高。
  • 伺服器模式(Server):伺服器包含客戶端的功能,每個Server還參與選舉,響應RPC查詢,轉發資訊給ServerLeader等;另外還負責維護Consul的叢集狀態(持久化):包括其他伺服器和客戶端的資訊、哪些服務可供發現、哪些服務允許相互通訊;每個Consul資料中心必須至少有一個伺服器
  • 伺服器領導者(Server Leader):除了包含Server的功能外,還負責同步資料到各個Server;每一個叢集中只能有一個ServerLeader,保證叢集內資料一致。

在整個叢集中是通過網路進行關聯,需要多個埠實現對應功能,如上圖;埠簡介:

image-20210320141456194

瞭解到Consul的架構及各個角色功能,接下來就是實操啦。

1. 搭建叢集

在這裡,就不搞那麼多機器了,兩臺搭叢集,一臺伺服器模式,一臺客戶端模式(電腦有限,不想搞那麼多虛擬機器),原理是一樣的,主要還是著重說說過程:

1.1 啟動一個Server(就一臺Server,那它肯定是Leader了)

這裡演示在啟動節點前,將配置檔案目錄和data建立好,如下:

image-20210320174907497

使用命令啟動:

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

啟動起來時包含一些節點資訊,如下:

image-20210320173149295

命令解析

  • agent:Consul的核心程式,每個節點都需要代理的形式執行;
  • -server:代表是Server模式,如果沒有-server就代表是Client模式;
  • -bootstrap-expect:在一個資料中心中期望的Server的節點個數,直到啟動Server個數達到設定的個數時,叢集才能起作用,並從中選舉出一個ServerLeader;
  • -bootstrap:手動指定Server為Leader;當Server個數大於0時,該引數不能和-bootstrap-expect一起使用(以上命令中沒有用到);
  • -datacenter:指定資料中心的名稱;
  • -config-dir:指定配置檔案目錄,這裡指定的是當前目錄下的config目錄,Consul會自動載入裡面所有Json格式的配置檔案(.json結尾);
  • -data-dir:指定節點執行時資料狀態儲存的路徑,這裡將其對應的資料儲存在當前資料夾下的data目錄中;
  • -node:指定節點的名稱,在叢集中必須是唯一的,預設是主機名;
  • -ui:使用預設UI介面,Consul提供一個UI專案,下載可以指定對應的目錄,使用-ui-dir 指定對應的UI目錄即可;
  • -rejoin:忽略之前的斷開,重新啟動時會嘗試加入叢集;
  • -bind:指定繫結的地址,該地址通常用來在叢集內部通訊,叢集內的所有節點地址都必須正常通訊;
  • -client:Consul服務監聽的地址,這個地址提供HTTP/DNS/RPC等服務,預設是127.0.0.1,所以外部不能訪問,UI通過IP地址也不能訪問;如果需要提供服務,將其指定為0.0.0.0即可。
  • -encrypt:指定一個祕鑰,在通訊時進行加密,這個祕鑰可以通過consul keygen生成,在同一個叢集中,各節點必須使用相同的祕鑰;

以上列舉常用的引數,還有一些不太常用的,小夥伴如果用到去官網上查查(偷偷告訴小夥伴,引數還可以統一放在配置檔案中哦)。

如果是多個Server,只需在每臺機器上執行以上命令即可,根據Server數量,修改bootstrap-expect後面的數量即可,然後再改改bind後面的地址即可。

1.2 啟動一個Client

啟動一個Client和Server幾乎一樣,只是不用指定Server引數,預設就是客戶端模式,命令如下:

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

這樣Client 就啟動起來了

image-20210320235618123

如果是多個Client,在各臺機器上執行以上命令即可,只是改改bind的地址即可。

1.3 將節點加入到叢集中

上面只是將各節點啟動,如果是Server節點,不是Leader的話,會一直提示找不到Leader;如果是Client節點,就會提示找不到對應的Server節點;因為一個叢集中至少得有一個Server,在Server中必須得要有且只有一個ServerLeader。所以節點啟動之後,下一步就是要將各節點加入到叢集中,通常的做法是在各個節點上執行以下命令:

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

執行命令之後,對應的節點就加入到叢集中了,可以通過UI看到節點:

image-20210321000630141

也可以通過命令檢視:

image-20210321000739204

最終這樣一個簡單叢集就搭建完成了,流程就是這樣,其餘的就是節點個數的問題。

2. ACL配置

Consul使用 Access Control Lists(ACL-訪問控制列表)來保護對UI、API、CLI、服務通訊和代理通訊的訪問;ACL的核心是將規則分組為策略,然後將一個或多個策略與令牌相關聯。

Consul使用token的形式進行安全控制訪問,這裡的token就是隨機的字串,有了token就有對應的操作許可權啦;就好比之前說到WebAPI介面加訪問控制一樣,通過一個授權token就可以訪問相關的介面資源。

配置ACL的前提是所有節點都需要將ACL啟用,然後還要一個bootstrap token,因為針對子許可權(策略)生成token的時候需要用到,就好比MySQL中的root使用者一樣,只有有了root許可權才能給其他使用者分配更多的許可權。接下就以UI的訪問和Services的控制進行ACL配置演示,其他基本上都一樣,重點就是規劃好策略規則。

首先在各節點啟動時將ACL啟用,在配置資料夾目錄中(這裡目錄名是config)增加acl.hcl檔案(每個節點都需要加),內容如下:

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

引數說明:

  • enabled=true 代表開啟ACL;
  • default_policy=“deny”預設為allow,如果需要自定義許可權,需要將其設定為deny;
  • enable_token_persistence =true開啟token持久化,將token持久化到磁碟上;

這裡需要注意一點,之前說配置目錄下的Json檔案會被自動載入,其實還有hcl檔案也會被自動載入,這裡用hcl的形式演示一下。 配置檔案準備好之後,重新啟動節點即可(叢集中的所有節點都需要用上),訪問UI試試,就會彈出如下介面:

image-20210322123052531

點選登入,需要輸入一個Token,如果是在配置檔案中配置,輸入配置的token即可,如果沒有配置,可以在執行時生成一個bootstrap token,在任意一個Server中執行consul acl bootstrap命令獲得該bootstrap token;Consul中token都很重要,需要儲存好。

image-20210322123426117

將生成的bootstrap token輸入在登入框中,然後就可以正常獲取資訊啦;

image-20210322123725996

bootstrap token許可權很大,不可能每個小夥伴都擁有,就像MySQL的root許可權一樣,只能有個別的人知道。其他使用者的許可權需單獨控制;Consul也是如此,針對不同許可權策略,生成對應的token,使用這個token就只能訪問或操作對應許可權範圍內的資源。

UI方式配置

ACL的配置其他token可以通過命令的形式,也可以通過UI介面的形式(因為現在有bootstrap token超級許可權),這裡通過UI的形式很方便的,三步走:

  • 建立策略:

    image-20210322132923632

    策略其他資訊基本上沒啥說的,主要是規則(Rules)的配置,通常主要針對節點(node)、服務(service)、鍵值對(K/V)進行配置,可以模糊指定,也可以具體指定,如下:

    node_prefix "":節點字首為空,代表所有的節點都使用策略;

    service_prefix "":服務字首為空,代表所有的服務都使用策略;

    service "Code6688Name":指定對應的服務使用策略;

    key_prefix "redis/":只對字首有"redis/"的key使用對應策略;

    key "dashboard-app":指定對應的key使用策略;

    以上指定策略的範圍是比較常用的方式,具體可以參照官網;

    規則中關於策略(policy)通常有以下幾種:

    read:只能查詢;

    write:可查可寫;

    deny:不能讀不能寫;

    其他細節可以參考ACL官方配置文件

  • 根據策略生成token:

    有了策略之後,接下來就要針對策略生成對應的token啦,如下:

    image-20210322134443553

    在對應彈出框中輸入對應的資訊即可,如下:

    image-20210322134848450

    儲存之後就生成對應的token,可以進入到詳細頁看到生成的token,直接將token給別人用即可。

    image-20210322135437509

  • 使用token:

    ui測試,直接將token發給其他小夥伴,登入時輸入即可,如果是其他操作,帶上token即可;對於自己介面測試,切換一下token就可以啦,如下:

    image-20210322135736693

    切換之後,介面中除了node能查出資訊,其他都不能使用,操作Key/Value,還報如下錯誤:

    image-20210322135909568

    在服務註冊或服務發現中使用該token,也不能註冊和查詢服務成功,如下:

    image-20210322140206071

    如果是用配置檔案進行服務註冊,在配置檔案中也要指定token,否則註冊服務不成功,如下:

    image-20210322141401332

    服務發現也是一個道理:

    image-20210322140520950

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

    image-20210322151431903

    命令方式

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

  • 編寫規則檔案;

    image-20210322145642624

  • 根據規則檔案生成策略;

    image-20210322150002783

  • 根據策略生成token;

    image-20210322150248490

  • 使用token;

    有了token就可以能幹對應許可權範圍的事了,具體使用就不介紹了,不管是UI、還是API查詢,小夥伴自己體驗一下吧(上面已經說到)。

注: 以上步驟中開啟ACL之後,沒有統一配置好超級管理員的boostrap token,所以每次操作都需要帶上-token引數。

總結

叢集再加ACL訪問控制配置就先說到這啦,文中更主要的是提供相關思路,並沒有把所有許可權配置方式舉例演示(比較多),剩下小夥伴自己嘗試吧;通過上一篇(來,Consul 服務發現入個門(一看就會的那種))的使用,再加上這篇的叢集環境和ACL配置思路介紹,小夥伴應該日常使用沒問題了吧;其餘的功能根據業務需要再去研究吧,我如果有對應的應用場景,依然會第一時間分享。下期聊聊閘道器吧~~~

感謝小夥伴點贊、轉發和評論
一個被程式搞醜的帥小夥,關注"Code綜藝圈",跟我一起學~~~

圖片

相關文章