Docker Swarm 支持兩種服務(wù)發(fā)布模式,兩種模式均保證服務(wù)從集群外可訪問。
? Ingress模式(默認(rèn))。
? Host模式。
通過 Ingress 模式發(fā)布的服務(wù),可以保證從 Swarm 集群內(nèi)任一節(jié)點(diǎn)(即使沒有運(yùn)行服務(wù)的副本)都能訪問該服務(wù);以 Host 模式發(fā)布的服務(wù)只能通過運(yùn)行服務(wù)副本的節(jié)點(diǎn)來訪問。下圖展示了兩種模式的區(qū)別。
Ingress 模式是默認(rèn)方式,這意味著任何時(shí)候讀者通過 -p 或者 --publish 發(fā)布服務(wù)的時(shí)候,默認(rèn)都是 Ingress 模式;如果需要以 Host 模式發(fā)布服務(wù),則讀者需要使用 --publish 參數(shù)的完整格式,并添加 mode=host。下面一起來看 Host 模式的例子。
$ docker service create -d --name svc1 \
--publish published=5000,target=80,mode=host \
nginx
關(guān)于該命令的一些說明。docker service mode 允許讀者使用完整格式語法或者簡單格式語法來發(fā)布服務(wù)。簡單格式如 -p 5000:80,前面已經(jīng)多次出現(xiàn)。但是,讀者不能使用簡單格式發(fā)布 Host 模式下的服務(wù)。
完整格式如 --publish published=5000,target=80,mode=host。該方式采用逗號(hào)分隔多個(gè)參數(shù),并且逗號(hào)前后不允許有空格。具體選項(xiàng)說明如下:
? published=5000 表示服務(wù)通過端口 5000 提供外部服務(wù)。
? target=80 表示發(fā)送到 published 端口 5000 的請求,會(huì)映射到服務(wù)副本的 80 端口之上。
? mode=host 表示只有外部請求發(fā)送到運(yùn)行了服務(wù)副本的節(jié)點(diǎn)才可以訪問該服務(wù)。
通常使用 Ingress 模式。
在底層,Ingress 模式采用名為 Service Mesh 或者 Swarm Mode Service Mesh 的四層路由網(wǎng)絡(luò)來實(shí)現(xiàn)。下圖展示了 Ingress 模式下一個(gè)外部請求是如何流轉(zhuǎn),最終訪問到服務(wù)的。
上圖中最上方命令部署了一個(gè)名為“svc1”的 Swarm 服務(wù)。該服務(wù)連接到了 overnet 網(wǎng)絡(luò),并發(fā)布到 5000 端口。
按上述方式發(fā)布 Swarm 服務(wù)(--publish published=5000,target=80)會(huì)在 Ingress 網(wǎng)絡(luò)的 5000 端口進(jìn)行發(fā)布。因?yàn)?Swarm 全部節(jié)點(diǎn)都接入了 Ingress 網(wǎng)絡(luò),所以這個(gè)端口被發(fā)布到了Swarm范圍內(nèi)。
集群確保到達(dá) Ingress 網(wǎng)絡(luò)中任意節(jié)點(diǎn)的 5000 端口的流量,都會(huì)被路由到 80 端口的“svc1”服務(wù)。
當(dāng)前“svc1”服務(wù)只部署了一個(gè)副本,集群中有一條映射規(guī)則:“所有訪問 Ingress 網(wǎng)絡(luò) 5000 端口的流量都需要路由到運(yùn)行了“svc1”服務(wù)副本的節(jié)點(diǎn)之上”。
紅線展示了訪問 Node 的 15000 端口的流量,通過 Ingress 網(wǎng)絡(luò),被路由到了 Node2 節(jié)點(diǎn)正在運(yùn)行的服務(wù)副本之上。
入站流量可能訪問 4 個(gè) Swarm 節(jié)點(diǎn)中的任意一個(gè),但是結(jié)果都是一樣的,了解這一點(diǎn)很重要。這是因?yàn)榉?wù)通過 Ingress 網(wǎng)絡(luò)實(shí)現(xiàn)了 Swarm 范圍內(nèi)的發(fā)布。
此外,還有一點(diǎn)很重要:如果存在多個(gè)運(yùn)行中的副本,流量會(huì)平均到每個(gè)副本之上,如下圖中展示的一樣。