基于DNS的负载均衡
创建自己的overlay网络,swarm默认创建了一个ingress网络,但是没有dns功能的。
[root@Manager01 ~]# docker network create -d overlay lookyoo
z36we4j6vc14r7uho4252oh0g
[root@Manager01 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
33c492e0ac9e bridge bridge local
506979b3fb58 docker_gwbridge bridge local
6490a2e0f3c0 host host local
icv8o55n6f79 ingress overlay swarm
z36we4j6vc14 lookyoo overlay swarm
50522c84156d none null local
基于DNS的负载均衡
流程图如下:
基于DNS负载均衡
DNS SERVER内嵌于docker中,docker DNS解析服务名并但会容器ID地址列表(随机排序)。客户端通常会挑第一个IP访问,因此负载均衡kennel发生在服务器的不同实例之间。
使用dnsrr模式创建一个centos容器
[root@Manager01 ~]# docker service create --endpoint-mode dnsrr --replicas 1 --name lookyoo-centos --network lookyoo centos ping www.baidu.com
ixj8ef6xytdyek7j8gaqr2bx3
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
查看service
[root@Manager01 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ixj8ef6xytdy lookyoo-centos replicated 1/1 centos:latest
查看task
[root@Manager01 ~]# docker service ps lookyoo-centos
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
ljpn4xwknj8h lookyoo-centos.1 centos:latest Worker01 Running Running 2 minutes ago
使用dnsrr模式创建一个副本数是2的nginx容器的服务
[root@Manager01 ~]# docker service create --endpoint-mode dnsrr --replicas 2 --name lookyoo-nginx --network lookyoo nginx:1.10
77ifiq9ex92zaf9wyqib74lqi
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
查看service
[root@Manager01 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ixj8ef6xytdy lookyoo-centos replicated 1/1 centos:latest
77ifiq9ex92z lookyoo-nginx replicated 2/2 nginx:1.10
查看task
[root@Manager01 ~]# docker service ps lookyoo-nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
k9aha3eegv74 lookyoo-nginx.1 nginx:1.10 Manager02 Running Running about a minute ago
upmqf3kg55p8 lookyoo-nginx.2 nginx:1.10 Worker02 Running Running about a minute ago
上面可以看到lookyoo-centos在Worker01节点上面,使用dig命令来解析lookyoo-nginx服务
wxmini-test节点
[root@Worker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c835006aec97 centos:latest "ping www.baidu.com" 14 minutes ago Up 14 minutes lookyoo-centos.1.ljpn4xwknj8hf09dpygzaoxix
进入容器,使用dig命令解析lookyoo-nginx,解析到了10.0.2.31和10.0.2.32
[root@Manager02 ~]# docker exec -it c835006aec97 /bin/bash
[root@c835006aec97 /]# dig lookyoo-nginx
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> lookyoo-nginx
;; global options: cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61513
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;lookyoo-nginx. IN A
;; ANSWER SECTION:
lookyoo-nginx. 600 IN A 10.0.2.31
lookyoo-nginx. 600 IN A 10.0.2.32
;; Query time: 0 msec
;; SERVER: 127.0.0.11#53(127.0.0.11)
;; WHEN: Mon Nov 05 08:35:02 UTC 2018
;; MSG SIZE rcvd: 89
使用ping命令解析lookyoo-nginx服务,轮流解析到10.0.2.31和10.0.2.32
[root@c835006aec97 /]# ping lookyoo-nginx
PING lookyoo-nginx (10.0.2.31) 56(84) bytes of data.
64 bytes from lookyoo-nginx.1.k9aha3eegv74trsv7xjbow7zq.lookyoo (10.0.2.31): icmp_seq=1 ttl=64 time=0.493 ms
64 bytes from lookyoo-nginx.1.k9aha3eegv74trsv7xjbow7zq.lookyoo (10.0.2.31): icmp_seq=2 ttl=64 time=0.344 ms
64 bytes from lookyoo-nginx.1.k9aha3eegv74trsv7xjbow7zq.lookyoo (10.0.2.31): icmp_seq=3 ttl=64 time=0.359 ms
[root@c835006aec97 /]# ping lookyoo-nginx
PING lookyoo-nginx (10.0.2.32) 56(84) bytes of data.
64 bytes from lookyoo-nginx.2.upmqf3kg55p8sog7bwmtmq1fa.lookyoo (10.0.2.32): icmp_seq=1 ttl=64 time=1.39 ms
64 bytes from lookyoo-nginx.2.upmqf3kg55p8sog7bwmtmq1fa.lookyoo (10.0.2.32): icmp_seq=2 ttl=64 time=1.44 ms
64 bytes from lookyoo-nginx.2.upmqf3kg55p8sog7bwmtmq1fa.lookyoo (10.0.2.32): icmp_seq=3 ttl=64 time=1.29 ms
基于DNS负载均衡缺点:
某些应用程序将DNS主机名缓存到IP地址映射,会导致应用程序在映射更改时超时。
具有非零DNS ttl值会导致DNS条目反映最新详细信息时发生延迟。
适用于不需要对外提供服务的容器,因为不能使用-p参数,做端口映射。
注意
(一)dnsrr模式不能使用端口映射,如下会报错:
[root@wxmini-ops ~]# docker service create --endpoint-mode dnsrr --name lookyoo-nginx --replicas 1 --network lookyoo -p 19090:80 nginx
Error response from daemon: rpc error: code = InvalidArgument desc = EndpointSpec: port published with ingress mode can't be used with dnsrr mode