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地址的访问只对该主机可用。

service ingress p_w_picpath

你可以在一个存在的服务中发布一个端口

$ 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


ingress with external load balancer p_w_picpath



在这种情况下,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节点的请求。