Docker Swarm 负载均衡详解 or 模式选择

Docker Swarm 负载均衡详解

  • Swarm模式内置DNS组件,可以自动为集群中的每个服务分配DNS记录。
  • Swarm manager使用内部负载均衡,根据服务的DNS名称在集群内的服务之间分发请求。
  • Swarm manager使用 ingress load blancing暴露你想从外部访问集群提供的服务。
  • Swarm manager自动为服务分配一个范围30000-32767端口的Published Port,也可以为该服务指定一个Published Port。

ingress network是一个特殊的overlay网络,便于服务的节点直接负载均衡。当任何swarm节点在已发布的端口上接收到请求时,它将该请求转发给调用的IPVS模块,IPVS跟踪参与该服务的所有容器IP地址,选择其中一个,并通过ingress network将请求路由给它。


Docker Swarm 负载均衡试验测试

1、管理节点:创建一个测试容器my_web

docker service create --replicas 3 --network my-network --name my_web nginx

2、管理节点:添加暴露端口

docker service update --publish-add 8080:80 my_web

3、管理节点:获取虚拟IP

docker service inspect -f '{{json .Endpoint.VirtualIPs}}' my_web

[{"NetworkID":"3d1ut7rm89tvqvhh98wl3bxtx","Addr":"10.0.0.2/24"}]

:可用虚拟VIP或者服务名称去访问。

测试负载均衡:192.168.1.79:8080

:在每个不同副本中访问。


Docker Swarm 负载均衡模式选择

负载均衡有两种模式:VIP、DNSRR

  • VIP:分配独立的虚拟IP,DNS记录解析到服务名中作为代理IP。
  • dnsrr:DNS记录不解析VIP,而去解析每个容器内的IP。dnsrr模式不支持端口对外暴露。

1、管理节点:通过查看服务详细信息筛选当前模式负载均衡模式

docker service inspect my_web
[
            "EndpointSpec": {
                "Mode": "vip"
            }
        },
        "Endpoint": {
            "Spec": {
                "Mode": "vip",
                "Ports": [
                    {
                        "Protocol": "tcp",
                        "TargetPort": 80,
                        "PublishedPort": 8080,
                        "PublishMode": "ingress"
                    }
                ]
            },
]

注:当前模式为VIP模式。

2、管理节点:设置DNS轮询模式

docker service create \
--replicas 3 \
--name my-web \
--network my-network \
--endpoint-mode dnsrr \
nginx
# 创建服务
docker service create \
# 创建副本数
--replicas 3 \
# 服务名
--name my-web \
# 添加网络
--network my-network \
# 添加负载均衡模式
--endpoint-mode dnsrr \
# 镜像
nginx
命令解析

3、管理节点:创建一个测试容器my_web2

docker service create --replicas 3 --network my-network --name my_web2 nginx 

4、管理节点:添加dnsrr模式

docker service update --endpoint-mode dnsrr my_web2 

5、工作节点:进入容器测试

docker exec -it 06a5a7ae6e7e sh
# 测试进入容器查看解析记录
/ # nslookup my_web2
Server: 127.0.0.11 Address: 127.0.0.11:53 Non-authoritative answer: Name: my_web2 Address: 10.0.0.13 Name: my_web2 Address: 10.0.0.4 Name: my_web2 Address: 10.0.0.12 # 工作节点:测试进入容器多次ping服务名 / # ping my_web2 PING my_web2 (10.0.0.4): 56 data bytes 64 bytes from 10.0.0.4: seq=0 ttl=64 time=0.116 ms
/ # ping my_web2 PING my_web2 (10.0.0.12): 56 data bytes 64 bytes from 10.0.0.12: seq=0 ttl=64 time=0.745 ms
/ # ping my_web2 PING my_web2 (10.0.0.13): 56 data bytes 64 bytes from 10.0.0.13: seq=0 ttl=64 time=0.546 ms

Docker Swarm 负载均衡模扩展知识

可在容器Swarm负载均衡之上在建立一层负载均衡。HAProxy可代理工作节点端暴露的端口进行再次代理,做到双层负载均衡的作用。保证高可用与大规模的应用。

posted @ 2018-11-10 12:00  kevin.Xiang  阅读(14409)  评论(1编辑  收藏  举报