docker swam集群如何實現(xiàn)負(fù)載均衡
1. 初始化集群
第一個節(jié)點(diǎn)(manager):
$ docker swarm init Swarm initialized: current node (9qksq9kb8tt9i5un3y2eqbhlj) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-5b3w5w10px9ok0t39zs1nujng8x37rcapfkg885hmrokb5wvqi-9v45djurbjeajp3ln80zqcevu 172.17.0.6:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
第二個節(jié)點(diǎn)(worker):
$ docker swarm join 172.17.0.6:2377 --token $(ssh -o StrictHostKeyChecking=no 172.17.0.6 "docker swarm join-token -q worker") Warning: Permanently added '172.17.0.6' (ECDSA) to the list of known hosts. This node joined a swarm as a worker.
默認(rèn)情況下,對服務(wù)的請求基于公共端口進(jìn)行負(fù)載均衡。
2. 虛擬IP
下面的命令將創(chuàng)建一個名為lbapp1
的新服務(wù),其中運(yùn)行兩個容器。
服務(wù)通過端口公開81
$ docker service create --name lbapp1 --replicas 2 -p 81:80 katacoda/docker-http-server 7w8k1esxuyx1gs17hwa4svop5
當(dāng)向集群中端口81上的節(jié)點(diǎn)發(fā)出請求時,它會將負(fù)載分散到兩個容器上。
$ curl host01:81 <h1>This request was processed by host: cbc4fa365043</h1> $ curl host01:81 <h1>This request was processed by host: faecced3dc9f</h1>
HTTP響應(yīng)指示哪個容器處理請求。
在第二臺主機(jī)上運(yùn)行命令會得到相同的結(jié)果,它會跨這兩臺主機(jī)處理請求。
在下一步中,我們將探討如何使用它來部署一個實際的應(yīng)用程序。
3. 服務(wù)發(fā)現(xiàn)
Docker群模式包括一個路由網(wǎng),它支持多主機(jī)網(wǎng)絡(luò)。
它允許兩個不同主機(jī)上的容器通信,就像它們在同一主機(jī)上一樣。
它通過創(chuàng)建虛擬可擴(kuò)展LAN (VXLAN)來實現(xiàn)這一點(diǎn),VXLAN是為基于云的網(wǎng)絡(luò)設(shè)計的。
路由以兩種不同的方式工作。
- 首先,基于公共端口暴露的服務(wù)。任何對端口的請求都將被分發(fā)。
- 其次,該服務(wù)被賦予一個虛擬IP地址,該IP地址僅在Docker網(wǎng)絡(luò)內(nèi)部可路由。
當(dāng)向IP地址發(fā)出請求時,它們被分發(fā)到底層容器。
這個虛擬IP是在Docker中的嵌入式DNS服務(wù)器上注冊的。
當(dāng)基于服務(wù)名進(jìn)行DNS解析時,返回Virtual IP
。
在這個步驟中,你將創(chuàng)建一個負(fù)載均衡的http,它被附加到一個覆蓋網(wǎng)絡(luò),并查找它是虛擬IP。
$ docker network create --attachable -d overlay eg1 cf4fx7p2a75irup0pjafylpd4
這個網(wǎng)絡(luò)將是一個“群體范圍網(wǎng)絡(luò)”。
這意味著只有作為服務(wù)啟動的容器才能將自己附加到網(wǎng)絡(luò)上。
$ docker service create --name http --network eg1 --replicas 2 katacoda/docker-http-server
通過調(diào)用服務(wù)http, Docker添加了一個條目到它是嵌入式DNS服務(wù)器。
網(wǎng)絡(luò)上的其他容器可以使用友好的名稱來發(fā)現(xiàn)IP地址。
與端口一起,這個IP地址可以在網(wǎng)絡(luò)內(nèi)部使用,以達(dá)到負(fù)載均衡。
使用Dig查找內(nèi)部虛擬IP。
通過使用--attable
標(biāo)志,Swarm服務(wù)之外的容器可以訪問網(wǎng)絡(luò)。
$ docker run --name=dig --network eg1 benhall/dig dig http Unable to find image 'benhall/dig:latest' locally latest: Pulling from benhall/dig 12b41071e6ce: Pull complete d23aaa6caac4: Pull complete a3ed95caeb02: Pull complete Digest: sha256:ed7d241f0faea3a015d13117824c04a433a79032619862e4e3741a31eb9e4272 Status: Downloaded newer image for benhall/dig:latest ; <<>> DiG 9.10.2 <<>> http ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59560 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;http. IN A ;; ANSWER SECTION: http. 600 IN A 10.0.1.2 ;; Query time: 1 msec ;; SERVER: 127.0.0.11#53(127.0.0.11) ;; WHEN: Thu Sep 30 07:59:23 UTC 2021 ;; MSG SIZE rcvd: 42
通過ping該名稱還可以發(fā)現(xiàn)IP地址。
$ docker run --name=ping --network eg1 alpine ping -c5 http PING http (10.0.1.2): 56 data bytes 64 bytes from 10.0.1.2: seq=0 ttl=64 time=0.287 ms 64 bytes from 10.0.1.2: seq=1 ttl=64 time=0.108 ms 64 bytes from 10.0.1.2: seq=2 ttl=64 time=0.160 ms 64 bytes from 10.0.1.2: seq=3 ttl=64 time=0.157 ms 64 bytes from 10.0.1.2: seq=4 ttl=64 time=0.131 ms --- http ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max = 0.108/0.168/0.287 ms
這應(yīng)該與給服務(wù)的虛擬IP相匹配。
您可以通過檢查服務(wù)來發(fā)現(xiàn)這一點(diǎn)。
$ docker service inspect http --format="{{.Endpoint.VirtualIPs}}" [{cf4fx7p2a75irup0pjafylpd4 10.0.1.2/24}]
每個容器仍然會被賦予一個唯一的IP地址。
$ docker inspect --format="{{.NetworkSettings.Networks.eg1.IPAddress}}" $(docker'{print $1}')cker-http-server | head -n1 | awk 10.0.1.4
這個虛擬IP確保在集群中按照預(yù)期的方式進(jìn)行負(fù)載平衡。而IP地址確保它在集群外工作。
4. 多主機(jī)LB和服務(wù)發(fā)現(xiàn)
虛擬IP和端口負(fù)載均衡和服務(wù)發(fā)現(xiàn)都可以用于多主機(jī)場景,應(yīng)用程序可以在不同的主機(jī)上與不同的服務(wù)通信。
在這個步驟中,我們將部署一個復(fù)制的Node.js
應(yīng)用程序,它與Redis
通信來存儲數(shù)據(jù)。
首先,需要有一個覆蓋網(wǎng)絡(luò),應(yīng)用程序和數(shù)據(jù)存儲可以連接。
$ docker network create -d overlay app1-network
部署Redis時,可以連接網(wǎng)絡(luò)。應(yīng)用程序希望能夠連接到一個名為Redis的實例。為了使應(yīng)用程序能夠通過嵌入式DNS發(fā)現(xiàn)虛擬IP,我們調(diào)用服務(wù)Redis。
$ docker service create --name redis --network app1-network redis:alpine
每個主機(jī)都應(yīng)該有一個Node.js容器實例,其中一個主機(jī)存儲Redis。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 06f131fda216 redis:alpine "docker-entrypoint.s…" 27 seconds ago Up 25 seconds 6379/tcp redis.1.mq95cigfa7etgefqs1pye9crv 1890d08df8cc katacoda/docker-http-server:latest "/app" 7 minutes ago Up 7 minutes 80/tcp http.2.j5c4ari06egpy3zqw6b0n3iyl
調(diào)用HTTP服務(wù)器將在Redis中存儲請求并返回結(jié)果。這是負(fù)載平衡,兩個容器通過覆蓋網(wǎng)絡(luò)與Redis容器通信。
應(yīng)用程序現(xiàn)在分布在多個主機(jī)上。
參考:
- Docker Swarm (cluster communication, service discovery, load balancing)
- The Definitive Guide to Docker Swarm
- How to get started with load balancing Docker Swarm mode
- Traefik and Docker Swarm: A Dynamic Duo for Cloud-Native Container Networking
- HAProxy on Docker Swarm: Load Balancing and DNS Service Discovery
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- docker安裝nginx實現(xiàn)對springboot項目的負(fù)載均衡的操作方法
- Docker安裝Nacos容器并根據(jù)Nginx實現(xiàn)負(fù)載均衡
- docker搭建nginx實現(xiàn)負(fù)載均衡的示例代碼
- 基于Docker部署Tomcat集群、 Nginx負(fù)載均衡的問題小結(jié)
- docker swarm外部驗證負(fù)載均衡時不生效的解決方案
- Docker Nginx容器和Tomcat容器實現(xiàn)負(fù)載均衡與動靜分離操作
- 使用Docker Compose 實現(xiàn)nginx負(fù)載均衡的方法步驟
- 詳解Docker Swarm服務(wù)發(fā)現(xiàn)和負(fù)載均衡原理
- 詳解利用nginx和docker實現(xiàn)一個簡易的負(fù)載均衡
- Docker部署tenine實現(xiàn)后端應(yīng)用的高可用與負(fù)載均衡(推薦)
相關(guān)文章
部署維護(hù)docker環(huán)境的詳細(xì)教程
這篇文章主要介紹了部署維護(hù)docker環(huán)境的詳細(xì)教程,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-02-02樹莓派系列之使用docker安裝青龍面板和改端口號的配置問題
這篇文章主要介紹了樹莓派系列之使用docker安裝青龍面板和改端口號的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02Docker部署Ragflow(完美解決502 bad gateway)
本文主要介紹了Docker部署Ragflow,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04Docker容器化部署嘗試——多容器通信(node+mongoDB+nginx)
這篇文章主要介紹了Docker容器化部署嘗試——多容器通信(node+mongoDB+nginx),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12docker-compose快速搭建docker私有倉庫的步驟
這篇文章主要介紹了docker-compose快速搭建docker私有倉庫的步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Docker 數(shù)據(jù)卷及數(shù)據(jù)容器詳細(xì)介紹及示例
這篇文章主要介紹了Docker 數(shù)據(jù)卷及數(shù)據(jù)容器詳細(xì)介紹及示例的相關(guān)資料,Docker 很強(qiáng)大,不僅部署維護(hù)提高效率,docker和宿主之間的數(shù)據(jù)共享以及docker間的數(shù)據(jù)共享需要好好研究一下,需要的朋友可以參考下2016-11-11使用docker-compose實現(xiàn)不停機(jī)部署/灰度發(fā)布的四種方法
灰度發(fā)布是一種軟件部署策略,它允許將新版本的部分功能或服務(wù)逐步推送給用戶,而不是一次性對所有用戶進(jìn)行大規(guī)模更新,本文主要給大家介紹了使用docker-compose實現(xiàn)不停機(jī)部署/灰度發(fā)布的四種方法,需要的朋友可以參考下2024-11-11