天天看點

Consul叢集部署

Consul介紹

Consul 是 HashiCorp 公司推出的開源工具,用于實作分布式系統的服務發現與配置。Consul 是分布式的、高可用的、可橫向擴充的。

官網:https://www.consul.io,最新版本:1.8.3

  • 概念:
Agent:是在 Consul 叢集的每個成員上長期運作的守護程序,通過指令 consul agent 啟動運作。由于所有節點都必須運作一個 Agent,是以 Agent 可以分為 client 或 Server。
       所有的 Agent 都可以運作DNS或HTTP接口,并負責運作監測和保持服務同步

Client:是将所有RPC轉發到 Server 的 Agent。Client 是相對無狀态的,Client 唯一執行的背景活動是加入 LAN gossip 池。這隻有最小的資源開銷,且隻消耗少量的網絡帶寬

Server:是一個有一組擴充功能的 Agent,這些功能包括參與 Raft 選舉、維護叢集狀态、響應RPC查詢、與其他資料中心互動 WAN gossip 和轉發查詢給 leader 或遠端的資料中心

Datacenter:是一個私有的、低延遲和高帶寬的網絡環境。這不包括通過公網的通信,但就目的而言,單個 EC2 中的多個可用區域被視為資料中心的一部分

Consensus:一緻性。Consul 使用 Consensus 協定(具體由 Raft 算法實作)來提供一緻性(由 CAP 定義),表明 leader 選舉和事務的順序達成一緻

Gossip:Consul 使用 Gossip 協定來管理成員資格并向叢集廣播消息。Serf 提供了完整的 Gossip 協定,可用于多種目的,而 Consul 建立在 Serf 之上。
        Gossip 涉及節點到節點的随機通信,主要是通過UDP。Gossip 協定也被稱為 Epidemic 協定(流行病協定)

LAN Gossip:指包含所有位于同一區域網路或資料中心的節點的 LAN gossip 池

WAN Gossip:指僅包含 Server 的 WAN gossip 池。這些 Server 主要分布在不同的資料中心,通常通過Internet或者廣域網進行通信

RPC:遠端過程調用。一種 請求/響應 機制,允許 Client 向 Server 發起請求      
  • 架構圖:
Consul叢集部署

可以看到有兩個資料中心,每個資料中心中都有 Client 和 Server。Server的數量建議是 3 或 5 台,這能平衡故障情況下的可用性和叢集性能。Server 數量越多,達成一緻性也會越慢,但是 Client 的數量沒有限制。

其次,資料中心中的所有 Agent 都加入 gossip 協定,這意味着存在一個給定資料中心的所有 Agent 的 gossip 池。這樣做有幾個目的:

1. 不需要為 Client 配置 Server 位址,發現是自動完成的;

2. 檢測 Agent 故障的工作不是放在 Server 上、而是分布式的,這使得故障檢測更具可伸縮性;

3. 它被用作一個消息層,已通知何時發生重要事件(例如 leader 選舉)      

每個資料中心的 Server 都是單個 Raft 對等集的一部分,這意味着它們将共同選舉出一個 leader,leader 負責處理所有查詢和事務。作為 consensus 協定的一部分,事務必須複制到所有對等方。由于這一需求,當 非 leader Server 收到RPC請求時,它将轉發給 leader Server。

Server 還作為 WAN gossip 池的一部分運作。WAN gossip 池與 LAN gossip 池不同,因為它針對Internet更高的延遲進行了優化,并且僅包含其他 Consul Server。WAN gossip 池的目的是允許資料中心以一種低接觸的方式發現彼此,線上連接配接新的資料中心就像加入現有的 WAN gossip 池一樣簡單。由于 Server 都在 WAN gossip 池中運作,是以它還支援跨資料中心請求。Server 收到其他資料中心的請求時,會将其轉發到正确的資料中心的随機 Server,然後該 Server 可以轉發給本地的 leader。這就讓資料中心之間的耦合非常低,由于故障檢測、連接配接緩存和多路複用,跨資料中心的請求相對較快且可靠。

通常,不會在不同的 Consul 資料中心之間複制資料。當請求另一個資料中心的資源時,本地 Consul Server 将RPC請求轉發到該資源的遠端 Consul Server 并傳回結果。如果遠端資料中心不可用,那麼這些資源也将不可用,但這不會影響本地資料中心。在某些特殊情況下,可以複制有限的資料子集,例如使用 Consul 内置的 ACL複制 功能,或使用諸如 consul-replicate 之類的外部工具。

  • 特點:
多資料中心: Consul 支援任意數量的資料中心,而不需要複雜的配置

服務網格/服務細分:Consul Connect通過自動TLS加密和基于身份的授權來實作安全的服務間通信。
                 應用程式可以在服務網格配置中使用sidecar代理來為入站和出站連接配接建立TLS連接配接,而根本不知道Connect

服務發現: Consul 使服務易于注冊自己,并通過DNS或HTTP接口發現其他服務。諸如SaaS提供程式之類的外部服務也可以注冊

運作狀态檢測: Consul 提供了健康檢查的機制,與服務發現的內建可防止将流量路由到不正常的主機,并啟用服務級别的斷路器

Key/Value 存儲: 靈活的kv存儲可以實作動态配置、功能标記、leader選舉等,簡單的HTTP API使它可以在任何地方輕松使用      
  • 端口:

Consul最多需要6個不同的端口才能正常工作,某些端口需要使用TCP、UDP或同時使用這兩種協定。

DNS:DNS server(TCP和UDP)     8600
HTTP:HTTP API(僅TCP)         8500
HTTPS:HTTPs API        disabled(8501)*
gRPC:gRPC API          disabled(8502)*
LAN Serf:Serf LAN 端口(TCP和UDP)         8301
Wan Serf:Serf WAN 端口(TCP和UDP)         8302
server:server RPC 位址(僅TCP)            8300
Sidecar Proxy Min:包含的最小端口号,用于自動配置設定的sidecar服務注冊      21000
Sidecar Proxy Max:包含的最大端口号,用于自動配置設定的sidecar服務注冊      21255      

對于

HTTPS

gRPC

,表中指定的端口為推薦值。

環境準備

  • 主機說明:
系統 ip 角色
CentOS 7.8 192.168.30.128 Server
192.168.30.129
192.168.30.130
192.168.30.131 Client
  • 全部關閉防火牆和selinux:
systemctl stop firewalld && systemctl disable firewalldsed -i 's/=enforcing/=disabled/g' /etc/selinux/config  && setenforce 0      

Consul安裝

  • 安裝consul:
mkdir /software && cd /softwarewget https://releases.hashicorp.com/consul/1.8.3/consul_1.8.3_linux_amd64.zip

unzip consul_1.8.3_linux_amd64.zipmv consul /usr/local/bin/

consul version

Consul v1.8.3
Revision a9322b9c7
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)      
consul -autocomplete-install                #指令補全      

然後打開新的視窗即可。

  • 指令參數:
acl            與 Consul 的ACL進行互動
agent          運作一個 Consul agent
catalog        與 Consul 的目錄進行互動
config         與 Consul 的配置進行互動
connect        與 Consul 的Connect子系統進行互動
debug          記錄 Consul operators 的調試歸檔
event          觸發一個新事件exec           在 Consul 節點上執行指令
force-leave    強制一個叢集成員進入離開狀态,一般用來強制删除發生故障或已關閉且沒有正常離開的節點
info           對 Consul operators 提供調試的資訊
intention      與通過Connect對服務的通路控制互動join           将 Consul agent 加入叢集
keygen         生成新的加密密鑰
keyring        檢查和修改 gossip 池中使用的加密密鑰
kv             與 k/v 存儲進行互動
leave          Consul agent 正常離開叢集并關閉
lock           在 k/v 存儲中的給定字首處建立一個鎖
login          使用所請求的auth方法将提供的第三方憑據交換為新建立的 Consul ACL令牌logout         銷毀從 consul login 指令中建立的 Consul 令牌
maint          提供對節點或服務的維護模式的控制
members        列出 Consul 叢集的所有成員
monitor        用于連接配接并追蹤正在運作的 Consul agent 的日志
operator       為 Consul operators 提供叢集級别的工具
reload         觸發 agent 配置檔案的重載
rtt            估計兩個節點之間的網絡往返時間
services       與注冊的服務進行互動
snapshot       儲存、還原和檢查 Consul Server 狀态以進行災難恢複
tls            内置幫助建立Consul TLS的CA和證書
validate       對 Consul 的配置檔案或目錄執行完整性測試
version        顯示 Consul 版本資訊watch          監視 Consul 特定資料視圖(節點清單,服務成員,k/v等)中的更改      
  • 運作Agent:

Agent 可以運作為 Server 或 Client 模式,每個資料中心至少有一個 Server。一個叢集中建議有3個或5個 Server,單個 Server 在出現故障時會不可避免的造成資料丢失。

Client是一個非常輕量級的程序,用于注冊服務、健康檢查和轉發對 Server 的查詢。Agent 必須在叢集中的每個節點上運作。

consul agent -dev               #開發模式      

新開一個視窗,

consul members              #檢視叢集成員Node    Address         Status  Type    Build  Protocol  DC   Segment
master  127.0.0.1:8301  alive   server  1.8.3  2         dc1  <all>      

可以看到目前節點名稱、運作的位址、健康狀态以及叢集角色等資訊,添加

-detailed

可以看到額外的資訊。

分别使用HTTP和DNS接口檢視資訊:

curl localhost:8500/v1/catalog/nodes                #HTTP API檢視[
    {
        "ID": "f134d82f-1c59-50be-8437-8feb9c1a9351",        "Node": "master",        "Address": "127.0.0.1",        "Datacenter": "dc1",        "TaggedAddresses": {
            "lan": "127.0.0.1",            "lan_ipv4": "127.0.0.1",            "wan": "127.0.0.1",            "wan_ipv4": "127.0.0.1"
        },        "Meta": {
            "consul-network-segment": ""
        },        "CreateIndex": 10,        "ModifyIndex": 12    }]yum install -y bind-utilsdig @127.0.0.1 -p 8600 master.node.consul               #DNS接口檢視;; QUESTION SECTION:;master.node.consul.		IN	A;; ANSWER SECTION:
master.node.consul.	0	IN	A	127.0.0.1      
  • 停止Agent:
consul leave -http-addr=127.0.0.1:8500              #正常退出consul force-leave -http-addr=127.0.0.1:8500                #強制退出      
  • 注冊服務:
mkdir -p /consul/configecho '{"service": {"name": "nginx", "tags": ["web"], "port": 80}}' | sudo tee /consul/config/nginx.json

consul agent -dev -config-dir=/consul/config      

通過HTTP API和DNS接口檢視,

curl http://localhost:8500/v1/catalog/service/nginxdig @127.0.0.1 -p 8600 nginx.service.consul      

Consul叢集

  • 建立 consul server:
mkdir -p /consul/{config,data}consul agent -server -bootstrap-expect=3  \
    -data-dir=/consul/data \
    -node=agent128 -bind=192.168.30.128 \
    -enable-script-checks=true -config-dir=/consul/config \
    -client 0.0.0.0 -ui &> /consul/data/consul.log &      

參數:

-node:節點的名稱 
-bind:綁定的一個位址,用于節點之間通信的位址,可以是内外網,必須是可以通路到的位址 
-server:表示這個節點是個Server
-bootstrap-expect:表示期望提供的Server節點數目。數目一達到,它就會被激活,然後就是leader了
-data-dir:Agent用于存儲狀态的資料目錄,這是所有Agent所必需的
-datacenter:指明資料中心的名字,預設是"dc1"。同一資料中心中的節點應位于單個LAN上
-client:将Client接口(包括HTTP和DNS伺服器)綁定到的位址
-ui:啟動UI      

其他兩台機器也建立 consul server,與 192.168.30.128 類似。

  • 建立 consul client:
mkdir -p /consul/{config,data}consul agent -data-dir=/consul/data \
    -node=agent131 -bind=192.168.30.131 \
    -enable-script-checks=true -config-dir=/consul/config \
    -client 0.0.0.0 -ui &> /consul/data/consul.log &      
  • 加入叢集:

除 192.168.30.128 外的其他機器加入叢集,

consul join 192.168.30.128      
consul members

Node      Address              Status  Type    Build  Protocol  DC   Segment
agent128  192.168.30.128:8301  alive   server  1.8.3  2         dc1  <all>agent129  192.168.30.129:8301  alive   server  1.8.3  2         dc1  <all>agent130  192.168.30.130:8301  alive   server  1.8.3  2         dc1  <all>agent131  192.168.30.131:8301  alive   client  1.8.3  2         dc1  <default>      

可以看得,叢集中有3個server和1個client,它們在資料中心dc1中。

  • 通路ui:

打開

http://192.168.30.128:8500/ui

,通路consul ui界面,

Consul叢集部署
Consul叢集部署
Consul叢集部署

可以看到,之前示範注冊的web服務nginx是正常狀态,節點agent130是叢集 leader。

  • 配置kv:

consul kv 是consul的核心功能,并随consul agent一起安裝。consul kv允許使用者存儲索引對象,盡管其主要用途是存儲配置參數和中繼資料。

consul kv 資料存儲在server上,可以由任何agent(client或server)通路。consul允許在所有server之間自動複制資料,如果發生故障,擁有一定數量的server将減少資料丢失的風險。

資料存儲位于server上的資料目錄中,為確定在完全中斷的情況下不會丢失資料,可以使用

consul snapshot

指令備份資料。

另外,還可以通過

consul kv

子指令、HTTP API 和 Consul UI 通路kv存儲。

Consul叢集部署

kv目前為空,即沒有存儲配置資訊。

查詢資料:

consul kv get --recurse             #查詢所有資料      

建立資料:

consul kv put username lzx              #建立kv對consul kv get username

lzx      
Consul叢集部署

更新資料:

consul kv put username liu              #更新kv對consul kv get username

liu      
consul kv delete username               #删除kv對consul kv get username

Error! No key exists at: username      

繼續閱讀