
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将请求路由给它。
# 进容器查看DNS记录
nslookup hello
# 获取虚拟IP
docker service inspect -f '{{json .Endpoint.VirtualIPs}}' my-web
# 设置DNS轮询模式
docker service create \
--replicas 3 \
--name my-web \
--network my-network \
--endpoint-mode dnsrr \
nginx
安装nginx带端口
[root@node1 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE f7472b5cff81 bridge bridge local ef94b6e28914 docker_gwbridge bridge local 36b5c10f7be5 host host local qqm12za7nzhg ingress overlay swarm lzhcjzuhhydo my-network overlay swarm e9acd92776c4 none null local
[root@node1 ~]# docker service create --replicas 5 --name my-nginx -p 80:80 --network my-network nginx
yokp84koaustdgz28rubrnabs
[root@node1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE
l1ak4wcy893g my-nginx replicated 5/5 nginx:latest
[root@node1 ~]# docker service ps my-nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
c9cdksc7jaoy my-nginx.1 nginx:latest node2 Running Running 16 seconds ago
r8lzal3vkyee my-nginx.2 nginx:latest node3 Running Running 16 seconds ago
9pkc6ciyk2kw my-nginx.3 nginx:latest node2 Running Running 16 seconds ago
fgd6kfgh9ug3 my-nginx.4 nginx:latest node3 Running Running 16 seconds ago
rqs4p60snnpm my-nginx.5 nginx:latest node1 Running Running 16 seconds ago
安装测试busybox
[root@node1 ~]# docker service create --replicas 3 --name hello busybox --network my-network --args "ping www.baidu.com" n41c3vkp93tdt1rhf2ez8ber7
[root@node1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE
l1ak4wcy893g my-nginx replicated 5/5 nginx:latest
n41c3vkp93td hello replicated 3/3 busybox:latest
[root@node2 ~]# docker exec -it 5b1de8300426 sh
nsenter nslookup
/ # nslookup my-nginx
Server: 100.100.2.136
Address 1: 100.100.2.136
Name: my-nginx
Address 1: 10.0.0.2
[root@node1 ~]# docker service inspect -f '{{json .Endpoint.VirtualIPs}}' my-nginx
[{"NetworkID":"qqm12za7nzhg5vcsh07072ifc","Addr":"10.255.0.6/16"},{"NetworkID":"lzhcjzuhhydo5ewhf1m149v4w","Addr":"10.0.0.2/24"}]
[root@node1 ~]# curl -I http://192.168.3.245
HTTP/1.1 200 OK
Server: nginx/1.13.12
Date: Mon, 23 Apr 2018 18:44:21 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 09 Apr 2018 16:01:09 GMT
Connection: keep-alive
ETag: "5acb8e45-264"
Accept-Ranges: bytes
[root@node1 ~]# curl -I http://192.168.3.244
HTTP/1.1 200 OK
Server: nginx/1.13.12
Date: Mon, 23 Apr 2018 18:44:24 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 09 Apr 2018 16:01:09 GMT
Connection: keep-alive
ETag: "5acb8e45-264"
Accept-Ranges: bytes
[root@node1 ~]# curl -I http://192.168.3.246
HTTP/1.1 200 OK
Server: nginx/1.13.12
Date: Mon, 23 Apr 2018 18:44:26 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 09 Apr 2018 16:01:09 GMT
Connection: keep-alive
ETag: "5acb8e45-264"
Accept-Ranges: bytes
安装nginx 没有配置端口
[root@node1 ~]# docker service create --replicas 3 --name my-nginx2 --network my-network --endpoint-mode dnsrr nginx 18cvdt76wcjh8v58m4cdu9e34 [root@node1 ~]# docker service ls ID NAME MODE REPLICAS IMAGE 18cvdt76wcjh my-nginx2 replicated 3/3 nginx:latest l1ak4wcy893g my-nginx replicated 5/5 nginx:latest n41c3vkp93td hello replicated 3/3 busybox:latest
/ # nslookup my-nginx2 Server: 100.100.2.136 Address 1: 100.100.2.136 Name: my-nginx2 Address 1:192.168.3.245 ud91h1g1asz11nx6awh7mnhde Address 2:192.168.3.244 51j22vn5fmr7yxe8by95pjary Address 3:192.168.3.246 vaa42e77pbpo5citkb57h0o0n
服务发现与负载均衡

高可用性
Manager节点任务:
1. 维护集群状态
2. 调度服务
3. 提供swarm模式的HTTP API

# 以管理节点角色加入swarm
docker swarm join-token manager
# 在管理节点手动改变角色
docker node promote <NAME>
docker node demote <NAME>
# 在管理节点查看角色
docker node ls
扩展集群
Docker UCP(Docker的集群管理工具) 设计为可以随应用大小和使用率的增长而水平扩展。可以在 UCP 集群中添加或删除节点来扩展集群以满足需求。由于 UCP 利用 Docker 引擎提供的集群功能,因此您可以使用 docker swarm join 命令向集群中添加更多节点。在加入新节点时,UCP 服务将在此节点中自动开始运行。
# 在将节点加入Swarm集群中时,可以选择加入的是工作节点还是管理节点
# 加入管理节点
[root@node1 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-0blcl3t4a82sutk6dmj9otdjvr5t1y9tklcx624izcvab38vo8-cjv4w9mpwoj3bf6wqjmynmfry \
192.168.3.245:2377
[root@manager ~]# yum install docker -y
[root@manager ~]# docker swarm join --token SWMTKN-1-0blcl3t4a82sutk6dmj9otdjvr5t1y9tklcx624izcvab38vo8-cjv4w9mpwoj3bf6wqjmynmfry 192.168.3.245:2377
This node joined a swarm as a manager.
# 加入工作节点
[root@node1 ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-0blcl3t4a82sutk6dmj9otdjvr5t1y9tklcx624izcvab38vo8-8yvuv3p8k5yg8h87ka6e3h3o0 \
192.168.3.245:2377
[root@node4 ~]# yum install docker -y
[root@node4 ~]# docker swarm join \
> --token SWMTKN-1-0blcl3t4a82sutk6dmj9otdjvr5t1y9tklcx624izcvab38vo8-8yvuv3p8k5yg8h87ka6e3h3o0 \
> 192.168.3.245:2377
This node joined a swarm as a worker.
可以通过docker node promote/demote来节点改变成管理或工作节点
[root@node1 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 72664vnxwv9efmib5lr9rli3j * node1 Ready Active Leader o5gzuhslw14sxyi4lc5yee1f7 node4 Ready Active odtu70p5unyiy3hvowbraw2lj node3 Ready Active u7fxhqd3afrx62hufl14fauw3 manager Ready Active Reachable zhg2isim7fj2osyvg7x7yls0i node2 Ready Active
[root@node1 ~]# docker node promote node4 Node node4 promoted to a manager in the swarm. [root@node1 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 72664vnxwv9efmib5lr9rli3j * node1 Ready Active Leader o5gzuhslw14sxyi4lc5yee1f7 node4 Ready Active Reachable odtu70p5unyiy3hvowbraw2lj node3 Ready Active u7fxhqd3afrx62hufl14fauw3 manager Ready Active Reachable zhg2isim7fj2osyvg7x7yls0i node2 Ready Active
[root@manager ~]# docker service ls ID NAME MODE REPLICAS IMAGE 18cvdt76wcjh my-nginx2 replicated 3/3 nginx:latest l1ak4wcy893g my-nginx replicated 5/5 nginx:latest n41c3vkp93td hello replicated 3/3 busybox:latest
[root@node1 ~]# systemctl stop docker
[root@manager ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 72664vnxwv9efmib5lr9rli3j node1 Down Active Unreachable o5gzuhslw14sxyi4lc5yee1f7 node4 Ready Active Reachable odtu70p5unyiy3hvowbraw2lj node3 Ready Active u7fxhqd3afrx62hufl14fauw3 * manager Ready Active Leader zhg2isim7fj2osyvg7x7yls0i node2 Ready Active
浙公网安备 33010602011771号