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