真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Consul集群版容器化部署與應(yīng)用集成是怎樣的

Consul集群版容器化部署與應(yīng)用集成是怎樣的,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

創(chuàng)新互聯(lián)長(zhǎng)期為上1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為東風(fēng)企業(yè)提供專業(yè)的成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、成都外貿(mào)網(wǎng)站建設(shè),東風(fēng)網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

背景

由于公司目前的主要產(chǎn)品使用的注冊(cè)中心是consul,consul需要用集群來保證高可用,傳統(tǒng)的方式(Nginx/HAProxy)會(huì)有單點(diǎn)故障問題,為了解決該問題,我開始研究如何只依賴consul做集群的注冊(cè)的方式,經(jīng)過一天的折騰,總算驗(yàn)證了可以通過集群版ConsulClient來進(jìn)行集群注冊(cè),在部署實(shí)施過程中也遇到了一些問題,特此記錄分享,希望能對(duì)有需要的同學(xué)有幫助。

主機(jī)版集群和docker版集群對(duì)比

client+server轉(zhuǎn)發(fā)模式的集群部署涉及到兩種選擇,第一種是直接主機(jī)模式部署,2個(gè)client+3個(gè)server,每個(gè)consul實(shí)例部署一臺(tái)主機(jī)(適合土豪使用),此種模式的好處就是簡(jiǎn)單暴力,而且運(yùn)維相對(duì)簡(jiǎn)單。此種模式的架構(gòu)部署圖如下: Consul集群版容器化部署與應(yīng)用集成是怎樣的

我們選擇的是另外一種經(jīng)濟(jì)節(jié)約模式,docker化部署,好處就是節(jié)約資源,劣勢(shì)就是要管理許多docker鏡像,在有引入k8s這些容器管理平臺(tái)之前,后續(xù)docker的運(yùn)維會(huì)比較麻煩,這種模式的架構(gòu)部署圖如下:

Consul集群版容器化部署與應(yīng)用集成是怎樣的

通過以上兩種模式的架構(gòu)圖我們很清楚的就能知道主機(jī)部署模式是最簡(jiǎn)單直接的,而docker的模式雖然節(jié)省了資源,但是加大了復(fù)雜性,增加了運(yùn)維的難度。但是這種模式應(yīng)該是在目前容器化的環(huán)境下很好的選擇,原因很簡(jiǎn)單,因?yàn)槌浞值睦昧速Y源,容器的運(yùn)維可以交給容器運(yùn)維平臺(tái)去完成,比如k8s等。下面我們來實(shí)踐下如何進(jìn)行容器化的consul集群部署。

環(huán)境準(zhǔn)備

這里準(zhǔn)備了兩臺(tái)虛擬主機(jī),由于是虛擬的主機(jī),對(duì)外ip是一樣的,所以我們以端口區(qū)分。

主機(jī)A:192.168.23.222:10385 內(nèi)網(wǎng)ip:192.168.236.3

主機(jī)B:192.168.23.222:10585 內(nèi)網(wǎng)ip:192.168.236.5

部署配置

步驟一:主機(jī)安裝Docker環(huán)境(以Centos為例)

yum install docker

步驟二:拉取Consul鏡像進(jìn)行部署

docker pull consul

步驟三:給主機(jī)Docker分配ip段,防止多主機(jī)ip重復(fù)

  1. 在主機(jī)A編輯docker/etc/docker/daemon.json文件,添加下面的內(nèi)容

 "bip": "172.17.1.252/24"
  1. 在主機(jī)B編輯docker/etc/docker/daemon.json文件,添加下面的內(nèi)容

  "bip": "172.17.2.252/24"

這里的配置是給主機(jī)的docker實(shí)例分配ip,因?yàn)楹罄m(xù)docker會(huì)進(jìn)行跨主機(jī)注冊(cè),如果默認(rèn)注冊(cè)的話,docker是用的主機(jī)內(nèi)網(wǎng),從而導(dǎo)致ip重復(fù),所以這里手動(dòng)進(jìn)行ip分配,當(dāng)然上述的ip配置你可以自定義。

步驟四:在主機(jī)A部署Consul

Node1:

         docker run -d --name=node_31 --restart=always \
             -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
             -p 11300:8300 \
             -p 11301:8301 \
             -p 11301:8301/udp \
             -p 11302:8302/udp \
             -p 11302:8302 \
             -p 11400:8400 \
             -p 11500:8500 \
             -p 11600:8600 \
             consul agent -server -join=172.17.1.1  -bootstrap-expect=3 -node=node31 \
             -data-dir=/consul/data/ -client 0.0.0.0 -ui

這里重點(diǎn)說明幾個(gè)參數(shù):

--name:是docker容器的名字,每個(gè)容器實(shí)例不一樣

-node:是consul節(jié)點(diǎn)的名字,每個(gè)節(jié)點(diǎn)不一樣

-bootstrap-expect:是啟動(dòng)集群期望至少多少個(gè)節(jié)點(diǎn),這里設(shè)置是3個(gè)。

-data-dir:是consul的數(shù)據(jù)中心的目錄,必須給與consul讀寫權(quán)限,否則啟動(dòng)會(huì)報(bào)錯(cuò)。

啟動(dòng)成功后,執(zhí)行命令查看consul的節(jié)點(diǎn)。

docker exec -t node_31 consul members

顯示結(jié)果如下:

Node    Address          Status  Type    Build  Protocol  DC   Segment
node31  172.17.1.1:8301  alive   server  1.6.2  2         dc1  

這說明第一個(gè)節(jié)點(diǎn)正常啟動(dòng)了,接下來正常啟動(dòng)主機(jī)A剩下的節(jié)點(diǎn)。

Node2:

docker run -d --name=node_32 --restart=always \
             -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
             -p 9300:8300 \
             -p 9301:8301 \
             -p 9301:8301/udp \
             -p 9302:8302/udp \
             -p 9302:8302 \
             -p 9400:8400 \
             -p 9500:8500 \
             -p 9600:8600 \
             consul agent -server -join=172.17.1.1  -bootstrap-expect=3 -node=node32 \
             -data-dir=/consul/data/ -client 0.0.0.0 -ui

Node3:

          docker run -d --name=node_33 --restart=always \
             -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
             -p 10300:8300 \
             -p 10301:8301 \
             -p 10301:8301/udp \
             -p 10302:8302/udp \
             -p 10302:8302 \
             -p 10400:8400 \
             -p 10500:8500 \
             -p 10600:8600 \
             consul agent -server -join=172.17.1.1  -bootstrap-expect=3 -node=node33 \
             -data-dir=/consul/data/ -client 0.0.0.0 -ui

三個(gè)節(jié)點(diǎn)啟動(dòng)完畢后,執(zhí)行命令,查看節(jié)點(diǎn)的狀態(tài):

docker exec -t node_31 consul operator raft list-peers

結(jié)果如下:

Node    ID                                    Address          State     Voter  RaftProtocol
node32  ee186aef-5f8a-976b-2a33-b20bf79e7da9  172.17.1.2:8300  follower  true   3
node33  d86b6b92-19e6-bb00-9437-f988b6dac4b2  172.17.1.3:8300  follower  true   3
node31  0ab60093-bed5-be77-f551-6051da7fe790  172.17.1.1:8300  leader    true   3

這里已經(jīng)顯示,三個(gè)server的節(jié)點(diǎn)已經(jīng)完成了集群部署,并且選舉了node_31作為主節(jié)點(diǎn)。最后給該主機(jī)集群部署一個(gè)client就大功告成了。

Node4(client節(jié)點(diǎn))

   docker run -d --name=node_34  --restart=always \
            -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' \
            -p 8300:8300 \
            -p 8301:8301 \
            -p 8301:8301/udp \
            -p 8302:8302/udp \
            -p 8302:8302 \
            -p 8400:8400 \
            -p 8500:8500 \
            -p 8600:8600 \
            consul agent -retry-join=172.17.1.1  \
            -node-id=$(uuidgen | awk '{print tolower($0)}') \
            -node=node34 -client 0.0.0.0 -ui

執(zhí)行docker exec -t node_31 consul members命令,結(jié)果如下:

Node    Address          Status  Type    Build  Protocol  DC   Segment
node31  172.17.1.1:8301  alive   server  1.6.2  2         dc1  
node32  172.17.1.2:8301  alive   server  1.6.2  2         dc1  
node33  172.17.1.3:8301  alive   server  1.6.2  2         dc1  
node34  172.17.1.4:8301  alive   client  1.6.2  2         dc1  

這里說明,主機(jī)A的consul節(jié)點(diǎn)全部啟動(dòng)完成,并且完成了集群部署,可以說這就是一個(gè)單主機(jī)版的consul集群,那么接下來我們要做的就是把主機(jī)B的consul加入到主機(jī)A的集群中即可。

步驟五:在主機(jī)B部署Consul

Node5

       docker run -d --name=node_51 --restart=always \
               -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
               -p 11300:8300 \
               -p 11301:8301 \
               -p 11301:8301/udp \
               -p 11302:8302/udp \
               -p 11302:8302 \
               -p 11400:8400 \
               -p 11500:8500 \
               -p 11600:8600 \
               consul agent -server -join=172.17.1.1  -bootstrap-expect=3 -node=node_51 \
               -data-dir=/consul/data/ -client 0.0.0.0 -ui

Node6

       docker run -d --name=node_52 --restart=always \
               -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
               -p 9300:8300 \
               -p 9301:8301 \
               -p 9301:8301/udp \
               -p 9302:8302/udp \
               -p 9302:8302 \
               -p 9400:8400 \
               -p 9500:8500 \
               -p 9600:8600 \
               consul agent -server -join=172.17.1.1  -bootstrap-expect=3 -node=node_52 \
               -data-dir=/consul/data/ -client 0.0.0.0 -ui

Node7

       docker run -d --name=node_53 --restart=always \
               -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
               -p 10300:8300 \
               -p 10301:8301 \
               -p 10301:8301/udp \
               -p 10302:8302/udp \
               -p 10302:8302 \
               -p 10400:8400 \
               -p 10500:8500 \
               -p 10600:8600 \
               consul agent -server -join=172.17.1.1  -bootstrap-expect=3 -node=node_53 \
               -data-dir=/consul/data/ -client 0.0.0.0 -ui

主機(jī)B的三個(gè)server節(jié)點(diǎn)部署完成后,我們執(zhí)行命令docker exec -t node_51 consul members查看下集群節(jié)點(diǎn)狀態(tài)

Node     Address          Status  Type    Build  Protocol  DC   Segment
node_51  172.17.2.1:8301  alive   server  1.6.2  2         dc1  

為什么只有node_51這個(gè)單獨(dú)的節(jié)點(diǎn)呢?是不是節(jié)點(diǎn)的問題?我們?cè)谥鳈C(jī)B中查詢同樣查詢一下,結(jié)果如下:

node31  172.17.1.1:8301  alive   server  1.6.2  2         dc1  
node32  172.17.1.2:8301  alive   server  1.6.2  2         dc1  
node33  172.17.1.3:8301  alive   server  1.6.2  2         dc1  
node34  172.17.1.4:8301  alive   client  1.6.2  2         dc1  

主機(jī)A的節(jié)點(diǎn)只有他們自己機(jī)器的節(jié)點(diǎn),主機(jī)B中的節(jié)點(diǎn)全部未注冊(cè)過來,這是為什么呢?原因就是consul綁定的ip是容器的內(nèi)網(wǎng)ip,主機(jī)內(nèi)部通訊是可以的,跨主機(jī)通訊是無法通過內(nèi)網(wǎng)地址進(jìn)行通訊的,那么我們?cè)趺醋瞿??我們通過路由規(guī)則進(jìn)行轉(zhuǎn)發(fā)即可,把主機(jī)A請(qǐng)求主機(jī)B容器的內(nèi)網(wǎng)地址轉(zhuǎn)發(fā)到主機(jī)B即可,這里就體現(xiàn)出我們開始給容器分配ip的作用了。 我們?cè)谥鳈C(jī)A執(zhí)行如下命令:

route add -net 172.17.2.0 netmask 255.255.255.0 gw 192.168.236.5

這條命令的意思是,添加一個(gè)路由規(guī)則172.17.2.1~172.17.2.254范圍的ip請(qǐng)求,全部轉(zhuǎn)發(fā)到192.168.236.5地址下,也就是我們的主機(jī)B。 同理主機(jī)B也執(zhí)行如下命令:

route add -net 172.17.1.0 netmask 255.255.255.0 gw 192.168.236.3

添加完成后,在執(zhí)行docker exec -t node_53 consul members命令:

Node     Address          Status  Type    Build  Protocol  DC   Segment
node31   172.17.1.1:8301  alive   server  1.6.2  2         dc1  
node32   172.17.1.2:8301  alive   server  1.6.2  2         dc1  
node33   172.17.1.3:8301  alive   server  1.6.2  2         dc1  
node_51  172.17.2.1:8301  alive   server  1.6.2  2         dc1  
node_52  172.17.2.2:8301  alive   server  1.6.2  2         dc1  
node_53  172.17.2.3:8301  alive   server  1.6.2  2         dc1  
node34   172.17.1.4:8301  alive   client  1.6.2  2         dc1  

集群加入就成功了,這就完成了跨主機(jī)的docker容器加入。 最后給主機(jī)B部署一個(gè)client

Node8(client節(jié)點(diǎn))

 docker run -d --name=node_54  --restart=always \
            -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' \
            -p 8300:8300 \
            -p 8301:8301 \
            -p 8301:8301/udp \
            -p 8302:8302/udp \
            -p 8302:8302 \
            -p 8400:8400 \
            -p 8500:8500 \
            -p 8600:8600 \
            consul agent -retry-join=172.17.1.1  \
            -node-id=$(uuidgen | awk '{print tolower($0)}') \
            -node=node54 -client 0.0.0.0 -ui

最后的集群節(jié)點(diǎn)全部加入成功了,結(jié)果如下:

node31   172.17.1.1:8301  alive   server  1.6.2  2         dc1  
node32   172.17.1.2:8301  alive   server  1.6.2  2         dc1  
node33   172.17.1.3:8301  alive   server  1.6.2  2         dc1  
node_51  172.17.2.1:8301  alive   server  1.6.2  2         dc1  
node_52  172.17.2.2:8301  alive   server  1.6.2  2         dc1  
node_53  172.17.2.3:8301  alive   server  1.6.2  2         dc1  
node34   172.17.1.4:8301  alive   client  1.6.2  2         dc1  
node54   172.17.2.4:8301  alive   client  1.6.2  2         dc1  

執(zhí)行節(jié)點(diǎn)狀態(tài)命令docker exec -t node_31 consul operator raft list-peers

node32   ee186aef-5f8a-976b-2a33-b20bf79e7da9  172.17.1.2:8300  follower  true   3
node33   d86b6b92-19e6-bb00-9437-f988b6dac4b2  172.17.1.3:8300  follower  true   3
node31   0ab60093-bed5-be77-f551-6051da7fe790  172.17.1.1:8300  leader    true   3
node_51  cfac3b67-fb47-8726-fa31-158516467792  172.17.2.1:8300  follower  true   3
node_53  31679abe-923f-0eb7-9709-1ed09980ca9d  172.17.2.3:8300  follower  true   3
node_52  207eeb6d-57f2-c65f-0be6-079c402f6afe  172.17.2.2:8300  follower  true   3

這樣一個(gè)包含6個(gè)server+2個(gè)clientconsul容器化集群就部署完成了,我們查看consulweb面板如下: Consul集群版容器化部署與應(yīng)用集成是怎樣的

應(yīng)用集成

集群版本的consul我們就部署好了,那么我們?nèi)绾闻c應(yīng)用集成呢?我們只要集成集群版本的consul注冊(cè)客戶端就行了。 首先加入依賴

        
		com.github.penggle
		spring-cloud-starter-consul-cluster
		2.1.0.RELEASE
	

第二步在bootstrap.yml|properties中指定spring.cloud.consul.host為多節(jié)點(diǎn),如下所示:

spring.cloud.consul.host=192.168.23.222:10385,192.168.23.222:10585

如果想輸出注冊(cè)的相關(guān)日志的話也可以在logback上加上日志配置

這樣配置完成后啟動(dòng)成功就能看到我們的應(yīng)用注冊(cè)成功了,下圖是我測(cè)試的注冊(cè)成功的效果: Consul集群版容器化部署與應(yīng)用集成是怎樣的

這里顯示我的應(yīng)用節(jié)點(diǎn)分別都注冊(cè)到了集群的2個(gè)client上面,通過client的代理轉(zhuǎn)發(fā)請(qǐng)求到健康的server,從而實(shí)現(xiàn)了consul的高可用。

這篇文章沒有研究什么技術(shù)干貨,純粹是工作經(jīng)驗(yàn)分享,主要講了consul集群部署的方式,傳統(tǒng)模式可以通過HAProxy來完成集群的部署,但是這種方式的弊端很明顯,通過虛擬ip還是可能會(huì)指向故障的節(jié)點(diǎn),所以我們用consulclient+server模式的集群部署,通過docker化來充分利用了機(jī)器的資源,只需要2臺(tái)機(jī)器就能完成集群的高可用效果。

關(guān)于Consul集群版容器化部署與應(yīng)用集成是怎樣的問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


當(dāng)前題目:Consul集群版容器化部署與應(yīng)用集成是怎樣的
網(wǎng)頁路徑:http://weahome.cn/article/ipiish.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部