UCP 是企業(yè)級(jí)的容器即服務(wù)平臺(tái)的圖形化操作界面。UCP 使用 Docker 引擎,并添加了各種企業(yè)喜歡以及需要的功能。例如 RBAC、可配置、認(rèn)證、高可用控制平面以及簡(jiǎn)單界面。在 UCP 內(nèi)部,是一個(gè)容器化的微服務(wù)應(yīng)用,以多個(gè)容器的形式運(yùn)行。
架構(gòu)層面上講,UCP 是基于 Swarm 模式下的 Docker EE 構(gòu)建的。如下圖所示,UCP 控制平面運(yùn)行在 Swarm 管理節(jié)點(diǎn)上,應(yīng)用則部署在 Swarm 工作節(jié)點(diǎn)上。

UCP 管理節(jié)點(diǎn)必須是 Linux。工作節(jié)點(diǎn)既可以 Windows,也可以是 Linux。
在規(guī)劃 UCP 安裝的時(shí)候,合理設(shè)置集群大小和規(guī)格十分重要。下面介紹該過程中需要考慮的一些方面。
集群中全部節(jié)點(diǎn)的時(shí)鐘需要同步(例如 NTP)。如果沒有同步,可能導(dǎo)致一些很難定位的問題。全部節(jié)點(diǎn)都要有自己的靜態(tài) IP 地址和固定的 DNS 名稱。
默認(rèn)情況下,UCP 管理節(jié)點(diǎn)不運(yùn)行用戶工作負(fù)載。推薦使用這種最佳實(shí)踐,并建議用戶在生產(chǎn)環(huán)境中強(qiáng)制使用。該方式使得管理節(jié)點(diǎn)只需關(guān)注控制平面職責(zé)。同時(shí)也能簡(jiǎn)化問題定位。
用戶需要保證管理節(jié)點(diǎn)數(shù)量為奇數(shù)。這樣就能避免出現(xiàn)腦裂等類似場(chǎng)景時(shí),會(huì)導(dǎo)致管理節(jié)點(diǎn)不可用,或者與集群割裂的現(xiàn)象。理想數(shù)量為 3、5 或者 7,3 或者 5 是較常用的。多于 7 的話,可能導(dǎo)致后臺(tái) Raft 算法或者集群一致性的問題。如果不能提供 3 個(gè)管理節(jié)點(diǎn),1 個(gè)要好于 2 個(gè)!
如果配置了后臺(tái)計(jì)劃(用戶應(yīng)當(dāng)配置)并進(jìn)行日常備份,可能需要部署 5 個(gè)管理節(jié)點(diǎn)。這是因?yàn)?Swarm 和 UCP 的備份操作需要停止 Docker 和 UCP 服務(wù)。5 個(gè)管理節(jié)點(diǎn)可以保證在執(zhí)行類似操作時(shí)集群的彈性。
管理節(jié)點(diǎn)應(yīng)當(dāng)根據(jù)數(shù)據(jù)中心可用域進(jìn)行部署。用戶最不想見到的場(chǎng)景,就是全部 UCP 管理節(jié)點(diǎn)所在的域都不可用。但是,管理節(jié)點(diǎn)之間的通信必須經(jīng)由高速可靠的網(wǎng)絡(luò)完成。
因此如果數(shù)據(jù)中心可用域之間網(wǎng)絡(luò)狀況不佳,最好還是將所有管理節(jié)點(diǎn)部署在相同域之中。有件事已經(jīng)約定成俗,即在公有云上部署時(shí),需要將管理節(jié)點(diǎn)部署在同區(qū)域內(nèi)的可用域中??鐓^(qū)域通常會(huì)受到低可靠性和高延遲網(wǎng)絡(luò)的影響。
工作節(jié)點(diǎn)的數(shù)量可以根據(jù)需求設(shè)置,因?yàn)樗鼈儾⒉粫?huì)參與到集群 Raft 操作當(dāng)中,所以就不會(huì)影響控制平面操作。
規(guī)劃工作節(jié)點(diǎn)的規(guī)格和數(shù)量,需要理解計(jì)劃部署在集群上的應(yīng)用需求。例如,理解之后能幫助用戶確定需要多少 Windows 節(jié)點(diǎn)和 Linux 節(jié)點(diǎn)。同時(shí)還需要知道應(yīng)用是否有特殊需求,需要工作節(jié)點(diǎn)的定制化來(lái)支持,例如 PCI 類工作負(fù)載。
此外,雖然 Docker 引擎是輕量級(jí)的,但其上運(yùn)行的容器化應(yīng)用不一定也是。出于這樣的考慮,根據(jù)應(yīng)用的 CPU、RAM、網(wǎng)絡(luò)以及磁盤 I/O 需求規(guī)劃節(jié)點(diǎn)數(shù)目就很重要了。
確定合理的節(jié)點(diǎn)配置并不是什么好玩的事兒,這完全取決于工作負(fù)載。但是,Docker 網(wǎng)站上對(duì) Linux Docker UCP 2.2.4 的最低配置有如下建議。
? UCP 管理節(jié)點(diǎn)運(yùn)行 DTR:8GB RAM,3GB 磁盤空間。
? UCP 工作節(jié)點(diǎn):4GB RAM,3GB 空閑磁盤空間。
推薦配置如下。
? 運(yùn)行 DTR 的 UCP 管理節(jié)點(diǎn):8GB RAM,4 核 CPU,100GB 磁盤。
? UCP 工作節(jié)點(diǎn):4GB RAM,25-100GB 空閑磁盤空間。
該建議僅供參考,用戶在確定配置時(shí)需要自己多加練習(xí)。
有一點(diǎn)是確認(rèn)的:Window 鏡像會(huì)比 Linux 鏡像稍大一些。所以規(guī)劃時(shí)務(wù)必考慮該因素。
關(guān)于需求規(guī)劃最后多說(shuō)一點(diǎn)。Docker Swarm 和 Docker UCP 簡(jiǎn)化了管理節(jié)點(diǎn)和工作節(jié)點(diǎn)的添加 / 刪除工作。新加入的管理節(jié)點(diǎn)被自動(dòng)加入到 HA 控制平面,新加入的工作節(jié)點(diǎn)馬上就能參與到工作負(fù)載調(diào)度當(dāng)中。
類似的,刪除管理節(jié)點(diǎn)和工作節(jié)點(diǎn)也非常簡(jiǎn)單。只要擁有多個(gè)管理節(jié)點(diǎn),就可以在不影響集群操作的情況下移除其中一個(gè)。移除工作節(jié)點(diǎn)時(shí),需要清理該節(jié)點(diǎn)上的工作負(fù)載,然后從運(yùn)行中的集群移除。上述特點(diǎn)使得 UCP 對(duì)管理節(jié)點(diǎn)和工作節(jié)點(diǎn)的變更做到不感知。
下面主要介紹在新集群的第一個(gè)管理節(jié)點(diǎn)上安裝 Docker UCP 的完整過程。
⒈ 在某個(gè) Linux Docker EE 節(jié)點(diǎn)上運(yùn)行下面的命令,該節(jié)點(diǎn)應(yīng)是計(jì)劃中作為 UCP 集群的第一個(gè)管理節(jié)點(diǎn)。
關(guān)于命令需要補(bǔ)充說(shuō)明,示例在安裝 UCP 時(shí),使用了 docker/ucp:2.2.5 鏡像,用戶需要替換為適合自己的版本。--host-address 設(shè)置了 Web 界面訪問地址。如果用戶在 AWS 上完成安裝,并且計(jì)劃通過互聯(lián)網(wǎng)訪問公司的網(wǎng)絡(luò),這里就需要設(shè)置 AWS 的公共 IP 地址。
$ docker container run --rm -it --name ucp \
-v /var/run/docker.sock:/var/run/docker.sock \
docker/ucp:2.2.5 install \
--host-address <node-ip-address> \
--interactive
⒉ 配置管理員賬號(hào)。安裝過程會(huì)提示用戶輸入用戶名和密碼,作為 UCP 管理員賬號(hào)。這是一個(gè)本地賬號(hào),建議遵守公司規(guī)范來(lái)創(chuàng)建用戶名和密碼。創(chuàng)建后千萬(wàn)不要忘記。
⒊ 主體別名(Subject Alternative Name,SAN)。安裝程序會(huì)提示輸入能訪問 UCP 的 IP 地址和名稱列表。列表內(nèi)容可以是私有 IP 地址以及 DNS 名稱,并且會(huì)加入到賬號(hào)當(dāng)中。
安裝過程還需注意以下的一些內(nèi)容。
UCP 基于 Docker Swarm,這意味著 UCP 管理節(jié)點(diǎn)需要運(yùn)行在 Swarm 管理節(jié)點(diǎn)上。如果在某個(gè)節(jié)點(diǎn)上以單引擎模式(Single-Engine Mode)安裝 UCP,則該節(jié)點(diǎn)會(huì)默認(rèn)切換為 Swarm 模式。
安裝程序拉取 UCP 服務(wù)所需的全部鏡像,并完成相應(yīng)容器的啟動(dòng)。下面列舉了部分由安裝程序拉取的鏡像。
INFO[0008] Pulling required images... (this may take a while)
INFO[0008] Pulling docker/ucp-auth-store:2.2.5
INFO[0013] Pulling docker/ucp-hrm:2.2.5
INFO[0015] Pulling docker/ucp-metrics:2.2.5
INFO[0020] Pulling docker/ucp-swarm:2.2.5
INFO[0023] Pulling docker/ucp-auth:2.2.5
INFO[0026] Pulling docker/ucp-etcd:2.2.5
INFO[0028] Pulling docker/ucp-agent:2.2.5
INFO[0030] Pulling docker/ucp-cfssl:2.2.5
INFO[0032] Pulling docker/ucp-dsinfo:2.2.5
INFO[0080] Pulling docker/ucp-controller:2.2.5
INFO[0084] Pulling docker/ucp-proxy:2.2.5
部分比較值得關(guān)注的鏡像包括以下幾點(diǎn)。
? ucp-agent 這是 UCP 核心代理。該代理會(huì)部署到集群的全部節(jié)點(diǎn)上,用于確保 UCP 所需容器全部啟動(dòng)并運(yùn)行。
? ucp-etcd 集群持久化鍵值對(duì)存儲(chǔ)。
? ucp-auth 共享鑒權(quán)服務(wù)(在 DTR 的單點(diǎn)登錄中也用到了)。
? ucp-proxy 控制對(duì)本地 Docker Socket 端口的訪問,這樣未認(rèn)證的客戶端就不能擅自篡改集群了。
? ucp-swarm 提供對(duì)底層 Swarm 的適配。
最終,安裝程序創(chuàng)建了一對(duì)根 CA:一個(gè)用于集群內(nèi)部通信,另一個(gè)用于外部訪問。CA 使用自簽名證書,這對(duì)于實(shí)驗(yàn)和測(cè)試環(huán)境來(lái)說(shuō)很好,但是不適用于生產(chǎn)環(huán)境。
為了完成可信 CA 證書的 UCP 安裝,需要使用下面 3 個(gè)文件完成證書綁定。
? ca.pem:可信 CA 證書(通常是公司內(nèi)部 CA)。
? cert.pem:UCP 的公開證書。該證書包含了全部被授權(quán)訪問集群的 IP 地址和 DNS 名稱,包括位于集群之前的負(fù)載均衡器。
? key.pem:UCP 的私鑰。
如果已經(jīng)有了上述文件,則需要將其掛載到 Dockerucp-controller-server-certs 卷下,并且使用 --external-ca 數(shù)指定卷。用戶也可以在安裝完成后,通過 Web 界面中的管理員設(shè)置(Admin Setting)頁(yè)面來(lái)修改證書。
UCP 安裝程序輸出中的最后一段內(nèi)容,就是訪問所用的 URL。
<Snip>
INFO[0049] Login to UCP at https://<IP or DNS>:443
通過 Web 瀏覽器訪問該地址并且登錄。如果使用自簽名證書,則需要確認(rèn)瀏覽器的告警信息。同時(shí)還需要指定許可證文件,該文件可以從 Docker 商店的 My Content 中下載。
登錄后即可訪問 UCP 管理面板,如下圖所示。

到目前為止,一個(gè)單點(diǎn)登錄 UCP 集群已經(jīng)就緒。
可以通過管理面板底部的 Add Nodes 鏈接為集群添加更多的管理節(jié)點(diǎn)和工作節(jié)點(diǎn)。
下圖展示了添加節(jié)點(diǎn)的界面。用戶可以選擇添加管理節(jié)點(diǎn)或者工作節(jié)點(diǎn),然后界面中就會(huì)給出對(duì)應(yīng)的命令,在待添加節(jié)點(diǎn)上運(yùn)行即可。示例中選擇添加 Linux 工作節(jié)點(diǎn)。注意,這是一個(gè) docker swarm命令。

添加的節(jié)點(diǎn)會(huì)加入 Swarm 集群,并且配置所需的 UCP 服務(wù)。如果添加的是管理節(jié)點(diǎn),推薦在連續(xù)添加之間稍作等待。這樣可以給 Docker 留出下載并運(yùn)行所需 UCP 容器的機(jī)會(huì),同時(shí)也允許集群注冊(cè)新的管理節(jié)點(diǎn)并達(dá)到法定人數(shù)。
新加入的管理節(jié)點(diǎn)會(huì)自動(dòng)配置到高可用(HA)的一致性 Raft 組當(dāng)中,并且被授權(quán)可以訪問集群存儲(chǔ)。此外,雖然外部負(fù)載均衡器通常不被認(rèn)作 UCP HA 的核心部分,但其本身對(duì)外提供了穩(wěn)定的 DNS 名稱,屏蔽了一些后端場(chǎng)景,如某個(gè)節(jié)點(diǎn)掛掉。
用戶需要為 443 端口的 TCP 透?jìng)髋渲猛獠康呢?fù)載均衡器,通過自定義的 HTTPS 心跳檢查 https:///_ping 確認(rèn) UCP 管理節(jié)點(diǎn)的狀態(tài)。
現(xiàn)在一個(gè)工作狀態(tài)的 UCP 已經(jīng)搭建完成,可以通過 Admin Settings 頁(yè)面查看相關(guān)選項(xiàng),如下圖所示。

所有對(duì) UCP 的訪問,都經(jīng)由身份管理子系統(tǒng)。這意味著用戶在集群上執(zhí)行任何操作前,首先需要通過用戶名和密碼進(jìn)行認(rèn)證。這些操作包括集群的管理,以及服務(wù)的部署和管理。
用戶使用 UI 界面的時(shí)候已經(jīng)體驗(yàn)過了,必須使用用戶名和密碼才能登錄。在 CLI 中也是一樣的,用戶不能在未登錄的情況下通過 UCP 執(zhí)行命令!這是因?yàn)?UCP 集群中本地 Docker Socket 受到 ucp-proxy 服務(wù)的保護(hù),不會(huì)接受未認(rèn)證命令。
每個(gè)運(yùn)行 Docker CLI 的節(jié)點(diǎn),都能部署并管理 UCP 集群的工作負(fù)載,只要該節(jié)點(diǎn)存在一個(gè)有效 UCP 用戶認(rèn)證。
本節(jié)中會(huì)創(chuàng)建一個(gè)新 UCP 用戶,新建并下載該用戶的綁定證書,接著創(chuàng)建一個(gè) Docker 客戶端并使用該證書。在完成上述步驟后,會(huì)解釋其工作原理。
⒈ 如果還沒就緒,則以管理員身份登錄 UCP。
⒉ 單擊 User Management > Users,創(chuàng)建一個(gè)新用戶。因?yàn)檫€未討論角色和權(quán)限相關(guān)的內(nèi)容,所以將用戶設(shè)置為 Docker EE 管理員。
⒊ 在新用戶選中狀態(tài)下,單擊 Configure 下拉框,然后選擇 Client Bundle,如下圖所示。

⒋ 單擊 Client Bundle +鏈接,生成并下載該用戶的客戶端 Bundle。
此時(shí)需要注意,客戶端 Bundle 是與用戶相關(guān)的。因此,該 Bundle 能夠使得配置好的 Docker 客戶端在 UCP 集群上以該 Bundle 所屬用戶的身份執(zhí)行命令。
⒌ 復(fù)制下載內(nèi)容到 Docker 客戶端,該客戶端是用戶配置用于管理 UCP 的。
⒍ 登錄客戶端節(jié)點(diǎn),執(zhí)行下面的全部命令。
⒎ 解壓縮客戶端綁定內(nèi)容。
$ unzip ucp-bundle-nigelpoulton.zip
Archive: ucp-bundle-nigelpoulton.zip
extracting: ca.pem
extracting: cert.pem
extracting: key.pem
extracting: cert.pub
extracting: env.sh
extracting: env.ps1
extracting: env.cmd
示例使用 Linux 的 unzip 包將客戶端綁定解壓縮到當(dāng)前目錄。需要將命令中客戶端綁定的名稱替換為自己環(huán)境中的名稱。
⒏ 使用恰當(dāng)?shù)哪_本配置 Docker 客戶端。env.sh 可以在 Linux 和 Mac 上使用,env.ps 和 env.cmd 可以在 Windows 上使用。
運(yùn)行腳本需要管理員 /root 權(quán)限。示例在 Windows 和 Linux 上均可以執(zhí)行。
$ eval "$(<env.sh)"
此時(shí),客戶端節(jié)點(diǎn)配置已經(jīng)完成。
⒐ 測(cè)試權(quán)限。
$ docker version
<Snip>
Server:
Version: ucp/2.2.5
API version: 1.30 (minimum version 1.20)
Go version: go1.8.3
Git commit: 42d28d140
Built: Wed Jan 17 04:44:14 UTC 2018
OS/Arch: linux/amd64
Experimental: false
注意到輸出中的 Server 部分顯示其版本為 ucp/2.2.5,這就說(shuō)明 Docker 客戶端已經(jīng)成功連接到 UCP 節(jié)點(diǎn)的 daemon 了。
實(shí)際上,腳本共配置了 3 個(gè)環(huán)境變量:DOCKER_HOST、DOCKER_TLS_VERIFY 和 DOCKER_CERT_PATH。
DOCKER_HOST 將客戶端指向了遠(yuǎn)端位于 UCP 控制層中的 Docker daemon。比如 DOCKER_HOST=tcp://34.242.196.63:443,可以看到,是通過 443 端口訪問的。
DOCKER_TLS_VERIFY 設(shè)置為 1,告訴客戶端使用 TLS 認(rèn)證的客戶端模式。DOCKER_CERT_PATH 告訴 Docker 客戶端綁定證書的具體位置。
最終結(jié)果就是所有 Docker 命令都會(huì)在客戶端使用用戶證書簽名,然后經(jīng)由網(wǎng)絡(luò)發(fā)送到遠(yuǎn)端的 UCP 管理節(jié)點(diǎn),如下圖所示。

首先并且最重要的是,高可用(HA)并不等價(jià)于備份!
思考下面的例子。有一個(gè)包含 5 個(gè)管理節(jié)點(diǎn)的 UCP 集群。所有管理節(jié)點(diǎn)都處于健康狀態(tài),并且控制平面開啟了復(fù)制功能。某個(gè)心懷怨恨的員工對(duì)集群進(jìn)行破壞(或者刪除了全部用戶賬戶)。破壞操作會(huì)復(fù)制到全部 5 個(gè)管理節(jié)點(diǎn),導(dǎo)致集群被破壞。這種場(chǎng)景下 HA 沒有絲毫幫助。此時(shí)需要的,是備份!
一個(gè) UCP 集群主要由 3 個(gè)部分構(gòu)成,也是需要分別備份的內(nèi)容:Swarm、UCP 和 Docker 可信鏡像倉(cāng)庫(kù)服務(wù)(DTR)。
接下來(lái)會(huì)展示如何完成 Swarm 和 UCP 的備份,有關(guān) DTR 備份的內(nèi)容本章會(huì)在稍后進(jìn)行介紹。
雖然 UCP 位于 Swarm 上層,但是它們是互相獨(dú)立的。Swarm 維護(hù)了全部節(jié)點(diǎn)關(guān)系、網(wǎng)絡(luò)以及服務(wù)定義。UCP 在其上層構(gòu)建,維護(hù)自己的數(shù)據(jù)庫(kù)和卷存儲(chǔ)來(lái)記錄用戶、組、授權(quán)、Bundle、許可證文件、認(rèn)證等信息。
一起來(lái)看一下如何進(jìn)行 Swarm 備份。
Swarm 配置和狀態(tài)保存在 /var/lib/docker/swarm 中,其中包含了 Raft 日志密鑰,并且會(huì)復(fù)制到每個(gè)管理節(jié)點(diǎn)。Swarm 備份就是復(fù)制該目錄下的所有文件。
因?yàn)樵撔畔?huì)復(fù)制到每個(gè)管理節(jié)點(diǎn),所以用戶可以在任何管理節(jié)點(diǎn)上進(jìn)行備份。
備份時(shí)需要在待執(zhí)行備份操作的節(jié)點(diǎn)上停止 Docker。這意味著在主管理節(jié)點(diǎn)上執(zhí)行備份操作不是一個(gè)好的選擇,因?yàn)檫@樣會(huì)導(dǎo)致重新選主。
執(zhí)行備份時(shí)最好選擇在業(yè)務(wù)的低峰期進(jìn)行,雖然對(duì)于擁有多管理節(jié)點(diǎn)的 Swarm 來(lái)說(shuō),停止某個(gè)管理節(jié)點(diǎn)并不會(huì)出現(xiàn)問題,但這種操作還是會(huì)增加集群在另一管理節(jié)點(diǎn)宕機(jī)時(shí)出現(xiàn)高可用有效節(jié)點(diǎn)數(shù)不足的情況。
在執(zhí)行備份前,創(chuàng)建一些 Swarm 對(duì)象可以驗(yàn)證備份和回滾操作是否確實(shí)生效了。示例中待備份的 Swarm,擁有一個(gè)名為 vantage-net 的覆蓋網(wǎng)絡(luò),以及名為 vantage-svc 的 Swarm 服務(wù)。
⒈ 停止待備份 Swarm 管理節(jié)點(diǎn)上的 Docker。這樣會(huì)停止該節(jié)點(diǎn)上的全部 UCP 容器。如果 UCP 配置了 HA,則其他管理節(jié)點(diǎn)會(huì)保證控制平面處于可用狀態(tài)。
$ service docker stop
⒉ 備份 Swarm 配置。示例使用 Linux tar 工具來(lái)執(zhí)行文件復(fù)制??呻S意選擇其他工具。
$ tar -czvf swarm.bkp /var/lib/docker/swarm/
tar: Removing leading `/' from member names
/var/lib/docker/swarm/
/var/lib/docker/swarm/docker-state.json
/var/lib/docker/swarm/state.json
<Snip>
⒊ 確認(rèn)備份文件存在。
$ ls -l
-rw-r--r-- 1 root root 450727 Jan 29 14:06 swarm.bkp
備份文件的保存周期需要視公司具體的備份策略而定。
⒋ 重啟 Docker。
$ service docker restart
現(xiàn)在 Swarm 備份完成,是時(shí)候備份 UCP 了。在開始 UCP 備份前,需要注意如下幾點(diǎn)。
因?yàn)?UCP 備份任務(wù)以容器方式運(yùn)行,所以如果想進(jìn)行備份,需要 Docker 保持運(yùn)行狀態(tài)。
可以在集群中的任意一臺(tái) UCP 管理節(jié)點(diǎn)上運(yùn)行備份,并且只需要在一個(gè)節(jié)點(diǎn)上運(yùn)行即可(UCP 復(fù)制功能會(huì)將配置信息復(fù)制到全部管理節(jié)點(diǎn),所以沒有必要備份多節(jié)點(diǎn))。
對(duì) UCP 進(jìn)行備份會(huì)停止所在管理節(jié)點(diǎn)上的全部 UCP 容器。在該前提下,備份操作需要運(yùn)行在一個(gè)高可用 UCP 集群上,并且最好是在業(yè)務(wù)低峰期運(yùn)行。
自始至終,執(zhí)行備份的管理節(jié)點(diǎn)上的用戶工作負(fù)載并不會(huì)停止。但是,并不建議在 UCP 管理節(jié)點(diǎn)上執(zhí)行用戶工作負(fù)載。
下面開始備份 UCP。在某個(gè) UCP 管理節(jié)點(diǎn)上執(zhí)行下面的命令。該節(jié)點(diǎn)的 Docker 需要保持運(yùn)行狀態(tài)。
$ docker container run --log-driver none --rm -i --name ucp \
-v /var/run/docker.sock:/var/run/docker.sock \
docker/ucp:2.2.5 backup --interactive \
--passphrase "Password123" > ucp.bkp
該命令很長(zhǎng),一起來(lái)看一下每個(gè)步驟的內(nèi)容。
第一行是標(biāo)準(zhǔn)的 docker container run 命令,讓 Docker 運(yùn)行某個(gè)容器,運(yùn)行時(shí)不開啟日志,在運(yùn)行結(jié)束后進(jìn)行刪除,同時(shí)調(diào)用 ucp;第二行將 Docker socket 掛載到容器中,這樣容器可以通過訪問 Docker API 來(lái)停止運(yùn)行;第三行是告訴 Docker 在容器內(nèi)基于 docker/ ucp:2.2.5 鏡像運(yùn)行 backup --interactive 命令;最后一行創(chuàng)建了名為 ucp.bkp 的加密文件,并且用密碼進(jìn)行安全保護(hù)。
下面是值得注意的幾點(diǎn)。
指定具體的 UCP 鏡像版本(標(biāo)簽)是一個(gè)好辦法,示例中指定為 docker/ucp:2.2.5。這樣做是因?yàn)檫M(jìn)行備份和恢復(fù)操作的時(shí)候,建議使用相同版本的鏡像。如果沒有顯示指定鏡像版本,Docker 會(huì)默認(rèn)使用標(biāo)簽為 latest 的鏡像,這可能導(dǎo)致執(zhí)行備份和恢復(fù)操作時(shí)鏡像版本存在差異。
每次備份都應(yīng)當(dāng)使用 --passphrase 來(lái)保護(hù)備份內(nèi)容,此外可以改進(jìn)示例中的密碼,使其對(duì)用戶更加友好。
建議根據(jù)用戶的備份要求對(duì)備份文件進(jìn)行目錄化管理,并保存一個(gè)離線備份。此外建議配置備份計(jì)劃和對(duì)應(yīng)的檢查任務(wù)。
現(xiàn)在已經(jīng)完成了 Swarm 和 UCP 的備份,可以在災(zāi)難性事件發(fā)生后安全地進(jìn)行恢復(fù)了。
在介紹恢復(fù) UCP 之前,有句話不得不提前說(shuō)明:從備份進(jìn)行恢復(fù)是最后的手段,只能在整個(gè)集群都宕機(jī)或者全部管理節(jié)點(diǎn)都丟失的情況下使用!
如果 HA 集群下僅丟失某個(gè)管理節(jié)點(diǎn),并不需要從備份進(jìn)行恢復(fù)。該情況下,很容易就能創(chuàng)建新管理節(jié)點(diǎn)并加入集群。
下面會(huì)先介紹如何從備份恢復(fù) Swarm,然后是 UCP。
在欲恢復(fù)的 Swarm/UCP 管理節(jié)點(diǎn)上執(zhí)行下面的任務(wù)。
⒈ 停止 Docker。
$ service docker stop
⒉ 刪除全部已存在的 Swarm 配置。
$ rm -r /var/lib/docker/swarm
⒊ 從 Swarm 備份中恢復(fù)配置信息。
示例中使用了名為 swarm.bkp 的壓縮文件,格式為 tar。該命令需要指定恢復(fù)到根目錄下,因?yàn)閭浞菸募鈮簽樵嘉募牟僮髦袝?huì)包含全路徑信息。
$ tar -zxvf swarm.bkp -C /
⒋ 初始化新的 Swarm 集群。
切記,當(dāng)前執(zhí)行的操作并不是恢復(fù)某個(gè)節(jié)點(diǎn)然后重新加入集群。該操作是恢復(fù)一個(gè)不可用的 Swarm 集群,其中不包含任何存活的管理節(jié)點(diǎn)。--force-new-cluster 參數(shù)告訴 Docker 創(chuàng)建新集群,使用的配置保存在當(dāng)前節(jié)點(diǎn) /var/lib/docker/swarm 目錄下。
$ docker swarm init --force-new-cluster
Swarm initialized: current node (jhsg...3l9h) is now a manager.
⒌ 檢查網(wǎng)絡(luò)和服務(wù)是恢復(fù)操作中的一部分。
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
snkqjy0chtd5 vantage-net overlay swarm
$ docker service ls
ID NAME MODE REPLICAS IMAGE
w9dimu8jfrze vantage-svc replicated 5/5 alpine:latest
至此,Swarm 集群完成恢復(fù)。
⒍ 為 Swarm 集群增加新的管理節(jié)點(diǎn)和工作節(jié)點(diǎn),并刷新備份。
在恢復(fù) Swarm 之后,可以恢復(fù) UCP。在示例中,UCP 備份到了當(dāng)前目錄下名為 ucp.bkp 的文件中。雖然文件名是備份文件,但其本質(zhì)是一個(gè) Linux 打包工具。
在欲恢復(fù) UCP 的節(jié)點(diǎn)上執(zhí)行下面的命令。該節(jié)點(diǎn)可以是剛剛執(zhí)行 Swarm 恢復(fù)操作的節(jié)點(diǎn)。
⒈ 刪除已經(jīng)存在并且可能崩潰的 UCP 安裝。
$ docker container run --rm -it --name ucp \
-v /var/run/docker.sock:/var/run/docker.sock \
docker/ucp:2.2.5 uninstall-ucp --interactive
INFO[0000] Your engine version 17.06.2-ee-6, build e75fdb8 is compatible
INFO[0000] We're about to uninstall from this swarm cluster.
Do you want to proceed with the uninstall? (y/n): y
INFO[0000] Uninstalling UCP on each node...
INFO[0009] UCP has been removed from this cluster successfully.
INFO[0011] Removing UCP Services
⒉ 從備份中恢復(fù) UCP。
$ docker container run --rm -i --name ucp \
-v /var/run/docker.sock:/var/run/docker.sock \
docker/ucp:2.2.5 restore --passphrase "Password123" < ucp.bkp
INFO[0000] Your engine version 17.06.2-ee-6, build e75fdb8 is compatible
<Snip>
time="2018-01-30T10:16:29Z" level=info msg="Parsing backup file"
time="2018-01-30T10:16:38Z" level=info msg="Deploying UCP Agent Service"
time="2018-01-30T10:17:18Z" level=info msg="Cluster successfully restored.
⒊ 登錄 UCP Web 界面,確認(rèn)之前創(chuàng)建的用戶還存在(或者是任何之前環(huán)境中存在的 UCP 對(duì)象)。