docker engine swarm mode 可以簡單的發佈服務的端口,讓集羣外部可以訪問到。所有的節點都在同一個路由網格中。路由網格使每個節點都能夠接收到集羣上面的任意服務的端口。即使該節點沒有任務在跑。路由網格在所有可用的節點上面 路由所有的進入的請求到發佈的端口的可用容器上面。
爲了能夠使用路由網格的功能,你需要在節點間開放以下的協議和端口:
端口 7946 TCP/UDP 容器網絡發現
端口 4789 UDP 容器內部網絡
在一個服務中發佈一個端口
--publish
$ docker service create \ --name <SERVICE-NAME> \ --publish <PUBLISHED-PORT>:<TARGET-PORT> \ <IMAGE>
示例:
把內部容器nginx 的80端口發佈到外部的8080端口
$ docker service create \ --name my-web \ --publish 8080:80 \ --replicas 2 \ nginx
當你訪問swarm 集羣的8080端口,swarm會把你的請求負載均衡到所有可用的容器上面。
路由網格監聽分配給節點的任意IP的發佈端口。如果是外部的路由IP地址,端口即對外也可以訪問。其他的IP地址的訪問只對該主機可用。
你可以在一個存在的服務中發佈一個端口
$ docker service update \ --publish-add <PUBLISHED-PORT>:<TARGET-PORT> \ <SERVICE>
通過以下命令查看發佈的端口 $ docker service inspect --format="{{json .Endpoint.Spec.Ports}}" my-web [{"Protocol":"tcp","TargetPort":80,"PublishedPort":8080}]
發佈一個單獨的TCP端口或者是UDP端口
默認發佈的端口是TCP端口,如果你要定義一個UDP端口,可以通過以下配置
只定義TCP端口
$ docker service create --name dns-cache -p 53:53 dns-cache $ docker service create --name dns-cache -p 53:53/tcp dns-cache
同時定義TCP和UDP端口
$ docker service create --name dns-cache -p 53:53/tcp -p 53:53/udp dns-cache
只定義UDP端口
$ docker service create --name dns-cache -p 53:53/udp dns-cache
配置一個外部的負載均衡器
你可以配置一個外部的負載均衡器,來路由所有的請求到swarm服務中。
例如:你可以配置HAproxy來均衡所有的請求到nginx的外部端口8080
在這種情況下,8080端口必須在負載均衡器和swarm集羣之間是開放的。
swarm節點能夠存在與一個私有的網絡,只能通過代理服務器訪問,無法直接對外提供訪問。
即使在該節點上面沒有任務,你也可以配置負載均衡器均衡所有的請求到每個節點。
例如:如下配置的HAproxy的配置
/etc/haproxy/haproxy.cfg: global log /dev/log local0 log /dev/log local1 notice ...snip... # Configure HAProxy to listen on port 80 frontend http_front bind *:80 stats uri /haproxy?stats default_backend http_back # Configure HAProxy to route requests to swarm nodes on port 8080 backend http_back balance roundrobin server node1 192.168.99.100:8080 check server node2 192.168.99.101:8080 check server node3 192.168.99.102:8080 check
當你訪問HAproxy 負載均衡器的80端口,它會轉發請求到swarm集羣的節點。swarm路由網格會路由請求到可用的節點上面。如果swarm scheduler 調度任務請求到不同的節點上面,你不需要重新配置負載均衡器。
你可以配置任何一種類型的負載均衡器來路由swarm節點的請求。