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