什麼是consul
Consul是服務網格(service mesh)的一種解決方案,Consul
是有服務發現,配置和**分段 **功能的全功能控制平面。這些功能可以根據需要單獨使用,也可以一起使用以構建完整的服務網格。Consul
需要一個數據平面,並支持代理和本機集成模型。Consul
附帶了一個簡單的內置代理,因此開箱即用,但也支持Envoy
等第三方代理集成。
Consul其實解決了運行微服務和雲原生基礎架構的網絡和安全挑戰。Consul提供了一種雲原生的軟件驅動路由和分段方法。它還帶來了其他好處,比如故障處理,重試和網絡可觀察。
上面說到了服務網格和數據平面,服務網格通常是和微服務在一起說的服務網格,數據平面很好理解就是軟件和服務架構中處理數據請求的那層,相比之下,控制平面就是配置和關閉數據平面的軟件部分,這裏Consul就起到了控制平面的作用。
Consul的主要特點有以下:
-
服務發現
Consul的客戶端可以註冊服務,例如api或mysql,客戶端可以使用Consul來發現已註冊的服務。使用DNS或HTTP,應用程序可以輕鬆找到它們依賴的服務。
-
健康檢測
Consul客戶端可以提供任何數量的運行狀況檢查,這些檢查可以與給定服務(“ Web服務器是否返回200 OK”)或本地節點(“內存利用率低於90%”)相關。你可以使用此信息來監視羣集的運行狀況,服務發現組件可以使用這些信息將流量從不正常的主機轉移走。
-
KV存儲
你應用程序可以將Consul的分層 鍵/值 存儲用於多種目的,不限於 動態配置,功能標記,協調,集羣leader選舉等等。Consul提供的簡單HTTP API使其非常易於使用。
-
安全的服務通信
Consul可以爲服務生成和分發TLS證書然後建立相互的TLS連接。意圖 用於定義允許哪些服務進行通信。可以實時更改意圖輕鬆管理服務分段,而不使用複雜的網絡拓撲和靜態防火牆規則。
-
多數據中心
Consul開箱即用地支持多個數據中心。這意味着Consul的用戶不必擔心會構建其他抽象層以擴展到多個區域
Consul的設計對DevOps社區和應用程序開發人員非常友好,使其非常適合現代,靈活的基礎架構。
Consul的基本架構
Consul是一個分佈式,高度可用系統。本節將介紹基礎知識,有意省略一些不必要的細節,可以快速瞭解Consul的工作方式。
向Consul提供服務的每個節點都運行着Consul的代理,當用來發現服務 或者 獲取配置的鍵值對數據時,代理可以不需要。代理負責節點上的服務以及節點本身的健康檢測。
代理與一臺或多臺Consul服務器通信。Consul服務器是存儲和複製數據的地方。服務器本身選舉一個領導者。雖然Consul可以在一臺服務器上運行,但建議3到5個節點,以避免發生故障導致數據丟失。建議爲每個數據中心都使用Consul服務器集羣。
服務器維護一個目錄,該目錄是通過彙總代理提交的數據生成的。該目錄維護着集羣的高級視圖,包括哪些服務可用,哪些節點運行這些服務,運行狀況信息等等。
需要發現其他服務或節點的基礎組件,可以查詢任何Consul服務器或任何Consul代理。代理將查詢自動轉發到服務器。
每個數據中心運行一個Consul服務器集羣。當發出跨數據中心的服務發現或配置請求時,本地Consul服務器將請求轉發到遠程數據中心並返回結果。
Consul的安裝
我這裏安裝爲了環境方便,採用的是docker的方式,之前也嘗試過虛擬機,筆記本物理機等等,都不如用docker安裝方便。
-
獲取鏡像文件
docker pull consul
網絡慢的,可能需要執行大約幾分鐘的時間,可以配置docker鏡像的方式解決,我配置了阿里鏡像
-
檢查下是否下載完成
➜ docker images -f 'reference=consul'
REPOSITORY TAG IMAGE ID CREATED SIZE
consul latest 2823bc69f80f 4 weeks ago 120MB
-
啓動Consul服務器
➜ docker run \
-d \
-p 8500:8500 \
-p 8600:8600/udp \
consul agent -server -ui -node=server-1 -bootstrap-expect=1 -client=0.0.0.0
-d: 表示後臺啓動
-p: 表示映射本機的8500和8600到docker容器的8500和8600/udp端口
最後一行就是consul 啓動服務器的命令
-
觀察啓動日誌
因爲剛纔是後臺啓動的,也看不到日誌情況,可以通過下面的方式查看
➜ docker logs d2806ac2b7e1 // 後面的這個id就是容器的id,可以通過 docker -ps -l 查看
看到這樣的日誌,說明就是啓動沒問題的
==> Starting Consul agent...
Version: '1.9.1'
Node ID: '5cea9bb5-53f2-e71e-1a46-b23f188da307'
Node name: 'server-1'
Datacenter: 'dc1' (Segment: '<all>')
Server: true (Bootstrap: true)
Client Addr: [0.0.0.0] (HTTP: 8500, HTTPS: -1, gRPC: -1, DNS: 8600)
Cluster Addr: 172.17.0.2 (LAN: 8301, WAN: 8302)
Encrypt: Gossip: false, TLS-Outgoing: false, TLS
....
==> Consul agent running!
....
現在服務端啓動了,接下來應該要啓動一個客戶端去連接這個服務端,這裏有個問題,我怎麼知道我啓動這個服務端的IP地址和端口號,docker提供了可以直接執行容器內Consul命令的方式。
➜ docker exec d2806ac2b7e1 consul members
Node Address Status Type Build Protocol DC Segment
server-1 172.17.0.2:8301 alive server 1.9.1 2 dc1 <all>
當然你也可以直接進去到容器內部,進去容器內部,使用的是exec命令
docker exec -it d2806ac2b7e1 /bin/sh
//然後執行
consul members
docker執行容器內支持的命令方式爲:
docker exec <container_id> consul members
這裏發現 服務端的地址是172.17.0.2:8301
-
配置運行客戶端
docker run \
--name=test-1 \
consul agent -node=client-1 -join=172.17.0.2
看到下面的輸出說明沒有問題,注意這裏的name是指的容器參數
==> Starting Consul agent...
==> Joining cluster...
Join completed. Synced with 1 initial agents
==> Consul agent running!
Version: 'v1.4.4'
Node ID: '4b6da3c6-b13f-eba2-2b78-446ffa627633'
Node name: 'client-1'
Datacenter: 'dc1' (Segment: '')
Server: false (Bootstrap: false)
Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: -1, DNS: 8600)
Cluster Addr: 172.17.0.4 (LAN: 8301, WAN: 8302)
Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false
通過再次在容器中執行consul Members
命令來檢查客戶端是否已加入
docker exec d2806ac2b7e1 consul members
發現已經變成兩個了,並且狀態都是可用狀態
docker exec d2806ac2b7e1 consul members
Node Address Status Type Build Protocol DC Segment
server-1 172.17.0.2:8301 alive server 1.9.1 2 dc1 <all>
client-1 172.17.0.3:8301 alive client 1.9.1 2 dc1 <default>
現在有了一個小的數據中心,就可以註冊服務或者配置數據玩了。
其實,查看數據中心的方式,還可以通過web的方式來查看,Consul默認的http接口是8500
端口,這個端口啓動的ui接口,可以方便的管理配置數據中心。打開如圖,點擊NODES 查看節點
點擊節點,右邊可以看到節點的健康狀態,代理是否可用等
總結
到這裏,先簡單瞭解了Consul,然後熟悉了Consul的簡單架構,隨後在docker裏面就方便的搭建了一個簡單的Consul集羣,並且都是可用狀態。