docker engine swarm mode 可以简单的发布服务的端口,让集群外部可以访问到。所有的节点都在同一个路由网格中。路由网格使每个节点都能够接收到集群上面的任意服务的端口。即使该节点没有任务在跑。路由网格在所有可用的节点上面 路由所有的进入的请求到发布的端口的可用容器上面。

为了能够使用路由网格的功能,你需要在节点间开放以下的协议和端口:

端口 7946   TCP/UDP     容器网络发现

端口 4789   UDP              容器内部网络

在一个服务中发布一个端口

--publish

$ docker service create \  --name 
 \  --publish 
:
 \  

示例:

把内部容器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 
:
 \  
通过以下命令查看发布的端口$ 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 80frontend http_front   bind *:80   stats uri /haproxy?stats   default_backend http_back# Configure HAProxy to route requests to swarm nodes on port 8080backend 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节点的请求。