UCP 是企業(yè)級的容器即服務(wù)平臺的圖形化操作界面。UCP 使用 Docker 引擎,并添加了各種企業(yè)喜歡以及需要的功能。例如 RBAC、可配置、認(rèn)證、高可用控制平面以及簡單界面。在 UCP 內(nèi)部,是一個容器化的微服務(wù)應(yīng)用,以多個容器的形式運(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è)置集群大小和規(guī)格十分重要。下面介紹該過程中需要考慮的一些方面。
集群中全部節(jié)點(diǎn)的時鐘需要同步(例如 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é)。同時也能簡化問題定位。
用戶需要保證管理節(jié)點(diǎn)數(shù)量為奇數(shù)。這樣就能避免出現(xiàn)腦裂等類似場景時,會導(dǎo)致管理節(jié)點(diǎn)不可用,或者與集群割裂的現(xiàn)象。理想數(shù)量為 3、5 或者 7,3 或者 5 是較常用的。多于 7 的話,可能導(dǎo)致后臺 Raft 算法或者集群一致性的問題。如果不能提供 3 個管理節(jié)點(diǎn),1 個要好于 2 個!
如果配置了后臺計劃(用戶應(yīng)當(dāng)配置)并進(jìn)行日常備份,可能需要部署 5 個管理節(jié)點(diǎn)。這是因?yàn)?Swarm 和 UCP 的備份操作需要停止 Docker 和 UCP 服務(wù)。5 個管理節(jié)點(diǎn)可以保證在執(zhí)行類似操作時集群的彈性。
管理節(jié)點(diǎn)應(yīng)當(dāng)根據(jù)數(shù)據(jù)中心可用域進(jìn)行部署。用戶最不想見到的場景,就是全部 UCP 管理節(jié)點(diǎn)所在的域都不可用。但是,管理節(jié)點(diǎn)之間的通信必須經(jīng)由高速可靠的網(wǎng)絡(luò)完成。
因此如果數(shù)據(jù)中心可用域之間網(wǎng)絡(luò)狀況不佳,最好還是將所有管理節(jié)點(diǎn)部署在相同域之中。有件事已經(jīng)約定成俗,即在公有云上部署時,需要將管理節(jié)點(diǎn)部署在同區(qū)域內(nèi)的可用域中。跨區(qū)域通常會受到低可靠性和高延遲網(wǎng)絡(luò)的影響。
工作節(jié)點(diǎn)的數(shù)量可以根據(jù)需求設(shè)置,因?yàn)樗鼈儾⒉粫⑴c到集群 Raft 操作當(dāng)中,所以就不會影響控制平面操作。
規(guī)劃工作節(jié)點(diǎn)的規(guī)格和數(shù)量,需要理解計劃部署在集群上的應(yīng)用需求。例如,理解之后能幫助用戶確定需要多少 Windows 節(jié)點(diǎn)和 Linux 節(jié)點(diǎn)。同時還需要知道應(yīng)用是否有特殊需求,需要工作節(jié)點(diǎn)的定制化來支持,例如 PCI 類工作負(fù)載。
此外,雖然 Docker 引擎是輕量級的,但其上運(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)站上對 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 空閑磁盤空間。
該建議僅供參考,用戶在確定配置時需要自己多加練習(xí)。
有一點(diǎn)是確認(rèn)的:Window 鏡像會比 Linux 鏡像稍大一些。所以規(guī)劃時務(wù)必考慮該因素。
關(guān)于需求規(guī)劃最后多說一點(diǎn)。Docker Swarm 和 Docker UCP 簡化了管理節(jié)點(diǎn)和工作節(jié)點(diǎn)的添加 / 刪除工作。新加入的管理節(jié)點(diǎn)被自動加入到 HA 控制平面,新加入的工作節(jié)點(diǎn)馬上就能參與到工作負(fù)載調(diào)度當(dāng)中。
類似的,刪除管理節(jié)點(diǎn)和工作節(jié)點(diǎn)也非常簡單。只要擁有多個管理節(jié)點(diǎn),就可以在不影響集群操作的情況下移除其中一個。移除工作節(jié)點(diǎn)時,需要清理該節(jié)點(diǎn)上的工作負(fù)載,然后從運(yùn)行中的集群移除。上述特點(diǎn)使得 UCP 對管理節(jié)點(diǎn)和工作節(jié)點(diǎn)的變更做到不感知。
下面主要介紹在新集群的第一個管理節(jié)點(diǎn)上安裝 Docker UCP 的完整過程。
⒈ 在某個 Linux Docker EE 節(jié)點(diǎn)上運(yùn)行下面的命令,該節(jié)點(diǎn)應(yīng)是計劃中作為 UCP 集群的第一個管理節(jié)點(diǎn)。
關(guān)于命令需要補(bǔ)充說明,示例在安裝 UCP 時,使用了 docker/ucp:2.2.5 鏡像,用戶需要替換為適合自己的版本。--host-address 設(shè)置了 Web 界面訪問地址。如果用戶在 AWS 上完成安裝,并且計劃通過互聯(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
⒉ 配置管理員賬號。安裝過程會提示用戶輸入用戶名和密碼,作為 UCP 管理員賬號。這是一個本地賬號,建議遵守公司規(guī)范來創(chuàng)建用戶名和密碼。創(chuàng)建后千萬不要忘記。
⒊ 主體別名(Subject Alternative Name,SAN)。安裝程序會提示輸入能訪問 UCP 的 IP 地址和名稱列表。列表內(nèi)容可以是私有 IP 地址以及 DNS 名稱,并且會加入到賬號當(dāng)中。
安裝過程還需注意以下的一些內(nèi)容。
UCP 基于 Docker Swarm,這意味著 UCP 管理節(jié)點(diǎn)需要運(yùn)行在 Swarm 管理節(jié)點(diǎn)上。如果在某個節(jié)點(diǎn)上以單引擎模式(Single-Engine Mode)安裝 UCP,則該節(jié)點(diǎn)會默認(rèn)切換為 Swarm 模式。
安裝程序拉取 UCP 服務(wù)所需的全部鏡像,并完成相應(yī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 核心代理。該代理會部署到集群的全部節(jié)點(diǎn)上,用于確保 UCP 所需容器全部啟動并運(yùn)行。
? ucp-etcd 集群持久化鍵值對存儲。
? ucp-auth 共享鑒權(quán)服務(wù)(在 DTR 的單點(diǎn)登錄中也用到了)。
? ucp-proxy 控制對本地 Docker Socket 端口的訪問,這樣未認(rèn)證的客戶端就不能擅自篡改集群了。
? ucp-swarm 提供對底層 Swarm 的適配。
最終,安裝程序創(chuàng)建了一對根 CA:一個用于集群內(nèi)部通信,另一個用于外部訪問。CA 使用自簽名證書,這對于實(shí)驗(yàn)和測試環(huán)境來說很好,但是不適用于生產(chǎn)環(huán)境。
為了完成可信 CA 證書的 UCP 安裝,需要使用下面 3 個文件完成證書綁定。
? 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)頁面來修改證書。
UCP 安裝程序輸出中的最后一段內(nèi)容,就是訪問所用的 URL。
<Snip>
INFO[0049] Login to UCP at https://<IP or DNS>:443
通過 Web 瀏覽器訪問該地址并且登錄。如果使用自簽名證書,則需要確認(rèn)瀏覽器的告警信息。同時還需要指定許可證文件,該文件可以從 Docker 商店的 My Content 中下載。
登錄后即可訪問 UCP 管理面板,如下圖所示。
到目前為止,一個單點(diǎn)登錄 UCP 集群已經(jīng)就緒。
可以通過管理面板底部的 Add Nodes 鏈接為集群添加更多的管理節(jié)點(diǎn)和工作節(jié)點(diǎn)。
下圖展示了添加節(jié)點(diǎn)的界面。用戶可以選擇添加管理節(jié)點(diǎn)或者工作節(jié)點(diǎn),然后界面中就會給出對應(yīng)的命令,在待添加節(jié)點(diǎn)上運(yùn)行即可。示例中選擇添加 Linux 工作節(jié)點(diǎn)。注意,這是一個 docker swarm命令。
添加的節(jié)點(diǎn)會加入 Swarm 集群,并且配置所需的 UCP 服務(wù)。如果添加的是管理節(jié)點(diǎn),推薦在連續(xù)添加之間稍作等待。這樣可以給 Docker 留出下載并運(yùn)行所需 UCP 容器的機(jī)會,同時也允許集群注冊新的管理節(jié)點(diǎn)并達(dá)到法定人數(shù)。
新加入的管理節(jié)點(diǎn)會自動配置到高可用(HA)的一致性 Raft 組當(dāng)中,并且被授權(quán)可以訪問集群存儲。此外,雖然外部負(fù)載均衡器通常不被認(rèn)作 UCP HA 的核心部分,但其本身對外提供了穩(wěn)定的 DNS 名稱,屏蔽了一些后端場景,如某個節(jié)點(diǎn)掛掉。
用戶需要為 443 端口的 TCP 透傳配置外部的負(fù)載均衡器,通過自定義的 HTTPS 心跳檢查 https:///_ping 確認(rèn) UCP 管理節(jié)點(diǎn)的狀態(tài)。
現(xiàn)在一個工作狀態(tài)的 UCP 已經(jīng)搭建完成,可以通過 Admin Settings 頁面查看相關(guān)選項(xiàng),如下圖所示。
所有對 UCP 的訪問,都經(jīng)由身份管理子系統(tǒng)。這意味著用戶在集群上執(zhí)行任何操作前,首先需要通過用戶名和密碼進(jìn)行認(rèn)證。這些操作包括集群的管理,以及服務(wù)的部署和管理。
用戶使用 UI 界面的時候已經(jīng)體驗(yàn)過了,必須使用用戶名和密碼才能登錄。在 CLI 中也是一樣的,用戶不能在未登錄的情況下通過 UCP 執(zhí)行命令!這是因?yàn)?UCP 集群中本地 Docker Socket 受到 ucp-proxy 服務(wù)的保護(hù),不會接受未認(rèn)證命令。
每個運(yùn)行 Docker CLI 的節(jié)點(diǎn),都能部署并管理 UCP 集群的工作負(fù)載,只要該節(jié)點(diǎn)存在一個有效 UCP 用戶認(rèn)證。
本節(jié)中會創(chuàng)建一個新 UCP 用戶,新建并下載該用戶的綁定證書,接著創(chuàng)建一個 Docker 客戶端并使用該證書。在完成上述步驟后,會解釋其工作原理。
⒈ 如果還沒就緒,則以管理員身份登錄 UCP。
⒉ 單擊 User Management > Users,創(chuàng)建一個新用戶。因?yàn)檫€未討論角色和權(quán)限相關(guān)的內(nèi)容,所以將用戶設(shè)置為 Docker EE 管理員。
⒊ 在新用戶選中狀態(tài)下,單擊 Configure 下拉框,然后選擇 Client Bundle,如下圖所示。
⒋ 單擊 Client Bundle +鏈接,生成并下載該用戶的客戶端 Bundle。
此時需要注意,客戶端 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)"
此時,客戶端節(jié)點(diǎn)配置已經(jīng)完成。
⒐ 測試權(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,這就說明 Docker 客戶端已經(jīng)成功連接到 UCP 節(jié)點(diǎn)的 daemon 了。
實(shí)際上,腳本共配置了 3 個環(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 命令都會在客戶端使用用戶證書簽名,然后經(jīng)由網(wǎng)絡(luò)發(fā)送到遠(yuǎn)端的 UCP 管理節(jié)點(diǎn),如下圖所示。
首先并且最重要的是,高可用(HA)并不等價于備份!
思考下面的例子。有一個包含 5 個管理節(jié)點(diǎn)的 UCP 集群。所有管理節(jié)點(diǎn)都處于健康狀態(tài),并且控制平面開啟了復(fù)制功能。某個心懷怨恨的員工對集群進(jìn)行破壞(或者刪除了全部用戶賬戶)。破壞操作會復(fù)制到全部 5 個管理節(jié)點(diǎn),導(dǎo)致集群被破壞。這種場景下 HA 沒有絲毫幫助。此時需要的,是備份!
一個 UCP 集群主要由 3 個部分構(gòu)成,也是需要分別備份的內(nèi)容:Swarm、UCP 和 Docker 可信鏡像倉庫服務(wù)(DTR)。
接下來會展示如何完成 Swarm 和 UCP 的備份,有關(guān) DTR 備份的內(nèi)容本章會在稍后進(jìn)行介紹。
雖然 UCP 位于 Swarm 上層,但是它們是互相獨(dú)立的。Swarm 維護(hù)了全部節(jié)點(diǎn)關(guān)系、網(wǎng)絡(luò)以及服務(wù)定義。UCP 在其上層構(gòu)建,維護(hù)自己的數(shù)據(jù)庫和卷存儲來記錄用戶、組、授權(quán)、Bundle、許可證文件、認(rèn)證等信息。
一起來看一下如何進(jìn)行 Swarm 備份。
Swarm 配置和狀態(tài)保存在 /var/lib/docker/swarm 中,其中包含了 Raft 日志密鑰,并且會復(fù)制到每個管理節(jié)點(diǎn)。Swarm 備份就是復(fù)制該目錄下的所有文件。
因?yàn)樵撔畔?fù)制到每個管理節(jié)點(diǎn),所以用戶可以在任何管理節(jié)點(diǎn)上進(jìn)行備份。
備份時需要在待執(zhí)行備份操作的節(jié)點(diǎn)上停止 Docker。這意味著在主管理節(jié)點(diǎn)上執(zhí)行備份操作不是一個好的選擇,因?yàn)檫@樣會導(dǎo)致重新選主。
執(zhí)行備份時最好選擇在業(yè)務(wù)的低峰期進(jìn)行,雖然對于擁有多管理節(jié)點(diǎn)的 Swarm 來說,停止某個管理節(jié)點(diǎn)并不會出現(xiàn)問題,但這種操作還是會增加集群在另一管理節(jié)點(diǎn)宕機(jī)時出現(xiàn)高可用有效節(jié)點(diǎn)數(shù)不足的情況。
在執(zhí)行備份前,創(chuàng)建一些 Swarm 對象可以驗(yàn)證備份和回滾操作是否確實(shí)生效了。示例中待備份的 Swarm,擁有一個名為 vantage-net 的覆蓋網(wǎng)絡(luò),以及名為 vantage-svc 的 Swarm 服務(wù)。
⒈ 停止待備份 Swarm 管理節(jié)點(diǎn)上的 Docker。這樣會停止該節(jié)點(diǎn)上的全部 UCP 容器。如果 UCP 配置了 HA,則其他管理節(jié)點(diǎn)會保證控制平面處于可用狀態(tài)。
$ service docker stop
⒉ 備份 Swarm 配置。示例使用 Linux tar 工具來執(zhí)行文件復(fù)制。可隨意選擇其他工具。
$ 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 備份完成,是時候備份 UCP 了。在開始 UCP 備份前,需要注意如下幾點(diǎn)。
因?yàn)?UCP 備份任務(wù)以容器方式運(yùn)行,所以如果想進(jìn)行備份,需要 Docker 保持運(yùn)行狀態(tài)。
可以在集群中的任意一臺 UCP 管理節(jié)點(diǎn)上運(yùn)行備份,并且只需要在一個節(jié)點(diǎn)上運(yùn)行即可(UCP 復(fù)制功能會將配置信息復(fù)制到全部管理節(jié)點(diǎn),所以沒有必要備份多節(jié)點(diǎn))。
對 UCP 進(jìn)行備份會停止所在管理節(jié)點(diǎn)上的全部 UCP 容器。在該前提下,備份操作需要運(yùn)行在一個高可用 UCP 集群上,并且最好是在業(yè)務(wù)低峰期運(yùn)行。
自始至終,執(zhí)行備份的管理節(jié)點(diǎn)上的用戶工作負(fù)載并不會停止。但是,并不建議在 UCP 管理節(jié)點(diǎn)上執(zhí)行用戶工作負(fù)載。
下面開始備份 UCP。在某個 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
該命令很長,一起來看一下每個步驟的內(nèi)容。
第一行是標(biāo)準(zhǔn)的 docker container run 命令,讓 Docker 運(yùn)行某個容器,運(yùn)行時不開啟日志,在運(yùn)行結(jié)束后進(jìn)行刪除,同時調(diào)用 ucp;第二行將 Docker socket 掛載到容器中,這樣容器可以通過訪問 Docker API 來停止運(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)簽)是一個好辦法,示例中指定為 docker/ucp:2.2.5。這樣做是因?yàn)檫M(jìn)行備份和恢復(fù)操作的時候,建議使用相同版本的鏡像。如果沒有顯示指定鏡像版本,Docker 會默認(rèn)使用標(biāo)簽為 latest 的鏡像,這可能導(dǎo)致執(zhí)行備份和恢復(fù)操作時鏡像版本存在差異。
每次備份都應(yīng)當(dāng)使用 --passphrase 來保護(hù)備份內(nèi)容,此外可以改進(jìn)示例中的密碼,使其對用戶更加友好。
建議根據(jù)用戶的備份要求對備份文件進(jìn)行目錄化管理,并保存一個離線備份。此外建議配置備份計劃和對應(yīng)的檢查任務(wù)。
現(xiàn)在已經(jīng)完成了 Swarm 和 UCP 的備份,可以在災(zāi)難性事件發(fā)生后安全地進(jìn)行恢復(fù)了。
在介紹恢復(fù) UCP 之前,有句話不得不提前說明:從備份進(jìn)行恢復(fù)是最后的手段,只能在整個集群都宕機(jī)或者全部管理節(jié)點(diǎn)都丟失的情況下使用!
如果 HA 集群下僅丟失某個管理節(jié)點(diǎn),并不需要從備份進(jìn)行恢復(fù)。該情況下,很容易就能創(chuàng)建新管理節(jié)點(diǎn)并加入集群。
下面會先介紹如何從備份恢復(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)閭浞菸募鈮簽樵嘉募牟僮髦袝窂叫畔ⅰ?/p>
$ tar -zxvf swarm.bkp -C /
⒋ 初始化新的 Swarm 集群。
切記,當(dāng)前執(zhí)行的操作并不是恢復(fù)某個節(jié)點(diǎn)然后重新加入集群。該操作是恢復(fù)一個不可用的 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ì)是一個 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 對象)。