在最新發(fā)布的 1.12.0 版本中,當(dāng)在集群中啟動(dòng)服務(wù)時(shí),Docker 通過 DNS 和 IP 虛擬服務(wù)器(IPVS)為服務(wù)的負(fù)載均衡引入了新的參數(shù)。
新版 Docker 引入了內(nèi)置的 DNS 服務(wù)器,當(dāng)啟動(dòng)一個(gè)容器時(shí),可以通過它使用 --net-alias 參數(shù)來為容器的 IP 地址映射別名。這個(gè)特性從 1.10 后就可使用。從 1.11 版本之后,Docker 也支持了基于循環(huán) DNS 的負(fù)載均衡。
在基于 DNS 的負(fù)載均衡中,一個(gè)服務(wù)的名稱(別名)會(huì)被映射到多個(gè) IP 地址。在這樣的情形下,服務(wù)其實(shí)是運(yùn)行在容器的 IP 地址背后。當(dāng)進(jìn)行 DNS 查詢時(shí),DNS 服務(wù)器將會(huì)響應(yīng)多個(gè) IP 地址,同時(shí),它也會(huì)打亂返回的 IP 地址的順序,這使得從不同客戶端發(fā)送的請(qǐng)求將會(huì)命中不同的 IP。但必須通過手動(dòng)映射一個(gè)別名到多個(gè)容器的 IP 地址才能實(shí)現(xiàn)循環(huán)負(fù)載均衡。
在 1.12.0 版本中,Docker添加了內(nèi)置的對(duì)于服務(wù)的負(fù)載均衡的支持,原理是使用了稱為 IPVS 的 Linux 特性。使用 Docker 的集群引擎,一個(gè)服務(wù)可以通過命令行和必須的數(shù)個(gè)復(fù)制品(容器)來聲明。再也不用為服務(wù)手動(dòng)地指定別名。在內(nèi)部,該服務(wù)的 DNS 名稱被映射到了一個(gè)虛擬 IP(VIP),在這里這個(gè)特性與 IPVS 聯(lián)系了起來。當(dāng)進(jìn)行 DNS 查找時(shí),VIP 將被返回。
IPVS 是一個(gè) Linux 內(nèi)核特性,它可以使得第四層(傳輸層) TCP/UDP 流量 被轉(zhuǎn)發(fā)到后端服務(wù)器。它是基于網(wǎng)絡(luò)過濾模塊的,其形成了在 Linux 內(nèi)核中的包過濾和網(wǎng)絡(luò)地址轉(zhuǎn)換實(shí)現(xiàn)的基礎(chǔ)。
當(dāng)一個(gè)服務(wù)請(qǐng)求到達(dá)了 VIP,它會(huì)被轉(zhuǎn)發(fā)到一個(gè)托管服務(wù)的后端容器中。通過這樣的方式,流量會(huì)被均勻地分發(fā)到容器之中。這種負(fù)載均衡服務(wù)的方式和 Consul 非常相似,它是服務(wù)發(fā)現(xiàn)軟件。Consul 也提供一個(gè) DNS 服務(wù)器,它可以在每次查詢完成時(shí)返回多個(gè) IP 地址。
查看英文原文:Improved Options for Service Load Balancing in Docker 1.12.0