管理swarm(12) – swarm实践 –使用swarm模式的routing mesh路由请求

Docker Engine的swarm模式使得服务发布端口让服务在swarm外部可用变得容易。所以的节点都参与到routing mesh中,意味着任何的节点(即使该节点没有服务在运行)都可以作为入口,都能路由请求。
为了能在swarm中使用ingress网络,你需要在节点之间开放如下端口:

  • TCP/UDP端口7946 – 用来发现容器网络
  • UDP端口4789 – 容器ingress网络
  • 当然你也必须在swarm节点之间和做任意外部资源(如外部负载均衡)之间开放published端口。

    发布服务端口

    在创建服务时使用–publish参数来发布一个端口:

    1. $ docker service create \
    2.   --name <SERVICE-NAME> \
    3.   --publish <PUBLISHED-PORT>:<TARGET-PORT> \
    4.   <IMAGE>

    是容器内监听的端口。是对外发布的端口,外部通过此端口能访问到容器内的应用程序。
    例如,以下的命令是发布nginx容器内的80端口到swarm所有节点的8080端口:

    1. $ docker service create \
    2.   --name my-web \
    3.   --publish 8080:80 \
    4.   --replicas 2 \
    5.   nginx

    当你访问任意节点的8080端口,swarm的负载均衡会把你的请求路由到一个任意节点的可用的容器上。routing mesh在swarm节点的所有IP上监听published端口。

    你可以使用以下命令来为已存在的服务发布一个端口:

    1. $ docker service update \
    2.   --publish-add <PUBLISHED-PORT>:<TARGET-PORT> \
    3.   <SERVICE>

    使用docker service inspect来查看服务的published端口。如:

    1. $ docker service inspect --format="" my-web
    2.  
    3. [{"Protocol":"tcp","TargetPort":80,"PublishedPort":8080}]

    发布一个TCP端口或UDP端口

    默认情况下,以上发布的端口都是TCP端口。你可以指定发布一个UDP端口。当你TCP和UDP两个端口都发布时,Docker 1.12.2及更早版本要求你为TCP端口添加/tcp后缀。

    只发布TCP端口

    下面的两个命令是一样的。

    1. $ docker service create --name dns-cache -p 53:53 dns-cache
    2.  
    3. $ docker service create --name dns-cache -p 53:53/tcp dns-cache

    发布TCP和UDP端口

    1. $ docker service create --name dns-cache -p 53:53/tcp -p 53:53/udp dns-cache

    只发布UDP端口

    1. $ docker service create --name dns-cache -p 53:53/udp dns-cache

    配置一个外部负载均衡

    你可以配置一个外部负载均衡来路由请求到swarm服务。例如,你可以配置HAProxy来路由请求到一个published端口为8080的nginx服务。

    在这个示例中,在负载均衡和所有swarm节点之间需要开放8080端口。
    你可以配置负载均衡负载请求到swarm的任何节点。例如HAProxy的配置文件/etc/haproxy/haproxy.cfg:

    1. global
    2.         log /dev/log    local0
    3.         log /dev/log    local1 notice
    4. ...snip...
    5.  
    6. # Configure HAProxy to listen on port 80
    7. frontend http_front
    8.    bind *:80
    9.    stats uri /haproxy?stats
    10.    default_backend http_back
    11.  
    12. # Configure HAProxy to route requests to swarm nodes on port 8080
    13. backend http_back
    14.    balance roundrobin
    15.    server node1 192.168.99.100:8080 check
    16.    server node2 192.168.99.101:8080 check
    17.    server node3 192.168.99.102:8080 check

    当你访问HAProxy负载均衡的80端口时,它会把你的请求转发到swarm节点。然后swarm节点的routing mesh把请求路由到一个可用的服务上。

    标签:Swarm 发布于:2019-11-20 07:39:29