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