Docker Swarm負載均衡策略
1. 負載方式
- ingress network: docker swarm 供外部系統訪問容器訪問(原生支持,詳情看vip方式演示),依賴docker swarm 默認overlay類型的ingress網絡
- VIP: 同網絡內容器之間的服務通過VIP實現負載均衡
- DNSRR: 同網絡容器之間的服務通過DNS實現負載均衡
2. 環境準備
4臺虛擬機:可使用docker-machine快速創建3臺包含docker環境的虛擬機
sample@debian:~$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
manager - virtualbox Running tcp://192.168.99.100:2376 v19.03.12
worker-1 - virtualbox Running tcp://192.168.99.101:2376 v19.03.12
worker-2 - virtualbox Running tcp://192.168.99.103:2376 v19.03.12
worker-3 - virtualbox Running tcp://192.168.99.104:2376 v19.03.12
3. VIP負載均衡
- 登錄docker swarm管理機: docker-machine ssh manager
- 創建overlay網絡:docker network create --driver overlay vip-overlay
- 創建nginx服務:docker service create --name vip-nginx -p 80:80 --replicas 3 --network vip-overlay nginx
- 創建nginx訪問客戶端容器:docker service create --name vip-debian --network vip-overlay yangzhiwei256/debian sleep 3000
- 查看nginx服務部署節點信息:docker service ps vip-nginx
docker@manager:~$ docker service ps vip-nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
othtk3grnnj9 vip-nginx.1 nginx:latest manager Running Running 21 minutes ago
kkrxqfw6vuy9 vip-nginx.2 nginx:latest worker-3 Running Running 21 minutes ago
7nxlitp39kws vip-nginx.3 nginx:latest worker-1 Running Running 21 minutes ago
- 修改nginx歡迎頁(3個節點容器) 路徑:/usr/share/nginx/html/index.html
修改manager節點index頁面
- 登錄manager節點:docker-machine ssh manager
- 查看容器信息:docker ps
- 登錄容器: docker exec -it <容器ID> /bin/bash
- 修改index.html: echo manager > /usr/share/nginx/html/index.html
- 其他worker-1、worker-3 重複上述流程
- ingress network 訪問(外部系統訪問)
- 隨便登錄一臺可訪問docker-machine節點的服務器
- 服務訪問,查看負載均衡效果
- 注意:每個docker swarm 服務節點都內置loadbalancer模塊,都可實現負載均衡訪問, 實際部署考慮單點故障問題,部署服務節點上層需加nginx網關,實現雙重負載保證高可用
sample@debian:~$ curl 192.168.99.100
worker-1
sample@debian:~$ curl 192.168.99.100
worker-3
sample@debian:~$ curl 192.168.99.100
manager
sample@debian:~$ curl 192.168.99.101
manager
sample@debian:~$ curl 192.168.99.101
worker-3
sample@debian:~$ curl 192.168.99.101
worker-1
- vip方式訪問
- 查看網絡(manager節點)
docker@manager:~$ docker network ls
NETWORK ID NAME DRIVER SCOPE
09e9cfc71ee7 bridge bridge local
66534a0da6cc docker_gwbridge bridge local
a77be4ecae73 host host local
i5tgmrizq64n ingress overlay swarm
6468096b83b4 none null local
qhmc36orimf8 vip-overlay overlay swarm
- 查看虛擬IP
docker@manager:~$ docker service inspect -f '{{json .Endpoint.VirtualIPs}}' vip-nginx
[{"NetworkID":"i5tgmrizq64ns0zyogh4he6u8","Addr":"10.0.0.56/24"},{"NetworkID":"qhmc36orimf87frdhxnee3ikv","Addr":"10.0.2.19/24"}]
注意:這裏有2個網絡根據networkID判斷,i5tgmrizq64ns0zyogh4he6u8對比網絡列表是docker swarm默認給外部系統訪問的負載網絡,我們使用的網絡爲vip-overlay,即vip爲10.0.2.19/24
- 通過vip訪問(同網絡容器內部訪問)
- 登錄vip-debian:docker exec -it <vip-debian容器id> /bin/bash
- vip服務訪問
docker@worker-2:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08f862098d8d yangzhiwei256/debian:latest "sleep 3000" 48 seconds ago Up 47 seconds vip-debian.1.7xfros0di1wogel0bzi2pk9pd
docker@worker-2:~$ docker exec -it 08f862098d8d /bin/bash
root@08f862098d8d:/# curl 10.0.2.19
manager
root@08f862098d8d:/# curl 10.0.2.19
worker-1
root@08f862098d8d:/# curl 10.0.2.19
worker-3
4. dnsrr負載均衡
- 登錄docker swarm管理機: docker-machine ssh manager
- 創建overlay網絡:docker network create --driver overlay dnsrr-overlay
- 創建nginx服務:docker service create --name dnsrr-nginx --replicas 3 --network dnsrr-overlay --endpoint-mode dnsrr --publish published=81,target=80,protocol=tcp,mode=host nginx
- 創建debian服務:docker service create --name dnsrr-debian --network dnsrr-overlay yangzhiwei256/debian sleep 3000
- 修復服務節點nginx index.html,步驟同vip操作
- 效果演示
- 登錄dnsrr-debian容器內部
- DNS服務訪問
root@d269da355467:/# curl dnsrr-nginx:80
worker-2
root@d269da355467:/# curl dnsrr-nginx:80
worker-3
root@d269da355467:/# curl dnsrr-nginx:80
worker-1