Docker swarm集羣環境實現的新方式(docker+swarm+consul)

近幾年來,Docker 做爲一個開源的應用容器引擎,深受廣大開發者的歡迎。隨着 Docker 生態圈的不斷建設,應用領域愈來愈廣。雲計算,大數據,移動技術的快速發展,加之企業業務需求的不斷變化,緊隨技術更新的步伐,致使企業架構要隨時更改以適合業務需求。當前,愈來愈多的公司都已將以 Docker 爲表明的容器技術用於企業級業務平臺,好比:騰訊,京東,美團,新浪,阿里巴巴等互聯網公司。數據的安全、Docker 容器的穩定運行是衆多用戶關注的,這就要求咱們提供一套行之有效的管理大型容器集羣的總體解決方案。爲努力實現提供完整的容器技術服務棧及 Docker 化應用開發運維平臺給用戶的目標。在本文樣例中,筆者使用 Docker 公司發佈的 Docker Swarm 集羣管理工具以及相關的第三方工具做爲整個應用開發運維的基礎架構。
引言前端

本文中介紹的架構,是爲了實現多個 CentOS 7 主機上 Docker 集羣的部署。該架構使用三個工具,分別是 Docker Swarm, consul 和 pipework。
採用 Docker Swarm,主要由於這是 Docker 公司發佈的集羣管理工具,兼容性和穩定性相比其餘公司的 Docker 集羣管理工具更出色一些。
實現集羣內各節點之間服務發現的方式有多種,包括 etcd,consul 和 zookeeper 等。本文的架構採用的是 consul 方式。相比其餘工具,consul 提供 web 管理端且其採用的算法更能保證服務的高可用性。
Docker 容器的 IP 是由 Docker 自帶的默認路由經過 DHCP 自動分配,在實現 Docker 容器固定 IP 配置的第三方工具中,開源工具 pipework 簡單易用,穩定性優於 weave,更適合當前的網絡環境。
接下來,咱們分別介紹這三種工具,首先介紹 Docker Swarm 的概念和工做機制。
Docker Swarm 的基本概念和原理node

Docker Swarm 簡介linux

Swarm 是 Docker 公司在 2014 年 12 月初發布的一套用來管理 Docker 集羣的工具,將多個 Docker 宿主機變成一個單一的虛擬的主機。Swarm 使用標準的 Docker API 接口做爲其前端訪問入口,與 Docker Client 直接通訊。
Docker Swarm 工做原理git

Docker 客戶端經過 Docker API 向 Swarm 管理端發送請求,Swarm Manager 經過守護進程調用集羣中的某個節點來執行任務。由於容器都是運行在節點上,Swarm 做爲一個獨立的集羣管理工具,故並不會因某些緣由致使不能正常工做而影響集羣內全部節點的正常運行。當服務恢復正常後,Swarm 會讀取日誌來執行集羣的恢復動做。架構圖如圖 1:
圖 1.Docker Swarm 架構圖
Docker swarm集羣環境實現的新方式(docker+swarm+consul)github

架構說明:
Docker Client 是用戶端
Swarm Manager 做爲管理程序運行在一臺 CentOS 7 管理節點上,這個節點在 Swarm 集羣中承擔 leader 角色。
Swarm Node 01,02,N 是 Swarm 集羣的其餘成員,和 Swarm Manager 管理節點一塊兒組成完整的 Swarm 集羣,每個節點都會運行 Swarm 容器。
Docker Daemon 是運行於每個成員內的守護進程,承擔着調度器和路由器的功能。
Discovery service 提供服務發現功能。
經過本章你們瞭解了什麼是 Docker Swarm 及其工做原理,下一章將簡要介紹用於提供服務發現功能的工具 consul。
服務發現工具 Consulweb

Consul 是一個分佈式,高可用,支持多數據中心的服務發現和配置共享的服務管理軟件,可以與 Docker 容器無縫配合。
Consul 工具的優點算法

1.一致性協議採用 Raft 算法,用來保證服務的高可用。
2.支持 Health Checking 和 http 和 dns 協議接口。健康檢查是 Consul 提供的一項主要功能,根據配置定時調用外部程序執行有效性檢查,返回狀態有三種:正常,告警和失敗。Consul 提供兩種發現服務的方式,一種是經過 HTTP API 查看存在哪些服務,另一種是經過 consul agent 內置的 DNS 服務來完成。二者的差異在於後者能夠根據服務檢查的實時狀態動態調整可用的服務節點列表。
3.支持 Multi DataCenter,每個數據中心(集羣)是由 3-5 個 server 節點和若干 client 節點組成,集羣內 Client 和 Server 節點之間是經過 LAN gossip(下一節會有介紹)通訊,整個集羣內部通訊端口必須所有相同,默認是 7000。數據中心(集羣)彼此間的通訊則是經過 WAN gossip,使用的通訊端口和集羣內的通訊端口不要一致,從而實現了內外網的服務採用不一樣的端口進行監聽,進而能夠避免單數據中心的單點故障。
4.提供 web 管理界面,更加直觀。
Consul 的架構docker

筆者根據項目實際需求從新繪製了架構圖,如圖 2:
圖 2.Consul 架構shell

Docker swarm集羣環境實現的新方式(docker+swarm+consul)
本架構採用單數據中心集羣方式,由三個 Server 節點組成。
說明:
1.DataCenter 的全部節點都經過 Gossip 協議(經常使用於 P2P 的通訊協議),種子節點(當一個節點啓動的時候,它會從配置文件中讀取配置信息,這樣它就知道它屬於哪一個集羣,它須要跟哪一個節點通訊以獲取其餘節點信息,這個通訊節點稱爲種子節點。)每秒都會隨機向其餘節點發送本身所擁有的節點列表,以及須要傳播的消息。任何新加入的節點,就在這種傳播方式下很快地被全網所知道。實現彼此之間的通訊。Client 到 Server 是經過 LAN Gossip,而 DataCenter 之間的通訊和服務請求則經過 WAN Gossip 來隨機請求另一個 DataCenter 的 Server 節點,這個節點獲取請求後再 forward 到本 DataCenter 的 leader 節點上。
2.Server leader 的選舉是經過 Consul 的 Raft 算法實現,Leader 節點須要負責全部請求和處理,並複製給全部其餘的 Server 節點。反之,非 Leader 節點接收到 RPC (Remote Procedure Call Protocol)請求的時候也會 forward 到 leader 節點。
本章主要講述 consul 的特色和工做機制,接下來將經過實例讓你們學會使用 consul 工具。
如何使用 Consul 實現 Docker Swarm 集羣的搭建bootstrap

本章將詳細講述使用 Consul 實現 Docker Swarm 集羣配置的完整過程。整個過程主要包括三個部分,首先要準備必要的資源,其次建立提供服務的 consul 集羣,最後建立 Docker swarm 集羣。
配置搭建環境

準備 3 臺 CentOS 7.0 系統
安裝 Docker 1.8.1
編輯 /etc/sysconfig/docker 文件添加以下參數值:
other_args="-H=unix:///var/run/docker.sock-H=0.0.0.0:2375"

(2375 爲 docker deamon 的監聽端口)
下載 swarm 鏡像,consul 安裝包和提供 consul UI 界面的 dist 包
爲了讓你們更直觀的瞭解本環境,特用表格展示所用主機信息及其在集羣中扮演的角色和運行模式,表 1 以下所示:
表 1.節點角色定義表格
主機名 IP 集羣角色 Agent 模式
consulsvr 192.168.116.111 Server leader server
consul01 192.168.116.112 Server server
consul02 192.168.116.113 Server server
配置 consul 集羣

1.在表 1 定義的三臺主機上分別安裝 consul 和 dist
#unzip 0.5.2_linux_amd64.zip
命令解釋:解壓縮 consul 安裝包
#cp consul /usr/local/bin
命令解釋:把 consul 執行文件拷貝到/usr/local/bin 下,這個路徑已經添加到系統環境變量中,便於用戶在任何路徑下均可直接執行 consul 文件。
#unzip 0.5.2_web_ui.zip
命令解釋:解壓縮提供 web 界面的安裝包
2.在表 1 定義的集羣角色 Server leader 節點上運行
#consul agent -server -bootstrap -data-dir /home/data_consul -client 0.0.0.0 -bind=192.168.116.111 -ui-dir /home/dist -node=consulsvr -dc=datacenter &
命令解釋:定義節點 consulsvr 的 agent 運行在 server 模式;參數"-bootstrap"表示在 datacenter 中只能有一個 server 處於 bootstrap 模式並使本身成爲 leader 角色;參數"-data-dir"表示提供一個目錄用來存放 agent 的狀態;參數"client"表示 consul 綁定在哪一個 client 地址上,這個地址提供 HTTP、DNS 等服務,值"0.0.0.0"表示 client 地址不明確,表示的是一個本機的路由表裏沒有特定條目指明地址的集合;參數"-bind"表示該地址用來在集羣內部的通信,集羣內的全部節點到地址都必須是可達的,這裏定義的 192.168.116.111 是主機 consulsvr 的 IP 地址;參數"-ui-dir"表示提供存放 web ui 資源的路徑,該目錄必須是可讀的;參數"-node"表示節點在集羣中的名稱,在一個集羣中必須是惟一的,默認是該節點的主機名;參數"-dc"表示 datacenter 的名稱。
3.在表 1 定義的其餘 Server 節點上分別運行
#consul agent -server -data-dir /home/data_consul -client 0.0.0.0 -bind=192.168.116.112 -ui-dir /home/dist -node=consul01 -dc=datacenter &
命令解釋:用法同上,須要注意的就是不使用參數"-bootstrap","-bind"綁定的地址是表 1 定義的節點 consul01 的 IP 地址,參數"-node"定義的節點主機名是 consul01。
#consul agent -server -data-dir /home/data_consul -client 0.0.0.0 -bind=192.168.116.113 -ui-dir /home/dist -node=consul02 -dc=datacenter &
4.添加成員到 consul 集羣
#consul join 192.168.116.112 192.168.116.113
命令解釋:把表 1 定義的節點主機名 consul01 和 consul02 添加到 consul 集羣中。
5.驗證配置 consul 集羣是否成功的三種方式
a. #consul members
Docker swarm集羣環境實現的新方式(docker+swarm+consul)
結果說明:Status 值爲 alive 代表節點健康,三個節點狀態都是 alive 代表集羣運行正常。
b. #curl 192.168.116.111:8500/v1/catalog/nodes
Docker swarm集羣環境實現的新方式(docker+swarm+consul)
結果說明:這條命令的目的是查看當前集羣的全部成員,結果代表三個成員都在集羣內。
c. 在瀏覽器輸入 http://192.168.116.111:8500
Docker swarm集羣環境實現的新方式(docker+swarm+consul)
結果說明:經過 web ui 界面查看 consul 集羣成員信息,如圖所示表 1 定義的三個成員都已列出,圖標爲綠色代表節點健康,集羣正常運行。
配置 swarm 集羣

1.在 Consul server leader 節點上運行
#docker run -d -p 2377:2375 swarm manage consul://192.168.116.111:8500/swarm
命令說明:主節點啓動 swarm manage;參數"-p 2377:2375"表示將用於監聽 docker 守護進程的端口 2375 映射到本機的 2377 端口(請確保 2377 端口未被使用);"swarm"是本地 Docker swarm 鏡像;參數"manage"表示定義當前主機 consulsvr 爲集羣的主節點;參數"consul://192.168.116.111:8500/swarm"表示 consul 服務的地址。
2.在其餘節點上分別運行
#docker run -d swarm join --advertise=192.168.116.112:2375 consul://192.168.116.111:8500/swarm
命令說明:將表 1 定義的主機 consul01 添加到新建立的 swarm 集羣內;參數"-advertise"定義的是主機 consul01 對外的 IP 地址,其餘參數說明同上。
#docker run -d swarm join --advertise=192.168.116.113:2375 consul://192.168.116.111:8500/swarm
3.驗證配置 swarm 集羣是否成功
#docker run --rm swarm list consul://192.168.116.111:8500/swarm
Docker swarm集羣環境實現的新方式(docker+swarm+consul)
結果說明:查看所添加的成員 192.168.116.112 和 192.168.116.113 都集羣內,惟一要特殊說明的是參數"rm"表示 Docker 在容器結束時自動清理其所產生的數據。因咱們僅僅是爲了檢查 swarm 集羣狀態,對於短暫運行的容器可不保存數據。
經過本章,咱們初步掌握了 consul 工具的使用方法,使得 Docker Swarm 集羣的搭建又多了一個解決方案。那麼如何實現不一樣主機間 Docker 容器的互通呢?第三方工具 pipework 能夠幫咱們實現這一需求,下一章將首先介紹 pipework 的工做原理。
pipework 工做原理

pipework 是由 Docker 的工程師開發的一個 Docker 網絡配置工具,由 200 多行 shell 實現,方便易用,本章將簡要闡述其工做原理。
1.首先,使用 pipework 檢查 Linux 系統是否存在網橋,若不存在,則建立以"br"開頭的新網橋。
2.建立 veth pair 設備,實現 Docker 容器和網橋之間的鏈接。
3.使用 docker inspect 找到容器在主機中的 PID,而後經過 PID 建立容器網絡命名空間的軟鏈接。
4.將建立的 veth pair 設備分別加到 Docker 容器和網橋中。在容器中的名稱默認爲 eth1,可經過 pipework 的-i 參數修改該其名稱。
5.最後配置新網卡 eth1 的 IP 和路由。這樣容器通往外網的流量會經由新配置的 eth1 出去,而不是經過 eth0 和 docker0。
在瞭解了 pipework 如何工做後,咱們經過實例來體現 pipework 在 Docker 容器網絡配置上的做用。
經過實例實現 Docker 容器固定 IP 的分配

本章經過實例演示如何在 CentOS 7 上使用pipework開源工具爲 Docker 容器配置固定 IP 地址,從而實現不一樣主機之間的 Docker 容器互通,也可以知足部分用戶經過容器的 IP 地址直接訪問容器。
1.在表 1 定義的主機 consul01 節點上建立網橋
#vi /etc/sysconfig/network-scripts/ifcfg-br0
命令說明:編輯 CentOS 7 的網絡配置文件,新網橋名字是"br0"。
TYPE="Bridge"
BOOTPROTO="static"
IPADDR="192.168.116.111"
GATEWAY="192.168.116.1"
PREFIX="24"
NAME="br0"
DEVICE="br0"
ONBOOT="yes"
DNS1="192.168.148.50"
DOMAIN="cn.com"
2.設置原網卡橋接到新建立的網橋
#vi /etc/sysconfig/network-scripts/ifcfg-ens32
命令說明:文件 ifcfg-ens32 是 CentOS 7 的物理網卡配置文件,ens32 是網卡名字。
TYPE="Bridge"
BOOTPROTO="static"
IPADDR="192.168.116.111"
GATEWAY="192.168.116.1"
PREFIX="24"
NAME="br0"
DEVICE="br0"
ONBOOT="yes"
DNS1="192.168.148.50"
DOMAIN="cn.com"
3.安裝 pipework
#git clone https://github.com/jpetazzo/pipework
命令說明:從 github 上獲取安裝包
#cp ~/pipework/pipework /usr/local/bin/
命令說明:把 pipework 執行文件拷貝到/usr/local/bin 下,這個路徑已經添加到系統環境變量中,便於用戶在任何路徑下均可直接執行 pipework 文件。
4.啓動容器
#docker run -itd --name ubuntu114 ubuntu /bin/bash
命令說明:建立一個新的 Docker 容器,名字是 ubuntu114,參數"-it"表示須要同容器進行數據交互,參數"/bin/bash"表示進行交互式操做的 shell 類型。
5.配置固定 IP 地址爲 192.168.116.114
#pipework br0 ubuntu114 192.168.116.114/24@192.168.116.1
命令說明:將主機網卡 ens32 橋接到新網橋 br0 上,並把 ens32 的 IP 地址配置在 br0 上。"192.168.116.114"是 Docker 容器 ubuntu114 的 IP 地址,"192.168.116.1"是網關。
6.測試可否連通本地路由
#docker exec -it 9da2c2e3cfaa bash
Docker swarm集羣環境實現的新方式(docker+swarm+consul)

結果說明:Docker 容器 ID 爲"9da2c2e3cfaa"可以連通本地路由。
7.在表 1 定義的主機 consul02 節點上重複步驟 1 到 6,使用 192.168.116.119 做爲固定 IP 地址
8.驗證兩個節點上容器之間的訪問
Docker swarm集羣環境實現的新方式(docker+swarm+consul)
Docker swarm集羣環境實現的新方式(docker+swarm+consul)
結果說明:主機 consul01 上的 Docker 容器"9da2c2e3cfaa"和主機 consul02 上的 Docker 容器"18c42cd801b2"網絡鏈接是互通的。
注意事項:須要提醒的就是使用 pipework 工具以前必定要確保網絡交換機支持並打開 Promiscuous Mode (混雜模式)。
經過本章介紹,咱們掌握了 Docker 容器網絡配置工具 pipework 的使用方法,讓咱們在實現不一樣主機間的 Docker 容器的網絡互連多了一個新的解決方案。
總結

經過在 CentOS 7 上實現 Docker Swarm 集羣的搭建,同時使用開源工具 pipework 實現 Docker 容器的固定 IP 分配,知足了用戶對 Docker 容器在穩定性、安全性和網絡上的需求。集羣的部署,驗證了此架構可以保障 Docker 容器的正常運行和使用,是值得信賴和推廣的。同時咱們對開源工具 consul 和 pipework 有了深刻的瞭解。經過此樣例,咱們實現了 Docker 測試和開發平臺的集中管理,創建了可靠的 Docker 生態系統,促進了業務的可持續發展,爲從此提供 Docker 多樣化的應用開發運維平臺的架構模式打下了夯實的基礎。

使用docker 1.12 搭建多主機docker swarm集羣參考
http://blog.csdn.net/houdaiye/article/details/52457190
docker swarm 部署服務到集羣
http://www.ttlsa.com/docker/docker-swarm-deploy-services/

相關文章
相關標籤/搜索