consul是微服務治理方案,提供註冊/發現、k/v存儲、健康檢查以及多數據中心部署的能力。node
單節點安裝以下:linux
docker pull consul:0.9.2
啓動consul:web
docker run -it -p 8500:8500 consul:0.9.2
瀏覽器訪問:localhost:8500,能夠看到consul的web UI。docker
consul能夠做爲server或client模式運行。shell
本文着重描述consul集羣方式部署,不熟悉docker也不要緊,本文也有不少docker概念講解。bootstrap
docker安裝包
docker for linux/mac ,此安裝包包含:api
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等)同步網絡配置,保證節點在一個容器中。
雖然macOS自帶HyperKit虛擬解決方案,但由於docker 沒有HyperKit driver,因此須要用virtualbox,手動下載安裝或者docker早期解決方案Toolbox安裝過也可。網絡
最初的架構設計是這樣的:架構
這種架構也能建成功,但考慮到對swarm集羣的理解不要太狹隘,從新設計了另外的架構。
雖然不是全部的服務都適合部署到swarm集羣,可是consul是適合的,部署的方式是swarm 的manager節點和consul server重合,swarm的worker節點和consul client重合。
從新設計架構以下:
一、建立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容器運行環境。
二、構建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)
三、構建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 <vm1容器id> consul members
這裏我故意把vm3服務離開了。
小結:
consul不適合用1.13的deploy部署,仍是寫運維shell方式部署最省事,我上面爲了講清楚不少概念一步一步描述的。
deploy部署的話默認會虛擬出一個集羣vip,多個相同服務綁定到這個共同的vip上對外提供服務。
訪問http://192.168.99.100:8500,能夠看到consul管理界面:
下一篇文章演示Registrator和應用的部署。