Docker Swarm 內(nèi)置有四層路由網(wǎng)格的功能,稱為 Swarm 路由網(wǎng)格(Swarm Routing Mesh)。這一功能可以使 Swarm 服務(wù)暴露給集群中的所有節(jié)點,并且能夠在服務(wù)的各個副本之間實現(xiàn)對入站流量的負載均衡。其效果就是可以基本實現(xiàn)流量均衡到達服務(wù)的所有副本。
不過,該負載均衡并不作用于應(yīng)用層。例如,它無法根據(jù) HTTP 頭部數(shù)據(jù)進行七層路由。為了彌補這一點,UCP 實現(xiàn)了七層路由網(wǎng)格,稱為 HTTP 路由網(wǎng)格(HTTP Routing Mesh,HRM)。這一功能以 Swarm 路由網(wǎng)格為基礎(chǔ)。
HRM 使得多個 Swarm 服務(wù)可以發(fā)布在同一個 Swarm 端口上,并根據(jù) HTTP 請求頭中的主機名將流量路由到正確的服務(wù)中。
下圖展示的是包含兩個服務(wù)的簡單示例。
在上圖中,筆記本客戶端向 mustang.internal 的 80 端口發(fā)出了一個 HTTP 請求。UCP 集群中有兩個監(jiān)聽 80 端口的服務(wù)。mustang 服務(wù)在 80 端口監(jiān)聽發(fā)送給 mustang.internal 主機的流量。camero 服務(wù)也監(jiān)聽 80 端口,不過它被配置為接收到達 camero.internal 的流量。
其實還有第三個稱為 HRM 的服務(wù),用來維護主機名與 UCP 服務(wù)之間的映射關(guān)系。HRM 會接收所有到達 80 端口的流量,查看 HTTP 請求頭,并決定將其路由到哪個服務(wù)。
下面舉例予以說明,并對一些細節(jié)進行解釋。
這里就采用上圖所示的例子。過程為首先開啟 HRM 的 80 端口。接著使用 nigelpoulton/dockerbook:mustang 鏡像部署一個名為“mustang”的服務(wù),并為該服務(wù)創(chuàng)建一個主機路由,從而所有對“mustang.internal”的請求都會被路由到該服務(wù)。
然后使用 nigelpoulton/dockerbook:camero 鏡像創(chuàng)建一個名為“camero”的服務(wù),并為該服務(wù)創(chuàng)建一個主機路由,實現(xiàn)該服務(wù)與“mustang.internal”的映射。
也可以使用可解析的 DNS 域名,比如“mustang.mycompany.com”,只需要配置好域名解析,使得所有發(fā)向這些地址的請求都能夠解析到 UCP 集群前的負載均衡器即可。如果沒有負載均衡器,那么可以將流量指向集群中任一個節(jié)點的 IP。下面具體操作一下:
⒈ 登錄到 UCP Web 界面。
⒉ 進入 Admin > Admin Settings > Routing Mesh(路由網(wǎng)格)。
⒊ 勾選 Enable Routing Mesh(啟用路由網(wǎng)格)復(fù)選框,確保 HTTP Port 配置為 80。
⒋ 單擊 Save。
這樣就完成了 UCP 集群開啟 HRM 的配置。這一操作,其底層會部署一個名為 ucp-hrm 的系統(tǒng)服務(wù),以及一個名為 ucp-hrm 的覆蓋網(wǎng)絡(luò)。
如果查看 ucp-hrm 系統(tǒng)服務(wù),會發(fā)現(xiàn)它是以入站模式(Ingress Mode)發(fā)布在 80 端口的。也就是說 ucp-hrm 是部署在集群上的,并且會在集群中的所有節(jié)點上綁定 80 端口。
因此,到達集群 80 端口的所有流量都會被該服務(wù)處理。當(dāng) Mustang 和 Camero 服務(wù)部署之后,ucp-hrm 服務(wù)的主機映射會被更新,它也就知道如何來進行流量的路由。
現(xiàn)在 HRM 已經(jīng)部署好了,下面部署服務(wù):
⒈ 選擇左側(cè)導(dǎo)航欄中的 Services,并單擊 Create Service。
⒉ 按照如下步驟部署“mustang”。
Details/Name: mustang。
Details/Image: nigelpoulton/dockerbook:mustang。
Network/Ports/Publish Port: 單擊 Publish Port + 選項。
Network/Ports/Internal Port: 8080。
Network/Ports/Add Hostname Based Routes: 單擊選項添加一個基于主機名的路由。
Network/Ports/External Scheme: Http://。
Network/Ports/Routing Mesh Host: mustang.internal。
Network/Ports/Networks: 確保服務(wù)接入 ucp-hrm 網(wǎng)絡(luò)。
⒊ 單擊 Create 來部署服務(wù)。
⒋ 部署“camero”服務(wù)。
部署該服務(wù)的過程與部署“mustang”服務(wù)類似,不同之處來自于以下幾點。
Details/Name: camero。
Details/Image: nigelpoulton/dockerbook:camero。
Network/Ports/Routing Mesh Host: camero.internal。
⒌ 單擊 Create。
每個服務(wù)的部署會花費幾秒時間,一旦完成,就可以在網(wǎng)頁瀏覽器中進行測試了,輸入 mustang.internal 可以訪問 Mustang 服務(wù)(如下圖所示),而 camero.internal 可以訪問 camero 服務(wù)。
為了使 mustang.internal 和 camero.internal 能夠被解析到 UCP 集群,需要進行域名解析的配置。解析的地址即為集群前的一個負載均衡器,從而可以將流量轉(zhuǎn)發(fā)到集群的 80 端口。不過如果為測試環(huán)境,并沒有負載均衡器,則可以通過編輯 hosts 文件的方式,配置域名到集群中某個節(jié)點 IP 的映射。
下面回顧一下其工作過程。
HTTP 路由網(wǎng)格是運行于 Swarm 路由網(wǎng)格傳輸層基礎(chǔ)之上的一個 Docker UCP 特性。具體來說,HRM 增加了基于主機名規(guī)則的應(yīng)用層路由。
啟用 HRM 的時候會部署一個名為 ucp-hrm 的 UCP 系統(tǒng)服務(wù)。該服務(wù)是 Swarm 范圍的,監(jiān)聽 80 或 443 端口。這意味著所有到達集群這兩個端口之一的流量都會被發(fā)送到 ucp-hrm 服務(wù)。而 ucp-hrm 服務(wù)會接收、解析,并路由所有到達集群中的流量。
到此已經(jīng)完成了兩個用戶服務(wù)的部署。在部署服務(wù)時,需要創(chuàng)建基于主機名的映射,該映射會被加入 ucp-hrm 服務(wù)。
“mustang”服務(wù)創(chuàng)建的映射,使得它能夠收到所有到達 80 端口的,HTTP 頭指向“mustang.internal”的流量。“camero”服務(wù)與之類似,接收所有到達 80 端口的,HTTP 頭指向“camero.internal”的流量??傮w來說,ucp-hrm 服務(wù)將完成如下兩個任務(wù)。
所有發(fā)往“mustang.internal”的 80 端口的流量都會被轉(zhuǎn)發(fā)至“mustang”服務(wù)。所有發(fā)往“camero.internal”的 80 端口的流量都會被轉(zhuǎn)發(fā)至“camero”服務(wù)。