微服務實踐專題系列(二):基於Docker swarm mode集羣的consul集羣部署

consul簡介

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 server:consul server之間彼此通訊並選舉一個leader。
  • consul client:集羣中的每一個節點都有本身的consul client,它負責監控運行在該節點上的服務的健康、與consul server通訊。一般和應用服務運行在一個節點中,一個consul client僅僅和某一個consul server通訊。
  • 集羣中的全部client和server共享狀態信息:即當一個應用服務註冊到一個client,這個信息將在全部與它鏈接的client和server上都共享可用了。

本文着重描述consul集羣方式部署,不熟悉docker也不要緊,本文也有不少docker概念講解。bootstrap

基礎準備

  1. docker安裝包
    docker for linux/mac ,此安裝包包含:api

    • 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:服務編排組件
  2. virtualbox

雖然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和應用的部署。

相關文章
相關標籤/搜索