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 集群。

配置搭建環境

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

    (2375 為 docker deamon 的監聽端口)
  4. 下載 swarm 鏡像,consul 安裝包和提供 consul UI 界面的 dist 包

為了讓大家更直觀的了解本環境,特用表格展現所用主機信息及其在集群中扮演的角色和運行模式,表 1 如下所示:

表 1.節點角色定義表格

配置 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/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 容器 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)

http://www.ibm.com/developerworks/cn/opensource/os-cn-docker-swarm/index.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM