?
目錄
Consul構(gòu)成
Docker Consul 概述
Raft算法
服務(wù)注冊與發(fā)現(xiàn)
健康檢查
Key/Value存儲
多數(shù)據(jù)中心
部署模式
consul-template守護(hù)進(jìn)程
registrator容器
consul服務(wù)部署(192.168.41.31)
環(huán)境準(zhǔn)備
搭建Consul服務(wù)
查看集群信息
registrator服務(wù)部署(192.168.41.32)
安裝 Gliderlabs/Registrator:
測試服務(wù)發(fā)現(xiàn)功能是否正常
驗證 http 和 nginx 服務(wù)是否注冊到 consul
consul-template服務(wù)部署(192.168.41.31)
準(zhǔn)備 template nginx 模板文件
編譯安裝配置nginx
配置并啟動 template
訪問 template-nginx
增加一個 nginx 容器節(jié)點(diǎn)測試
構(gòu)建Consul架構(gòu)多節(jié)點(diǎn)
搭建示例
之前的架構(gòu)
?優(yōu)化后
Consul構(gòu)成
????????Consul由多個關(guān)鍵組件組成,這些組件共同協(xié)作以實現(xiàn)分布式系統(tǒng)中的服務(wù)發(fā)現(xiàn)、健康檢查、配置管理等功能。以下是Consul的主要組成部分:
-
Agent(代理): Agent是Consul集群中每個節(jié)點(diǎn)上運(yùn)行的守護(hù)進(jìn)程。它有兩種模式:
-
Server(服務(wù)器): 負(fù)責(zé)維護(hù)集群狀態(tài)、參與領(lǐng)導(dǎo)者選舉、響應(yīng)RPC查詢等。一個數(shù)據(jù)中心通常有多個Server,通過Raft協(xié)議保持一致性。
-
Client(客戶端): 轉(zhuǎn)發(fā)所有RPC請求到Server,并可運(yùn)行在應(yīng)用程序的同一主機(jī)上,用于將服務(wù)發(fā)現(xiàn)請求轉(zhuǎn)發(fā)給Server。
-
Server集群: 由多個Server組成,通過Raft選舉協(xié)議來維護(hù)領(lǐng)導(dǎo)者,負(fù)責(zé)處理集群狀態(tài)和事務(wù)。
-
DataCenter(數(shù)據(jù)中心): 邏輯上劃分的數(shù)據(jù)中心單元,Consul集群可以在不同的數(shù)據(jù)中心之間進(jìn)行通信。
-
Members(成員): Consul集群中的各個節(jié)點(diǎn)或?qū)嵗?,通過Gossip協(xié)議進(jìn)行通信和狀態(tài)同步。
-
Gossip協(xié)議: 基于Serf實現(xiàn)的Gossip協(xié)議用于節(jié)點(diǎn)之間的通信。包括LAN Gossip用于同一數(shù)據(jù)中心內(nèi)的通信,以及WAN Gossip用于跨數(shù)據(jù)中心的通信。
-
Catalog(目錄): 用于存儲和管理服務(wù)和節(jié)點(diǎn)信息的目錄服務(wù)。包括服務(wù)發(fā)現(xiàn)、健康檢查和節(jié)點(diǎn)元數(shù)據(jù)等信息。
-
Service Discovery(服務(wù)發(fā)現(xiàn)): 通過DNS或HTTP接口提供服務(wù)注冊和服務(wù)發(fā)現(xiàn)功能,使得應(yīng)用程序能夠發(fā)現(xiàn)并與其他服務(wù)通信。
-
Health Checking(健康檢查): 定期檢查服務(wù)的健康狀態(tài),如果服務(wù)不健康,則通知集群中的其他成員。
這些組件共同構(gòu)成了Consul的體系結(jié)構(gòu),使其成為一個高度可用、分布式、橫向可擴(kuò)展的系統(tǒng),適用于構(gòu)建可靠的服務(wù)基礎(chǔ)設(shè)施。
Docker Consul 概述
-
Consul是由Google開源的服務(wù)管理軟件,使用Go語言進(jìn)行開發(fā)。它提供了多數(shù)據(jù)中心、分布式高可用、服務(wù)發(fā)現(xiàn)和配置共享的功能。采用Raft算法確保服務(wù)的高可用性,內(nèi)置了服務(wù)注冊與發(fā)現(xiàn)框架、分布一致性協(xié)議實現(xiàn)、健康檢查、Key/Value存儲和多數(shù)據(jù)中心方案,不再依賴其他工具(例如ZooKeeper等)。Consul的部署簡單,只需一個可運(yùn)行的二進(jìn)制包。
-
安裝consul是用于服務(wù)注冊,也就是容器本身的一些信息注冊到consul里面,其他程序可以通過consul獲取注冊的相關(guān)服務(wù)信息,這就是服務(wù)注冊與發(fā)現(xiàn)。
主要特點(diǎn)和運(yùn)行模式如下:
-
Raft算法: 用于保證服務(wù)的高可用性,實現(xiàn)分布式一致性。
-
服務(wù)注冊與發(fā)現(xiàn)框架: 內(nèi)置的機(jī)制允許服務(wù)在Consul中注冊和被發(fā)現(xiàn),實現(xiàn)動態(tài)的服務(wù)管理。consul通過DNS或者HTTP接口使服務(wù)注冊和服務(wù)發(fā)現(xiàn)變的很容易,一些外部服務(wù),例如saas提供的也可以一樣注冊。
-
健康檢查: Consul支持對服務(wù)進(jìn)行健康檢查,確保只有健康的服務(wù)被提供給客戶端。健康檢測使consul可以快速的告警在集群中的操作。和服務(wù)發(fā)現(xiàn)的集成,可以防止服務(wù)轉(zhuǎn)發(fā)到故障的服務(wù)上面。
-
Key/Value存儲: 提供了簡單的鍵值存儲,適用于配置共享等場景。一個用來存儲動態(tài)配置的系統(tǒng)。提供簡單的HTTP接口,可以在任何地方操作。
-
多數(shù)據(jù)中心: 支持跨多個數(shù)據(jù)中心的服務(wù)注冊、發(fā)現(xiàn)和協(xié)作。無需復(fù)雜的配置,即可支持任意數(shù)量的區(qū)域。
-
部署模式: 每個節(jié)點(diǎn)都運(yùn)行Consul agent,有兩種運(yùn)行模式:server和client。
-
在client模式下,節(jié)點(diǎn)不持久化注冊的服務(wù)信息,而是將其轉(zhuǎn)發(fā)到server節(jié)點(diǎn)。
-
在server模式下,節(jié)點(diǎn)負(fù)責(zé)持久化注冊信息,并負(fù)責(zé)同步信息給其他server節(jié)點(diǎn),同時執(zhí)行健康監(jiān)測。
????????Consul的架構(gòu)建議每個數(shù)據(jù)中心運(yùn)行3或5個server節(jié)點(diǎn)以確保數(shù)據(jù)安全,并保證leader的選舉能夠正確進(jìn)行。leader負(fù)責(zé)同步注冊信息和執(zhí)行節(jié)點(diǎn)健康監(jiān)測。整體上,Consul提供了強(qiáng)大的服務(wù)治理和管理功能,使得構(gòu)建分布式系統(tǒng)變得更加容易和可靠。
Raft算法
????????Raft算法是一種分布式一致性算法,用于確保分布式系統(tǒng)中的多個節(jié)點(diǎn)能夠就共享狀態(tài)達(dá)成一致。Raft的設(shè)計目標(biāo)是提供一種相對容易理解的分布式共識算法,以取代更復(fù)雜的Paxos算法。
領(lǐng)導(dǎo)者選舉:
-
Raft中的節(jié)點(diǎn)分為三種狀態(tài):領(lǐng)導(dǎo)者(Leader)、跟隨者(Follower)和候選人(Candidate)。
-
集群啟動時,所有節(jié)點(diǎn)都是跟隨者。一個跟隨者可以成為候選人,然后通過領(lǐng)導(dǎo)者選舉機(jī)制競爭成為領(lǐng)導(dǎo)者。
-
在選舉過程中,每個節(jié)點(diǎn)都有一個隨機(jī)的選舉超時時間,首先超時的節(jié)點(diǎn)成為候選人,并開始領(lǐng)導(dǎo)者選舉。
領(lǐng)導(dǎo)者職責(zé):
-
一旦節(jié)點(diǎn)成為領(lǐng)導(dǎo)者,它負(fù)責(zé)在集群中產(chǎn)生并復(fù)制日志條目,以確保所有節(jié)點(diǎn)的日志保持一致。
-
領(lǐng)導(dǎo)者定期向跟隨者發(fā)送心跳,以維持其領(lǐng)導(dǎo)地位。
日志復(fù)制:
-
日志是Raft中用于達(dá)成一致性的關(guān)鍵組件。領(lǐng)導(dǎo)者負(fù)責(zé)向所有跟隨者復(fù)制日志。
-
當(dāng)客戶端請求寫入時,領(lǐng)導(dǎo)者將該請求附加到其日志中,并通過心跳將日志條目復(fù)制到所有跟隨者的日志中。
一致性保證:
-
Raft保證當(dāng)大多數(shù)節(jié)點(diǎn)正常運(yùn)行時,系統(tǒng)能夠達(dá)成一致的狀態(tài)。大多數(shù)節(jié)點(diǎn)包括領(lǐng)導(dǎo)者本身。
-
如果有部分節(jié)點(diǎn)不可用或發(fā)生網(wǎng)絡(luò)分區(qū),系統(tǒng)將等待大多數(shù)節(jié)點(diǎn)重新恢復(fù)后繼續(xù)操作。
持久性:
- 節(jié)點(diǎn)的狀態(tài)(包括日志、當(dāng)前任期等)需要持久化到磁盤,以便在重啟后能夠恢復(fù)。
????????Raft算法通過上述機(jī)制確保了分布式系統(tǒng)中的一致性和可用性,同時提供了相對較簡單的理解和實現(xiàn)方式。這使得Raft在構(gòu)建分布式系統(tǒng)時更易于應(yīng)用和維護(hù),相較于其他復(fù)雜的共識算法具有更高的可讀性。
服務(wù)注冊與發(fā)現(xiàn)
????????服務(wù)注冊與發(fā)現(xiàn)在微服務(wù)架構(gòu)中扮演著至關(guān)重要的角色,特別是在從單節(jié)點(diǎn)服務(wù)過渡到多節(jié)點(diǎn)分布式架構(gòu)的情境下。初始階段,服務(wù)通常是單節(jié)點(diǎn)的,缺乏高可用性和對服務(wù)壓力的有效處理,服務(wù)間調(diào)用主要通過簡單的接口訪問實現(xiàn)。隨著多節(jié)點(diǎn)分布式架構(gòu)的出現(xiàn),最初的解決方法是在服務(wù)前端引入負(fù)載均衡,但這種方式存在一些問題:
-
繁瑣的配置: 需要在配置文件中配置所有后端服務(wù)的網(wǎng)絡(luò)位置,導(dǎo)致配置復(fù)雜繁瑣。
-
網(wǎng)絡(luò)位置的變化: 如果后端服務(wù)的網(wǎng)絡(luò)位置發(fā)生變化,所有調(diào)用者都需要手動修改配置,不利于維護(hù)和擴(kuò)展。
????????為了解決這些問題,引入了服務(wù)注冊與發(fā)現(xiàn)機(jī)制。其基本思想是后端服務(wù)(A-N)將自己的網(wǎng)絡(luò)位置注冊到服務(wù)發(fā)現(xiàn)模塊,而服務(wù)發(fā)現(xiàn)模塊以鍵值對的方式記錄這些信息,其中鍵通常是服務(wù)名,值是對應(yīng)的IP地址和端口。服務(wù)發(fā)現(xiàn)模塊會定期進(jìn)行健康檢查,確保這些后端服務(wù)可用。前端在調(diào)用后端服務(wù)時,向服務(wù)發(fā)現(xiàn)模塊查詢它們的網(wǎng)絡(luò)位置,然后再發(fā)起對它們的服務(wù)調(diào)用。
這種方式帶來了以下好處:
-
簡化配置: 前端不再需要手動配置所有后端服務(wù)的網(wǎng)絡(luò)位置,極大地簡化了配置管理。
-
動態(tài)適應(yīng): 服務(wù)發(fā)現(xiàn)模塊可以動態(tài)監(jiān)測后端服務(wù)的健康狀態(tài),使得系統(tǒng)能夠在運(yùn)行時適應(yīng)服務(wù)的變化。
-
解耦前后端: 前端與后端服務(wù)完全解耦,前端只需與服務(wù)發(fā)現(xiàn)模塊通信,而不需要關(guān)心后端服務(wù)的具體網(wǎng)絡(luò)位置。
健康檢查
????????Consul是一個開源的服務(wù)發(fā)現(xiàn)和配置工具,它提供了健康檢查的功能,以確保只有健康的服務(wù)被提供給客戶端。
健康檢查類型:
- Consul支持多種類型的健康檢查,包括HTTP、TCP、Interval、Script等。這意味著你可以選擇適合你服務(wù)類型的不同健康檢查方式。
HTTP健康檢查:
- 通過發(fā)送HTTP請求到服務(wù)的指定端點(diǎn),Consul可以定期檢查服務(wù)是否響應(yīng)正常。如果服務(wù)響應(yīng)正常,就被標(biāo)記為健康狀態(tài),否則標(biāo)記為不健康狀態(tài)。
TCP健康檢查:
- Consul還支持通過TCP連接檢查服務(wù)的健康狀態(tài)。它會嘗試建立TCP連接并檢查是否成功,從而確定服務(wù)是否健康。
Interval健康檢查:
- Consul可以通過指定的時間間隔來定期檢查服務(wù)的健康狀態(tài)。如果在指定的時間內(nèi)沒有收到服務(wù)的響應(yīng),就會被標(biāo)記為不健康。
Script健康檢查:
- 對于一些特殊需求,Consul還支持通過執(zhí)行自定義腳本來進(jìn)行健康檢查。這使得你可以根據(jù)具體情況定義健康檢查的邏輯。
健康狀態(tài)更新:
- 當(dāng)服務(wù)的健康狀態(tài)發(fā)生變化時,Consul會及時更新服務(wù)注冊表,確??蛻舳酥荒茉L問到健康的服務(wù)實例。
????????通過這些健康檢查機(jī)制,Consul能夠?qū)崿F(xiàn)對服務(wù)狀態(tài)的實時監(jiān)測和管理。這對于構(gòu)建健壯的分布式系統(tǒng)以及提供高可用性的服務(wù)非常關(guān)鍵。
Key/Value存儲
????????Key/Value存儲是一種簡單而有效的數(shù)據(jù)存儲方式,Consul提供了這樣的功能,適用于配置共享等場景。
簡單鍵值對:
- Consul的Key/Value存儲是基于簡單的鍵值對的概念。每個鍵都是一個字符串,與之相關(guān)聯(lián)的是一個任意的數(shù)值或字符串值。
配置共享:
- Key/Value存儲通常用于配置共享,服務(wù)可以將其配置信息存儲在Consul的Key/Value存儲中,而其他服務(wù)可以從中讀取配置信息。這樣的設(shè)計使得配置的管理變得簡單且集中化。
動態(tài)配置更新:
- 由于Consul支持健康檢查和服務(wù)注冊,當(dāng)服務(wù)的配置發(fā)生變化時,可以通過更新Consul中的Key/Value存儲來實現(xiàn)動態(tài)配置的更新。這有助于系統(tǒng)在運(yùn)行時適應(yīng)配置的變化。
ACL控制:
- Consul提供了ACL(Access Control List)機(jī)制,可以對Key/Value存儲進(jìn)行訪問控制。這意味著你可以定義哪些服務(wù)或用戶有權(quán)訪問和修改特定的配置。
版本控制:
- Consul的Key/Value存儲支持版本控制,使得可以跟蹤配置的歷史變化。這在排查問題、回滾配置等方面非常有用。
HTTP API:
- Consul提供了HTTP API,允許通過API對Key/Value存儲進(jìn)行操作。這使得可以通過編程方式管理和更新配置信息。
????????總體而言,Consul的Key/Value存儲為分布式系統(tǒng)提供了一種簡單而強(qiáng)大的配置管理方式,適用于多種場景,特別是在微服務(wù)架構(gòu)中,服務(wù)間的配置共享和動態(tài)更新變得非常方便。
多數(shù)據(jù)中心
????????Consul支持多數(shù)據(jù)中心的服務(wù)注冊、發(fā)現(xiàn)和協(xié)作,這使得它在構(gòu)建分布式系統(tǒng)時更具彈性和可擴(kuò)展性。
服務(wù)注冊與發(fā)現(xiàn):
- Consul允許在不同數(shù)據(jù)中心的服務(wù)進(jìn)行注冊和發(fā)現(xiàn)。這意味著你可以在多個地理位置的數(shù)據(jù)中心中部署服務(wù),并使它們能夠互相發(fā)現(xiàn)和調(diào)用。
協(xié)作和一致性:
- Consul使用Raft算法來確保多數(shù)據(jù)中心之間的一致性。這使得在不同數(shù)據(jù)中心的服務(wù)能夠保持一致的視圖,從而協(xié)同工作而不受分布式環(huán)境的影響。
WAN感知:
- Consul是WAN(Wide Area Network)感知的,可以識別和處理位于不同地理位置的數(shù)據(jù)中心之間的網(wǎng)絡(luò)延遲和可用性差異。這有助于提供更可靠的服務(wù)注冊和發(fā)現(xiàn)功能。
多數(shù)據(jù)中心集群:
- Consul支持構(gòu)建多數(shù)據(jù)中心的集群,每個數(shù)據(jù)中心都有自己的Consul集群。這些集群之間可以通過配置連接起來,實現(xiàn)跨數(shù)據(jù)中心的服務(wù)通信。
健康檢查和故障轉(zhuǎn)移:
- Consul的健康檢查機(jī)制跨越多數(shù)據(jù)中心,確保服務(wù)在整個系統(tǒng)中保持健康狀態(tài)。如果在一個數(shù)據(jù)中心中的服務(wù)發(fā)生故障,Consul可以協(xié)調(diào)故障轉(zhuǎn)移以確保系統(tǒng)的可用性。
配置同步:
- Consul還支持跨數(shù)據(jù)中心的配置同步,使得在一個數(shù)據(jù)中心中進(jìn)行的配置更改能夠自動傳播到其他數(shù)據(jù)中心。
????????通過這些特性,Consul提供了一個強(qiáng)大的基礎(chǔ)設(shè)施,支持構(gòu)建分布式系統(tǒng)的多數(shù)據(jù)中心部署,同時確保服務(wù)之間的高度一致性和可靠性。這對于全球化的應(yīng)用和服務(wù)非常重要。
部署模式
????????每個節(jié)點(diǎn)都運(yùn)行Consul agent,它是Consul的核心組件,負(fù)責(zé)實現(xiàn)服務(wù)注冊、發(fā)現(xiàn)、健康檢查等功能。有兩種運(yùn)行模式:server和client。
-
在client模式下,節(jié)點(diǎn)不持久化注冊的服務(wù)信息,而是將其轉(zhuǎn)發(fā)到server節(jié)點(diǎn)。
-
在server模式下,節(jié)點(diǎn)負(fù)責(zé)持久化注冊信息,并負(fù)責(zé)同步信息給其他server節(jié)點(diǎn),同時執(zhí)行健康監(jiān)測。
????????Consul的架構(gòu)建議每個數(shù)據(jù)中心運(yùn)行3或5個server節(jié)點(diǎn)以確保數(shù)據(jù)安全,并保證leader的選舉能夠正確進(jìn)行。leader負(fù)責(zé)同步注冊信息和執(zhí)行節(jié)點(diǎn)健康監(jiān)測。整體上,Consul提供了強(qiáng)大的服務(wù)治理和管理功能,使得構(gòu)建分布式系統(tǒng)變得更加容易和可靠。
consul-template守護(hù)進(jìn)程
consul-template
是與 Consul 集成的一個工具,用于渲染模板并自動更新配置文件。它通常與服務(wù)發(fā)現(xiàn)和配置管理一起使用,以確保服務(wù)實例的配置始終保持最新和一致。
守護(hù)進(jìn)程:
- Consul-Template 作為一個守護(hù)進(jìn)程運(yùn)行,實時查詢 Consul 集群的信息。
查詢功能:
- Consul-Template 可以查詢 Consul 中的服務(wù)目錄、Key、Key-values 等。這為動態(tài)配置文件的創(chuàng)建提供了強(qiáng)大的抽象功能。
模板語言:
- 支持靈活的模板語言,允許用戶使用查詢結(jié)果動態(tài)地填充配置文件的內(nèi)容。這對于創(chuàng)建諸如 Apache/Nginx Proxy Balancers、Haproxy Backends 等動態(tài)配置非常有用。
自動更新:
- 一旦模板渲染完成,
consul-template
可以監(jiān)視 Consul 中的變化,并在檢測到更改時自動重新渲染模板。這使得配置的更新可以實時反映到運(yùn)行中的服務(wù)中。
觸發(fā)命令執(zhí)行:
- 更新完成后,Consul-Template 可以選擇執(zhí)行 shell 命令,這樣可以在配置更新后觸發(fā)一些操作,比如重新加載 Nginx。
事件通知:
-
consul-template
提供了事件通知機(jī)制,可以在配置更改時執(zhí)行自定義的命令或腳本。這允許用戶根據(jù)需要執(zhí)行一些額外的操作,例如重新加載服務(wù)或執(zhí)行其他配置變更操作。
簡化配置管理:
- 通過將配置信息從 Consul 中抽象出來,
consul-template
簡化了配置的管理和分發(fā),特別適用于微服務(wù)架構(gòu)中的服務(wù)實例。
命令行工具和集成性:
-
consul-template
作為一個命令行工具,易于集成到不同的部署和自動化流程中,確保配置的動態(tài)性和一致性。
適用場景:
- Consul-Template 特別適合在動態(tài)環(huán)境中使用,其中服務(wù)的數(shù)量和配置信息可能會經(jīng)常發(fā)生變化。它簡化了配置的管理,確保配置文件與實際服務(wù)狀態(tài)同步。
適用案例:
- 常見的使用案例包括創(chuàng)建反向代理配置、負(fù)載均衡器配置等,其中服務(wù)實例的動態(tài)變化需要實時地更新配置文件。
registrator容器
????????Registrator 是一個用于自動注冊和注銷服務(wù)實例的工具,它通常與容器編排系統(tǒng)(如 Docker)一起使用。其主要功能是監(jiān)控運(yùn)行中的容器,并將它們注冊到服務(wù)發(fā)現(xiàn)系統(tǒng)中,以便其他服務(wù)可以發(fā)現(xiàn)和與之通信。
以下是 Registrator 的一些關(guān)鍵特點(diǎn)和功能:
-
自動服務(wù)注冊: Registrator 監(jiān)控正在運(yùn)行的容器,并自動將它們注冊到服務(wù)發(fā)現(xiàn)系統(tǒng)中。這有助于確保所有運(yùn)行的服務(wù)都被正確地加入到服務(wù)注冊表中。
-
支持多種服務(wù)發(fā)現(xiàn)后端: Registrator 支持多種服務(wù)發(fā)現(xiàn)后端,其中包括 Consul、etcd、SkyDNS 等。這使得它能夠適應(yīng)不同的環(huán)境和需求。
-
容器事件監(jiān)聽: Registrator 通過監(jiān)聽容器的事件,例如容器的啟動和停止,來感知容器的狀態(tài)變化。一旦有新的容器啟動或舊的容器停止,Registrator 就會相應(yīng)地更新服務(wù)發(fā)現(xiàn)系統(tǒng)中的信息。
-
與 Consul 搭配使用: Registrator 與 Consul 搭配使用。這意味著 Registrator 可以將容器注冊到 Consul 中,而Consul-Template則可以用來動態(tài)生成配置文件,實現(xiàn)服務(wù)配置的自動更新。
-
簡化服務(wù)發(fā)現(xiàn)流程: Registrator 的存在簡化了服務(wù)發(fā)現(xiàn)的流程,使得新的服務(wù)實例能夠自動加入到服務(wù)注冊表中,而無需手動干預(yù)。
consul服務(wù)部署(192.168.41.31)
環(huán)境準(zhǔn)備
consul服務(wù)器 | 192.168.41.31 | 運(yùn)行consul服務(wù)、nginx服務(wù)、consul-template守護(hù)進(jìn)程 |
registrator服務(wù)器 | 192.168.41.32 | 運(yùn)行registrator容器、運(yùn)行nginx容器 |
這個架構(gòu)的運(yùn)行方式:
Consul服務(wù)器 (192.168.41.31):
-
Consul服務(wù)運(yùn)行: Consul作為服務(wù)發(fā)現(xiàn)和配置管理的中心。其他服務(wù)可以注冊到Consul,并通過其發(fā)現(xiàn)其他服務(wù)的實例和配置信息。
-
Nginx服務(wù)運(yùn)行: Nginx用于處理網(wǎng)絡(luò)流量,是作為反向代理服務(wù)器、負(fù)載均衡器等。
-
Consul-template守護(hù)進(jìn)程: 運(yùn)行Consul-template守護(hù)進(jìn)程,該進(jìn)程監(jiān)視Consul中配置的更改,并相應(yīng)地更新模板文件。這樣可以實現(xiàn)動態(tài)配置。
Registrator服務(wù)器 (192.168.41.32):
-
Registrator容器運(yùn)行: Registrator以容器方式運(yùn)行,用于自動注冊和注銷其他服務(wù)實例到Consul。當(dāng)新的服務(wù)容器啟動或關(guān)閉時,Registrator會更新Consul中的服務(wù)注冊信息。
-
Nginx容器運(yùn)行: Nginx以容器方式運(yùn)行,這樣可以更輕松地管理和部署。
????????一般來說,這種架構(gòu)的運(yùn)行方式是基于微服務(wù)和容器化的理念,通過Consul實現(xiàn)服務(wù)的發(fā)現(xiàn)和配置管理,Nginx處理網(wǎng)絡(luò)流量,并通過Registrator自動注冊和注銷服務(wù)實例。這種架構(gòu)具有靈活性和可伸縮性,容器化的部署方式使得服務(wù)的管理和擴(kuò)展更加方便。
systemctl stop firewalld.service
setenforce 0
搭建Consul服務(wù)
創(chuàng)建Consul服務(wù)目錄:
mkdir /opt/consul
將Consul二進(jìn)制文件復(fù)制到創(chuàng)建的目錄:
cp consul_0.9.2_linux_amd64.zip /opt/consul
進(jìn)入Consul目錄:
cd /opt/consul
解壓Consul二進(jìn)制文件:
unzip consul_0.9.2_linux_amd64.zip
將解壓后的Consul二進(jìn)制文件移動到/usr/local/bin/目錄,以便系統(tǒng)能夠識別并執(zhí)行:
mv consul /usr/local/bin/
設(shè)置Consul代理,并在后臺啟動Consul服務(wù)端。
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.41.31 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
-
????????-server
: 以server身份啟動。默認(rèn)是client。-
-bootstrap
: 表示該服務(wù)器將充當(dāng)引導(dǎo)服務(wù)器。 -
-ui
: 啟用Consul的Web用戶界面。 -
-data-dir=/var/lib/consul-data
: 指定Consul存儲數(shù)據(jù)的目錄。 -
-bind=192.168.41.31
: 指定Consul綁定的IP地址。 -
-client=0.0.0.0
: 允許從任何IP連接到Consul客戶端。 -
-node=consul-server01
: 指定Consul節(jié)點(diǎn)的名稱。 -
&> /var/log/consul.log &
: 將Consul的日志輸出到/var/log/consul.log文件,并在后臺運(yùn)行。
-
補(bǔ)充詳解
-
-server
: 以server身份啟動。默認(rèn)情況下,Consul以client身份啟動。 -
-bootstrap
: 控制server是否在bootstrap模式。在一個數(shù)據(jù)中心中,只能有一個server處于bootstrap模式。處于bootstrap模式的server可以自己選舉為server-leader。 -
-bootstrap-expect=2
: 設(shè)置集群要求的最少server數(shù)量。當(dāng)集群中的server數(shù)量低于這個值時,整個集群將失效。 -
-ui
: 啟用Consul的Web用戶界面。通過此參數(shù)啟動后,可以通過 http://localhost:8500/ui 訪問Consul自帶的Web UI界面。 -
-data-dir
: 指定數(shù)據(jù)存儲目錄,即Consul用來存儲數(shù)據(jù)的路徑。 -
-bind
: 指定在集群內(nèi)部的通訊地址。集群中的所有節(jié)點(diǎn)到此地址都必須是可達(dá)的。默認(rèn)為0.0.0.0。 -
-client
: 指定Consul綁定在哪個client地址上,提供HTTP、DNS、RPC等服務(wù)。默認(rèn)為127.0.0.1。 -
-node
: 指定節(jié)點(diǎn)在集群中的名稱。在一個集群中,節(jié)點(diǎn)名稱必須是唯一的。默認(rèn)為節(jié)點(diǎn)的主機(jī)名。 -
-datacenter
: 指定數(shù)據(jù)中心的名稱。默認(rèn)為dc1。
查看服務(wù)
netstat -natp | grep consul
Consul 是一種開源的服務(wù)發(fā)現(xiàn)和配置工具,用于構(gòu)建分布式系統(tǒng)。當(dāng)啟動 Consul 后,默認(rèn)會監(jiān)聽以下五個端口:
-
8300端口:
-
用于服務(wù)間的復(fù)制(replication)。
-
用于 Leader 的 forward。
-
-
8301端口:
-
用于局域網(wǎng)(LAN)中節(jié)點(diǎn)之間的 Gossip 協(xié)議通信。
-
主要用于集群中的節(jié)點(diǎn)之間的發(fā)現(xiàn)和信息傳播。
-
-
8302端口:
-
用于廣域網(wǎng)(WAN)中節(jié)點(diǎn)之間的 Gossip 協(xié)議通信。
-
與8301端口類似,但主要用于跨越較大區(qū)域的節(jié)點(diǎn)之間的通信。
-
-
8500端口:
-
提供 Consul 的 Web UI 界面。
-
通過該端口可以訪問可視化的用戶界面,以便查看和管理 Consul 中的服務(wù)和節(jié)點(diǎn)。
-
-
8600端口:
-
用于使用 DNS 協(xié)議查看節(jié)點(diǎn)信息。
-
允許通過 DNS 查詢的方式獲取節(jié)點(diǎn)和服務(wù)的信息,方便在應(yīng)用中通過域名進(jìn)行服務(wù)發(fā)現(xiàn)。
-
這些端口的默認(rèn)配置支持 Consul 在分布式環(huán)境中進(jìn)行節(jié)點(diǎn)發(fā)現(xiàn)、服務(wù)注冊和配置管理等任務(wù)。
查看集群信息
查看成員(Members)狀態(tài):
consul members
????????這個命令顯示了Consul集群中的成員狀態(tài)。
查看集群狀態(tài):
consul operator raft list-peers
????????這個命令顯示了Consul Raft協(xié)議的集群狀態(tài),列出了所有的Raft節(jié)點(diǎn)。
consul info | grep leader
????????這個命令通過Consul的信息檢索了領(lǐng)導(dǎo)者(leader)節(jié)點(diǎn)的地址,
通過HTTP API獲取集群信息: 通過Consul的HTTP API獲取集群信息的命令。這些命令可以通過curl進(jìn)行調(diào)用:
- 查看集群server成員:
curl 127.0.0.1:8500/v1/status/peers
- 查看集群server-leader:
curl 127.0.0.1:8500/v1/status/leader
- 注冊的所有服務(wù):
curl 127.0.0.1:8500/v1/catalog/services
- 查看nginx服務(wù)信息:
curl 127.0.0.1:8500/v1/catalog/nginx
- 查看集群節(jié)點(diǎn)詳細(xì)信息:
curl 127.0.0.1:8500/v1/catalog/nodes
????????這些API調(diào)用允許通過HTTP請求獲取Consul集群的各種信息,如成員列表、服務(wù)信息等。確保Consul代理在本地運(yùn)行,并且API端口為8500。
registrator服務(wù)部署(192.168.41.32)
功能說明: 負(fù)責(zé)容器服務(wù)的自動注冊到 Nginx 集群,并支持服務(wù)的注銷到服務(wù)配置中心。
安裝 Gliderlabs/Registrator:
使用 Docker 運(yùn)行 Gliderlabs/Registrator 容器,并將其配置為使用 Consul 作為服務(wù)配置中心。
docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=192.168.41.32 \
consul://192.168.41.31:8500
解釋說明:
-
-d
: 指定容器在后臺運(yùn)行(detached mode)。 -
--name=registrator
: 為容器指定名稱為 "registrator"。 -
--net=host
: 使用主機(jī)網(wǎng)絡(luò)模式,允許容器訪問主機(jī)網(wǎng)絡(luò)。 -
-v /var/run/docker.sock:/tmp/docker.sock
: 將 Docker 守護(hù)進(jìn)程的 socket 映射到容器內(nèi),以便 Registrator 可以監(jiān)測容器的運(yùn)行狀態(tài)。 -
--restart=always
: 指定容器在退出時總是重新啟動。 -
gliderlabs/registrator:latest
: 使用 Gliderlabs/Registrator 鏡像的最新版本。 -
--ip=192.168.41.32
: 設(shè)置 Registrator 的 IP 地址為 192.168.41.32。這是 Registrator 用于注冊服務(wù)的地址。 -
consul://192.168.41.31:8500
: 指定 Consul 的連接地址為 consul://192.168.41.31:8500,這是作為服務(wù)配置中心。
????????這段命令將啟動 Registrator 容器,并配置其自動注冊和注銷服務(wù)到 Consul 中。確保 Consul 服務(wù)運(yùn)行在 192.168.41.31 的地址上,并監(jiān)聽端口 8500。
docker run \
--net=host \ # 將容器設(shè)定為host網(wǎng)絡(luò)模式
-v /var/run/docker.sock:/tmp/docker.sock \ # 掛載宿主機(jī)的Docker守護(hù)進(jìn)程Unix域套接字到容器中
--restart=always \ # 在容器退出時總是重啟容器
--ip <宿主機(jī)的IP> \ # 指定容器的IP為宿主機(jī)的IP
consul \ # 指定容器使用Consul服務(wù)器,并可能包括IP和端口的指定
測試服務(wù)發(fā)現(xiàn)功能是否正常
docker run -itd -p 83:80 --name test-01 -h test01 nginx
docker run -itd -p 84:80 --name test-02 -h test02 nginx
docker run -itd -p 88:80 --name test-03 -h test03 httpd
docker run -itd -p 89:80 --name test-04 -h test04 httpd
????????這些命令用于在Docker中運(yùn)行四個容器(test-01、test-02、test-03、test-04),每個容器都運(yùn)行不同的Web服務(wù)(nginx或httpd),并映射宿主機(jī)的端口以便外部訪問。容器的主機(jī)名也通過-h
參數(shù)進(jìn)行了設(shè)置。這樣可以測試服務(wù)發(fā)現(xiàn)功能是否正常工作。
驗證 http 和 nginx 服務(wù)是否注冊到 consul
-
打開瀏覽器,在地址欄中輸入
http://192.168.41.31:8500
。 -
在Web頁面中,點(diǎn)擊 "NODES",然后點(diǎn)擊 "consurl-server01"。應(yīng)該會顯示出5個服務(wù)。
在consul服務(wù)器使用curl測試連接服務(wù)器
curl 127.0.0.1:8500/v1/catalog/services
????????執(zhí)行上述命令后,返回的JSON數(shù)據(jù)應(yīng)該包含已注冊的服務(wù)信息,例如:
{"consul":[],"httpd":[],"nginx":[]}
????????這表示Consul中已注冊的服務(wù)有"consul"、"httpd"和"nginx"。通過這些步驟和測試,可以驗證HTTP和Nginx服務(wù)是否成功注冊到Consul。
consul-template服務(wù)部署(192.168.41.31)
準(zhǔn)備 template nginx 模板文件
準(zhǔn)備 Nginx 模板文件: 在 Consul 服務(wù)器上操作,創(chuàng)建并編輯 Nginx 模板文件。
vim /opt/consul/nginx.ctmpl
定義 Nginx Upstream: 在模板文件中,定義一個簡單的 Nginx Upstream,使用 Consul-Template 查詢服務(wù)信息并生成 Upstream 配置。
upstream http_backend {
{{range service "nginx"}}
server {{.Address}}:{{.Port}};
{{end}}
}
定義 Nginx Server 配置: 繼續(xù)在模板文件中定義 Nginx Server 配置,監(jiān)聽8000端口,設(shè)置反向代理到上述定義的 Upstream。
server {
listen 8000;
server_name localhost 192.168.41.31;
access_log /var/log/nginx/kgc.com-access.log; # 修改日志路徑
index index.html index.php;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
說明:
-
模板中使用
{{range service "nginx"}}
遍歷 Consul 中所有名為 "nginx" 的服務(wù)實例,動態(tài)生成 Upstream 中的服務(wù)器地址和端口。 -
Server 配置中的監(jiān)聽端口為 8000,可以根據(jù)實際需求進(jìn)行調(diào)整。
-
Access log 路徑已經(jīng)設(shè)置為
/var/log/nginx/kgc.com-access.log
,您可以根據(jù)需要修改日志路徑。
通過這樣的模板文件和 Consul-Template 的使用,您可以實現(xiàn) Nginx 配置的自動更新,確保新的服務(wù)實例能夠動態(tài)加入反向代理。這在微服務(wù)架構(gòu)中是一種靈活且自動化的方式來管理服務(wù)配置。
-
listen 8000;
: Nginx 會在8000端口上監(jiān)聽請求。 -
server_name localhost 192.168.41.31;
: 限定了這個 Server 配置的域名,只有請求中的域名匹配其中一個,這個 Server 配置才會生效。 -
access_log /var/log/nginx/kgc.com-access.log;
: 設(shè)置訪問日志的路徑,記錄請求的詳細(xì)信息。 -
index index.html index.php;
: 定義默認(rèn)的索引文件,Nginx 會依次嘗試使用這些文件。 -
location / { ... }
: 配置了處理請求的位置,這里是根路徑/
。在這個位置配置了反向代理,將請求轉(zhuǎn)發(fā)到定義的http_backend
upstream。
通過這樣的模板文件和 Consul-Template 的使用,可以實現(xiàn) Nginx 配置的自動更新,確保新的服務(wù)實例能夠動態(tài)加入反向代理。這在微服務(wù)架構(gòu)中是一種靈活且自動化的方式來管理服務(wù)配置。
編譯安裝配置nginx
安裝必要的依賴:
yum -y install pcre-devel zlib-devel gcc gcc-c++ make
創(chuàng)建nginx用戶:
useradd -M -s /sbin/nologin nginx
解壓nginx源碼文件:
tar zxvf nginx-1.12.0.tar.gz -C /opt/
進(jìn)入解壓后的目錄:
cd /opt/nginx-1.12.0/
配置并編譯nginx:
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make -j && make install
創(chuàng)建符號鏈接:
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
配置nginx主配置文件:
vim /usr/local/nginx/conf/nginx.conf
在配置文件中添加以下內(nèi)容:
http {
include mime.types;
include vhost/*.conf; # 添加虛擬主機(jī)目錄
default_type application/octet-stream;
}
創(chuàng)建虛擬主機(jī)目錄:
mkdir /usr/local/nginx/conf/vhost
創(chuàng)建日志文件目錄:
mkdir /var/log/nginx
啟動nginx:
nginx
配置并啟動 template
下載并解壓Consul Template:
unzip consul-template_0.19.3_linux_amd64.zip -d /opt/
移動Consul Template到系統(tǒng)路徑:
cd /opt/
mv consul-template /usr/local/bin/
在前臺啟動Consul Template服務(wù)(請確保不要按下Ctrl+C中止Consul Template進(jìn)程):
consul-template --consul-addr 192.168.41.41:8500 \
--template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/kgc.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info
在另一個終端查看生成的配置文件:
upstream http_backend {
server 192.168.41.32:83;
server 192.168.41.32:84;
}
server {
listen 8000;
server_name 192.168.41.31;
access_log /var/log/nginx/kgc.cn-access.log;
index index.html index.php;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
訪問 template-nginx
列出所有Docker容器:
docker ps -a
進(jìn)入Nginx容器并創(chuàng)建一個測試文件:
docker exec -it 4f74d2c38844 bash
echo "this is test1 web" > /usr/share/nginx/html/index.html
進(jìn)入另一個Nginx容器并創(chuàng)建另一個測試文件:
docker exec -it b73106db285b bash
echo "this is test2 web" > /usr/share/nginx/html/index.html
通過瀏覽器訪問 http://192.168.41.31:8000/,并不斷刷新。
增加一個 nginx 容器節(jié)點(diǎn)測試
增加一個 Nginx 容器節(jié)點(diǎn),測試服務(wù)發(fā)現(xiàn)及配置更新功能。
docker run -itd -p 85:80 --name test-05 -h test05 nginx
該命令使用 Docker 運(yùn)行一個名為 test-05
的 Nginx 容器,將容器的端口映射到主機(jī)的端口 85,并設(shè)置容器的主機(jī)名為 test05
。
觀察 template
服務(wù),該服務(wù)會從模板更新 /usr/local/nginx/conf/vhost/kgc.conf
文件內(nèi)容,并重載 Nginx 服務(wù)。
查看 /usr/local/nginx/conf/vhost/kgc.conf
文件內(nèi)容:
cat /usr/local/nginx/conf/vhost/kgc.conf
文件內(nèi)容展示了一個名為 http_backend
的 upstream 塊,包含四個服務(wù)器節(jié)點(diǎn)的定義,每個節(jié)點(diǎn)使用不同的端口(83、84、85、86)。
查看三臺 Nginx 容器的日志,以確認(rèn)請求正常輪詢到各個容器節(jié)點(diǎn)上:
docker logs -f test-01
docker logs -f test-02
docker logs -f test-05
docker logs -f test-06
這些命令分別查看了 test-01
、test-02
、test-05
和 test-06
這四個容器的日志,以確認(rèn)請求是否正常地輪詢到它們各自的節(jié)點(diǎn)上。
總體而言,這些步驟和命令用于測試在 Nginx 中增加新容器節(jié)點(diǎn)后的服務(wù)發(fā)現(xiàn)和配置更新功能,并確保請求能夠正常輪詢到新的容器節(jié)點(diǎn)。
構(gòu)建Consul架構(gòu)多節(jié)點(diǎn)
建立多節(jié)點(diǎn)的Consul集群有幾個重要的原因:
-
高可用性: 多節(jié)點(diǎn)集群可以提供更高的系統(tǒng)可用性。當(dāng)一個節(jié)點(diǎn)發(fā)生故障或不可用時,其他節(jié)點(diǎn)仍然可以繼續(xù)提供服務(wù)。這是通過在集群中引入冗余節(jié)點(diǎn)來實現(xiàn)的,確保即使有節(jié)點(diǎn)失效,整個系統(tǒng)仍然能夠正常運(yùn)行。
-
負(fù)載均衡: 多節(jié)點(diǎn)集群能夠均衡處理請求,防止某個節(jié)點(diǎn)成為瓶頸。通過在多個節(jié)點(diǎn)上分布服務(wù)實例,可以有效地分擔(dān)負(fù)載,提高系統(tǒng)的整體性能。
-
容錯性: 多節(jié)點(diǎn)集群提供容錯機(jī)制,即使某個節(jié)點(diǎn)發(fā)生故障,系統(tǒng)也能夠保持可用。Consul使用Raft一致性算法來確保在節(jié)點(diǎn)失效或網(wǎng)絡(luò)分區(qū)的情況下,集群仍能維持一致的狀態(tài)。
-
服務(wù)發(fā)現(xiàn)和配置: Consul用于服務(wù)發(fā)現(xiàn)和配置管理。多節(jié)點(diǎn)集群能夠更有效地管理和監(jiān)控分布式系統(tǒng)中的服務(wù),使其更易于擴(kuò)展和維護(hù)。
-
水平擴(kuò)展: 隨著業(yè)務(wù)需求的增長,可以向集群添加更多的節(jié)點(diǎn),從而實現(xiàn)水平擴(kuò)展。這使得系統(tǒng)能夠處理更多的請求和數(shù)據(jù),保持高性能。
總體而言,建立多節(jié)點(diǎn)的Consul集群有助于構(gòu)建穩(wěn)健、可靠、高性能的分布式系統(tǒng),適用于各種規(guī)模的應(yīng)用和服務(wù)。
搭建示例
Consul 多節(jié)點(diǎn)配置
# 添加一臺已有docker環(huán)境的服務(wù)器192.168.41.33/24加入已有的群集中
consul agent \
-server \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.41.33 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true \
-datacenter=dc1 \
-join 192.168.41.31 &> /var/log/consul.log &
參數(shù)說明:
-
-server
: 將節(jié)點(diǎn)配置為服務(wù)器。 -
-ui
: 啟用Consul的Web UI。 -
-data-dir=/var/lib/consul-data
: 指定Consul數(shù)據(jù)目錄。 -
-bind=192.168.41.33
: 綁定到指定的IP地址。 -
-client=0.0.0.0
: 監(jiān)聽所有可用的網(wǎng)絡(luò)接口。 -
-node=consul-server02
: 指定節(jié)點(diǎn)名稱為"consul-server02"。 -
-enable-script-checks=true
: 設(shè)置檢查服務(wù)為可用。 -
-datacenter=dc1
: 指定數(shù)據(jù)中心名稱。 -
-join 192.168.41.31
: 將節(jié)點(diǎn)加入到已有的集群中。
其他命令:文章來源:http://www.zghlxwxcb.cn/news/detail-796900.html
# 顯示當(dāng)前Consul集群的成員列表
consul members
Node Address Status Type Build Protocol DC
consul-server01 192.168.41.31:8301 alive server 0.9.2 2 dc1
consul-server02 192.168.41.33:8301 alive server 0.9.2 2 dc1
# 顯示Raft協(xié)議中的節(jié)點(diǎn)信息
consul operator raft list-peers
Node ID Address State Voter RaftProtocol
Node ID Address State Voter RaftProtocol
consul-server01 192.168.41.31:8300 192.168.41.31:8300 leader true 2
consul-server02 192.168.41.33:8300 192.168.41.32:8300 follower true 2
這些命令幫助建立了一個高可用、負(fù)載均衡的Consul集群,用于服務(wù)發(fā)現(xiàn)和配置管理。文章來源地址http://www.zghlxwxcb.cn/news/detail-796900.html
到了這里,關(guān)于Docker Consul詳解與部署示例的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!