Docker搭建Swarm叢集
非常好的文章,整個複製過來了,覺得好請點連結,原文更精彩!
Docker 叢集環境實現的新方式
通過 Docker Swarm 和 Consul 配置叢集並實現各主機上 Docker 容器的互通
近幾年來,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 的基本概念和原理
Docker Swarm 簡介
Swarm 是 Docker 公司在 2014 年 12 月初發布的一套用來管理 Docker 叢集的工具,將多個 Docker 宿主機變成一個單一的虛擬的主機。Swarm 使用標準的 Docker API 介面作為其前端訪問入口,與 Docker Client 直接通訊。
Docker Swarm 工作原理
Docker 客戶端通過 Docker API 向 Swarm 管理端傳送請求,Swarm Manager 通過守護程序呼叫叢集中的某個節點來執行任務。因為容器都是執行在節點上,Swarm 作為一個獨立的叢集管理工具,故並不會因某些原因導致不能正常工作而影響叢集內所有節點的正常執行。當服務恢復正常後,Swarm 會讀取日誌來執行叢集的恢復動作。架構圖如圖 1:
圖 1.Docker Swarm 架構圖
架構說明:
- 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。
服務發現工具 Consul
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 的架構
筆者根據專案實際需求重新繪製了架構圖,如圖 2:
圖 2.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 叢集的搭建
本章將詳細講述使用 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
結果說明:Status 值為 alive 表明節點健康,三個節點狀態都是 alive 表明叢集執行正常。
b. #curl 192.168.116.111:8500/v1/catalog/nodes
結果說明:這條命令的目的是檢視當前叢集的所有成員,結果表明三個成員都在叢集內。
c. 在瀏覽器輸入 http://192.168.116.111:8500
結果說明:通過 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
|
結果說明:檢視所新增的成員 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"。
1 2 3 4 5 6 7 8 9 10 |
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 是網絡卡名字。
1 2 3 4 5 6 7 8 9 10 |
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/[email protected]
|
命令說明:將主機網絡卡 ens32 橋接到新網橋 br0 上,並把 ens32 的 IP 地址配置在 br0 上。"192.168.116.114"是 Docker 容器 ubuntu114 的 IP 地址,"192.168.116.1"是閘道器。
6.測試能否連通本地路由
#docker exec -it 9da2c2e3cfaa bash
|
結果說明:Docker 容器 ID 為"9da2c2e3cfaa"能夠連通本地路由。
7.在表 1 定義的主機 consul02 節點上重複步驟 1 到 6,使用 192.168.116.119 作為固定 IP 地址
8.驗證兩個節點上容器之間的訪問
結果說明:主機 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 多樣化的應用開發運維平臺的架構模式打下了夯實的基礎。
參考資源 (resources)
- 參考 Docker 官方文件 ,檢視 Docker Swarm 工具詳細介紹。
- 參考 InfoQ 論壇文件 ,檢視 Pipework 工具使用說明。