中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Consul集群版容器化部署與應用集成是怎樣的

發布時間:2021-10-12 11:09:49 來源:億速云 閱讀:140 作者:柒染 欄目:云計算

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

背景

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

主機版集群和docker版集群對比

client+server轉發模式的集群部署涉及到兩種選擇,第一種是直接主機模式部署,2個client+3個server,每個consul實例部署一臺主機(適合土豪使用),此種模式的好處就是簡單暴力,而且運維相對簡單。此種模式的架構部署圖如下: Consul集群版容器化部署與應用集成是怎樣的

我們選擇的是另外一種經濟節約模式,docker化部署,好處就是節約資源,劣勢就是要管理許多docker鏡像,在有引入k8s這些容器管理平臺之前,后續docker的運維會比較麻煩,這種模式的架構部署圖如下:

Consul集群版容器化部署與應用集成是怎樣的

通過以上兩種模式的架構圖我們很清楚的就能知道主機部署模式是最簡單直接的,而docker的模式雖然節省了資源,但是加大了復雜性,增加了運維的難度。但是這種模式應該是在目前容器化的環境下很好的選擇,原因很簡單,因為充分的利用了資源,容器的運維可以交給容器運維平臺去完成,比如k8s等。下面我們來實踐下如何進行容器化的consul集群部署。

環境準備

這里準備了兩臺虛擬主機,由于是虛擬的主機,對外ip是一樣的,所以我們以端口區分。

主機A:192.168.23.222:10385 內網ip:192.168.236.3

主機B:192.168.23.222:10585 內網ip:192.168.236.5

部署配置

步驟一:主機安裝Docker環境(以Centos為例)

yum install docker

步驟二:拉取Consul鏡像進行部署

docker pull consul

步驟三:給主機Docker分配ip段,防止多主機ip重復

  1. 在主機A編輯docker/etc/docker/daemon.json文件,添加下面的內容

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

  "bip": "172.17.2.252/24"

這里的配置是給主機的docker實例分配ip,因為后續docker會進行跨主機注冊,如果默認注冊的話,docker是用的主機內網,從而導致ip重復,所以這里手動進行ip分配,當然上述的ip配置你可以自定義。

步驟四:在主機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

這里重點說明幾個參數:

--name:是docker容器的名字,每個容器實例不一樣

-node:是consul節點的名字,每個節點不一樣

-bootstrap-expect:是啟動集群期望至少多少個節點,這里設置是3個。

-data-dir:是consul的數據中心的目錄,必須給與consul讀寫權限,否則啟動會報錯。

啟動成功后,執行命令查看consul的節點。

docker exec -t node_31 consul members

顯示結果如下:

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

這說明第一個節點正常啟動了,接下來正常啟動主機A剩下的節點。

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

三個節點啟動完畢后,執行命令,查看節點的狀態:

docker exec -t node_31 consul operator raft list-peers

結果如下:

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

這里已經顯示,三個server的節點已經完成了集群部署,并且選舉了node_31作為主節點。最后給該主機集群部署一個client就大功告成了。

Node4(client節點)

   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

執行docker exec -t node_31 consul members命令,結果如下:

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

這里說明,主機A的consul節點全部啟動完成,并且完成了集群部署,可以說這就是一個單主機版的consul集群,那么接下來我們要做的就是把主機B的consul加入到主機A的集群中即可。

步驟五:在主機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

主機B的三個server節點部署完成后,我們執行命令docker exec -t node_51 consul members查看下集群節點狀態

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

為什么只有node_51這個單獨的節點呢?是不是節點的問題?我們在主機B中查詢同樣查詢一下,結果如下:

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

主機A的節點只有他們自己機器的節點,主機B中的節點全部未注冊過來,這是為什么呢?原因就是consul綁定的ip是容器的內網ip,主機內部通訊是可以的,跨主機通訊是無法通過內網地址進行通訊的,那么我們怎么做呢?我們通過路由規則進行轉發即可,把主機A請求主機B容器的內網地址轉發到主機B即可,這里就體現出我們開始給容器分配ip的作用了。 我們在主機A執行如下命令:

route add -net 172.17.2.0 netmask 255.255.255.0 gw 192.168.236.5

這條命令的意思是,添加一個路由規則172.17.2.1~172.17.2.254范圍的ip請求,全部轉發到192.168.236.5地址下,也就是我們的主機B。 同理主機B也執行如下命令:

route add -net 172.17.1.0 netmask 255.255.255.0 gw 192.168.236.3

添加完成后,在執行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  <all>
node32   172.17.1.2:8301  alive   server  1.6.2  2         dc1  <all>
node33   172.17.1.3:8301  alive   server  1.6.2  2         dc1  <all>
node_51  172.17.2.1:8301  alive   server  1.6.2  2         dc1  <all>
node_52  172.17.2.2:8301  alive   server  1.6.2  2         dc1  <all>
node_53  172.17.2.3:8301  alive   server  1.6.2  2         dc1  <all>
node34   172.17.1.4:8301  alive   client  1.6.2  2         dc1  <default>

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

Node8(client節點)

 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

最后的集群節點全部加入成功了,結果如下:

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

執行節點狀態命令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

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

應用集成

集群版本的consul我們就部署好了,那么我們如何與應用集成呢?我們只要集成集群版本的consul注冊客戶端就行了。 首先加入依賴

        <dependency>
		<groupId>com.github.penggle</groupId>
		<artifactId>spring-cloud-starter-consul-cluster</artifactId>
		<version>2.1.0.RELEASE</version>
	</dependency>

第二步在bootstrap.yml|properties中指定spring.cloud.consul.host為多節點,如下所示:

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

如果想輸出注冊的相關日志的話也可以在logback上加上日志配置

<logger name="org.springframework.cloud.consul" level="TRACE"/>

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

這里顯示我的應用節點分別都注冊到了集群的2個client上面,通過client的代理轉發請求到健康的server,從而實現了consul的高可用。

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

關于Consul集群版容器化部署與應用集成是怎樣的問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

屏东县| 将乐县| 固始县| 进贤县| 类乌齐县| 泾源县| 邯郸市| 开封市| 诏安县| 陈巴尔虎旗| 浦城县| 万荣县| 腾冲县| 磐石市| 遵义市| 富阳市| 景宁| 如皋市| 电白县| 女性| 开化县| 榕江县| 师宗县| 敖汉旗| 嫩江县| 泰宁县| 扎囊县| 保山市| 靖边县| 花垣县| 全州县| 平利县| 北碚区| 长岭县| 兴宁市| 布拖县| 汪清县| 四子王旗| 宜丰县| 景东| 抚远县|