摘要:簡介是微服務(wù)治理方案,提供注冊發(fā)現(xiàn)存儲健康檢查以及多數(shù)據(jù)中心部署的能力。重新設(shè)計架構(gòu)如下實施創(chuàng)建個虛擬機寫一個腳本批量創(chuàng)建創(chuàng)建個虛擬機給這個腳本授權(quán),并執(zhí)行后可以看到虛擬機創(chuàng)建完成。集群中的節(jié)點是自動加入網(wǎng)絡(luò)的。
consul簡介
consul是微服務(wù)治理方案,提供注冊/發(fā)現(xiàn)、k/v存儲、健康檢查以及多數(shù)據(jù)中心部署的能力。
單節(jié)點安裝如下:
docker pull consul:0.9.2
啟動consul:
docker run -it -p 8500:8500 consul:0.9.2
瀏覽器訪問:localhost:8500,可以看到consul的web UI。
consul可以作為server或client模式運行。
consul server:consul server之間彼此通信并選舉一個leader。
consul client:集群中的每個節(jié)點都有自己的consul client,它負責(zé)監(jiān)控運行在該節(jié)點上的服務(wù)的健康、與consul server通信。通常和應(yīng)用服務(wù)運行在一個節(jié)點中,一個consul client僅僅和某一個consul server通信。
集群中的所有client和server共享狀態(tài)信息:即當(dāng)一個應(yīng)用服務(wù)注冊到一個client,這個信息將在所有與它連接的client和server上都共享可用了。
本文著重描述consul集群方式部署,不熟悉docker也沒關(guān)系,本文也有很多docker概念講解。
基礎(chǔ)準(zhǔn)備
docker安裝包
docker for linux/mac ,此安裝包包含:
docker引擎
docker-machine:虛擬機管理
swarm mode:docker引擎內(nèi)置的容器編排功能,包括容器集群化和調(diào)度。
不要混淆swarm mode和docer swarm。
swarm mode是1.12版提供的能力,集成在docker引擎中,沒有和machine、compose集成,內(nèi)置了k/v存儲,并集成了overlay networks支持。
而docker swarm是1.12版之前的集群方案,是獨立的工具。在docker1.12之前,創(chuàng)建docker集群是需要用docker swarm的,并且需要額外的k/v存儲(consul、etcd等)同步網(wǎng)絡(luò)配置,保證節(jié)點在一個容器中。
docker-compose:服務(wù)編排組件
virtualbox
雖然macOS自帶HyperKit虛擬解決方案,但因為docker 沒有HyperKit driver,所以需要用virtualbox,手動下載安裝或者docker早期解決方案Toolbox安裝過也可。
架構(gòu)設(shè)計最初的架構(gòu)設(shè)計是這樣的:
這種架構(gòu)也能建成功,但考慮到對swarm集群的理解不要太狹隘,重新設(shè)計了另外的架構(gòu)。
雖然不是所有的服務(wù)都適合部署到swarm集群,但是consul是適合的,部署的方式是swarm 的manager節(jié)點和consul server重合,swarm的worker節(jié)點和consul client重合。
重新設(shè)計架構(gòu)如下:
1、創(chuàng)建4個虛擬機
寫一個shell腳本crete_vms.sh批量創(chuàng)建:
#!/bin/sh #創(chuàng)建4個虛擬機 set -e vms=("vm1" "vm2" "vm3" "vm4") for vm in ${vms[@]} do docker-machine create -d virtualbox --virtualbox-memory "1024" --virtualbox-cpu-count "1" --virtualbox-disk-size "2000" ${vm} done docker-machine ls
給這個腳本授權(quán):sudo chmod a+x create_vms.sh,并執(zhí)行后可以看到虛擬機創(chuàng)建完成。
小提示:
docker-machine 會自動加載一個Boot2Docker ISO用于構(gòu)建docker容器運行環(huán)境。
2、構(gòu)建swarm集群
2.1 用swarm mode方式將這4臺虛擬機構(gòu)建成一個集群
首先需要在一臺機器上初始化swarm,這里在vm1上進行初始化,先綁定vm1環(huán)境:
eval $(docker-machine env vm1)
然后初始化:
docker swarm init --advertise-addr $(docker-machine ip vm1)
這時,vm1變成一個集群中的manager節(jié)點了。
2.2 接下來將vm2作為一個manager節(jié)點加入這個swarm
先查詢加入命令:
docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-64eiwxk3wzoau20f7iv56fw0apgsxsk0gnzwb1e6okbezd373b-eyhb3sbu3fkcj8uyzw1bigayj 192.168.99.100:2377
然后綁定vm2環(huán)境:
eval $(docker-machine env vm2)
執(zhí)行加入命令:
docker swarm join --token SWMTKN-1-64eiwxk3wzoau20f7iv56fw0apgsxsk0gnzwb1e6okbezd373b-eyhb3sbu3fkcj8uyzw1bigayj 192.168.99.100:2377
2.3 將vm3和vm4作為worker節(jié)點加入這個swarm
先查詢加入命令:
docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-64eiwxk3wzoau20f7iv56fw0apgsxsk0gnzwb1e6okbezd373b-8ern27gy685jifwq7b9cjvhcn 192.168.99.100:2377
綁定vm3環(huán)境:
eval $(docker-machine env vm3)
執(zhí)行加入命令:
docker swarm join --token SWMTKN-1-64eiwxk3wzoau20f7iv56fw0apgsxsk0gnzwb1e6okbezd373b-8ern27gy685jifwq7b9cjvhcn 192.168.99.100:2377
綁定vm4環(huán)境:
eval $(docker-machine env vm4)
執(zhí)行加入命令:
docker swarm join --token SWMTKN-1-64eiwxk3wzoau20f7iv56fw0apgsxsk0gnzwb1e6okbezd373b-8ern27gy685jifwq7b9cjvhcn 192.168.99.100:2377
至此,swarm集群創(chuàng)建完成!
切換到manager 節(jié)點查看集群信息:
eval $(docker-machine env vm1) docker node ls
MANAGER STATUS顯示為Reachable表示該節(jié)點是一個manager,空表示是一個worker。
可以在swarm manager節(jié)點環(huán)境下查看網(wǎng)絡(luò)信息:
docker network ls
可以看到ingress的網(wǎng)絡(luò)是屬于swarm的,其他的都是本地(local)。swarm集群中的節(jié)點是自動加入overlay網(wǎng)絡(luò)的。
小提示:
docker-machine env vm的作用是查看vm的環(huán)境變量,而eval $(docker-machine env vm)是執(zhí)行,即將當(dāng)前shell與指定的虛擬機配置環(huán)境進行綁定,關(guān)掉shell也就釋放了這種綁定的環(huán)境。這個命令的最好使用場景就是:虛擬機中不需要安裝docker compose、machine等、也不需要上傳配置文件到虛擬機,就可以在當(dāng)前shell中執(zhí)行虛擬機中不存在的命令和文件來操作虛擬機容器和服務(wù)。
如果要解綁,執(zhí)行解綁命令:
eval $(docker-machine env -u)
3、構(gòu)建consul集群
3.1 先創(chuàng)建一個consul server leader,寫個consul-server-init.yml文件:
version: "3.3" services: consul-server: image: consul:0.9.2 environment: - "CONSUL_LOCAL_CONFIG={"disable_update_check": true}" - "CONSUL_CLIENT_INTERFACE=eth0" - "CONSUL_BIND_INTERFACE=eth1" #容器啟動時自動綁定eth1端口的IP entrypoint: - consul - agent - -server - -bootstrap #作為一個集群啟動 - -data-dir=/consul/data - -advertise={{ GetInterfaceIP "eth1" }} - -client=0.0.0.0 #consul服務(wù)偵聽地址提供HTTP、DNS、RPC等服務(wù),默認是127.0.0.1,對外提供服務(wù)需改成0.0.0.0 - -ui ports: - 8300:8300 #server rpc address - 8301:8301 #CLuster Serf Addr LAN - 8301:8301/udp - 8302:8302 #Cluster Serf Addr WAN - 8302:8302/udp - 8400:8400 #cli rpc endpoint - 8500:8500 #Web UI, http api - 8600:53/udp #DNS服務(wù) network_mode: host #此處指定host模式才能綁定到eth1
切換到vm1 manager節(jié)點
eval $(docker-machine env vm1) docker-compose -f consul-server-init.yml up -d
如果啟動報錯,可以通過docker logs container_id來查看錯誤信息,然后再docker-compose -f consul-server-init.yml down掉它。
3.2 再寫一個consul-server-join.yml用來創(chuàng)建consul server follower加入該集群。
version: "3.3" services: consul-server: image: consul:0.9.2 environment: - "CONSUL_LOCAL_CONFIG={"disable_update_check": true}" - "CONSUL_CLIENT_INTERFACE=eth0" - "CONSUL_BIND_INTERFACE=eth1" #容器啟動時自動綁定eth1端口的IP entrypoint: - consul - agent - -server - -data-dir=/consul/data - -retry-join=192.168.99.100 #加入一個集群 - -advertise={{ GetInterfaceIP "eth1" }} - client=0.0.0.0 - -ui ports: - 8300:8300 #server rpc address - 8301:8301 #CLuster Serf Addr LAN - 8301:8301/udp - 8302:8302 #Cluster Serf Addr WAN - 8302:8302/udp - 8400:8400 #cli rpc endpoint - 8500:8500 #Web UI, http api - 8600:53/udp #DNS服務(wù) network_mode: host #此處指定host(宿主機)模式才能綁定到eth1
切換到vm2環(huán)境
eval $(docker-machine env vm2) docker-compose -f consul-server-join.yml up -d
3.3 寫一個consul-client.yml來創(chuàng)建consul client并加入集群
version: "3.3" #第三版開始支持swarm mode集群的compose-file編排 services: consul-agent: image: consul:0.9.2 environment: - "CONSUL_LOCAL_CONFIG={"disable_update_check": true}" - "CONSUL_CLIENT_INTERFACE=eth0" - "CONSUL_BIND_INTERFACE=eth1" #容器啟動時自動綁定eth1端口的IP entrypoint: - consul - agent - -data-dir=/consul/data - -advertise={{GetInterfaceIP "eth1"}} - -retry-join=192.168.99.100 #consul server的地址,以便使該client與 server組成同一個集群 - -retry-join=192.168.99.101 network_mode: host #此處指定host(宿主機)模式才能綁定到eth1
分別切換到vm3和vm4環(huán)境執(zhí)行創(chuàng)建:
eval $(docker-machine env vm3) docker-compose -f consul-client.yml up -d eval $(docker-machine env vm4) docker-compose -f consul-client.yml up -d
到此為止,consul集群創(chuàng)建完成,查看集群信息:
docker exec -t
這里我故意把vm3服務(wù)離開了。
小結(jié):
consul不適合用1.13的deploy部署,還是寫運維shell方式部署最省事,我上面為了講清楚很多概念一步一步描述的。
deploy部署的話默認會虛擬出一個集群vip,多個相同服務(wù)綁定到這個共同的vip上對外提供服務(wù)。
訪問http://192.168.99.100:8500,可以看到consul管理界面:
下一篇文章演示Registrator和應(yīng)用的部署。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/27033.html
摘要:個推針對服務(wù)場景,基于和搭建了微服務(wù)框架,提高了開發(fā)效率。三容器化在微服務(wù)落地實踐時我們選擇了,下面將詳細介紹個推基于的實踐。 2016年伊始Docker無比興盛,如今Kubernetes萬人矚目。在這個無比需要創(chuàng)新與速度的時代,由容器、微服務(wù)、DevOps構(gòu)成的云原生席卷整個IT界。個推針對Web服務(wù)場景,基于OpenResty和Node.js搭建了微服務(wù)框架,提高了開發(fā)效率。在微服...
摘要:個推針對服務(wù)場景,基于和搭建了微服務(wù)框架,提高了開發(fā)效率。三容器化在微服務(wù)落地實踐時我們選擇了,下面將詳細介紹個推基于的實踐。 2016年伊始Docker無比興盛,如今Kubernetes萬人矚目。在這個無比需要創(chuàng)新與速度的時代,由容器、微服務(wù)、DevOps構(gòu)成的云原生席卷整個IT界。個推針對Web服務(wù)場景,基于OpenResty和Node.js搭建了微服務(wù)框架,提高了開發(fā)效率。在微服...
摘要:微服務(wù)架構(gòu)模式使得每個微服務(wù)獨立部署,且每個服務(wù)獨立擴展,開發(fā)者不再需要協(xié)調(diào)其它服務(wù)部署對本服務(wù)的影響。微服務(wù)架構(gòu)模式使得持續(xù)化部署成為可能。所以使用微服務(wù)不是必須的,而是在適當(dāng)?shù)膶嶋H,架構(gòu)適應(yīng)應(yīng)用場景的一種改變。 近段時間離職,跟同事們講解我之前所做的微服務(wù)相關(guān)產(chǎn)品,對于同事們提出的問題,做了如下整理出來,加上自己的理解,分享出來跟大家一起探討下: 問題預(yù)覽 我為什么要換微服務(wù)?能...
摘要:其一將用于代理與面向公開的服務(wù)之間的通信。數(shù)據(jù)庫上線并開始運行后,我們接下來部署后端。現(xiàn)在,會幫助我們完成全部負載均衡工作。這樣所有來自代理的請求都將指向網(wǎng)絡(luò),并由后者跨越全部實例執(zhí)行負載均衡。 七夕大家過得怎么樣?今天數(shù)人云帶大家回歸技術(shù)和干貨。雖然我們能夠在Swarm集群當(dāng)中部署任意數(shù)量的服務(wù),但這并不代表各項服務(wù)全部可為用戶所訪問。而新的Swarm網(wǎng)絡(luò)使得各項服務(wù)之間能夠更為輕松...
摘要:當(dāng)然此時的局限性較大,比如沒有副本和負載均衡的概念,這導(dǎo)致服務(wù)無法高可用當(dāng)然也更不存在什么服務(wù)網(wǎng)絡(luò)管理和跨節(jié)點數(shù)據(jù)存儲這些東西沒有服務(wù)模型集群中服務(wù)間關(guān)系和啟動順序編排也很復(fù)雜于是就有了下面的的誕生。 showImg(https://segmentfault.com/img/remote/1460000015317037?w=1885&h=1153); 概述 在我的《Docker S...
閱讀 6219·2021-11-22 15:32
閱讀 833·2021-11-11 16:54
閱讀 3174·2021-10-13 09:40
閱讀 2176·2021-09-03 10:35
閱讀 1849·2021-08-09 13:47
閱讀 1882·2019-08-30 15:55
閱讀 1943·2019-08-30 15:43
閱讀 2466·2019-08-29 17:06