Docker Swarm服务发现和负载均衡原理
Docker Swarm服務(wù)發(fā)現(xiàn)和負(fù)載均衡原理
?
Docker使用的是Linux內(nèi)核iptables和IPVS的功能來實現(xiàn)服務(wù)發(fā)現(xiàn)和負(fù)載均衡。Iptables是Linux內(nèi)核中可用的包過濾技術(shù),可根據(jù)數(shù)據(jù)包的內(nèi)容進行分類、修改和轉(zhuǎn)發(fā)決策。IPVS是Linux內(nèi)核中可用的傳輸級負(fù)載均衡。
?
本地創(chuàng)建一個集群環(huán)境,我本地有三節(jié)點集群環(huán)境:
?
客戶端鏡像:registry.cn-hangzhou.aliyuncs.com/anoy/ubuntu
服務(wù)端鏡像:registry.cn-hangzhou.aliyuncs.com/anoy/vote
?
DNS server內(nèi)嵌于Docker引擎。在創(chuàng)建集群的時候可以直接指定
--endpoint-mode dnsrr 來指明,這個服務(wù)里面的task或者是所有啟動的容器訪問都通過DNS的方式來進行負(fù)載均衡,這個是啥意思。操作下就清楚了:
?
創(chuàng)建一個網(wǎng)絡(luò)
docker network create --driver overlay overlay1
創(chuàng)建client節(jié)點(啟動一個),和vote節(jié)點(啟動多個),實現(xiàn)client節(jié)點訪問vote的時候,是給均衡到不同的vote上了。
?
docker service create --endpoint-mode dnsrr --replicas 1 --name client --network overlay1 registry.cn-hangzhou.aliyuncs.com/anoy/ubuntu ping anoyi.com
?
docker service create --endpoint-mode dnsrr --name vote --network overlay1 --replicas 2 registry.cn-hangzhou.aliyuncs.com/anoy/vote
?
然后進行如下操作
docker service ls 查看服務(wù)
docker service ps xxxxclient的id ?查看client的信息,找到他在哪個節(jié)點上,然后登陸到那個節(jié)點節(jié)點的機器上
docker ps ?查看容器,找到client對應(yīng)的容器
docker exec -it xxxxclientid bash ?登陸到這個容器 ?
上面操作如下圖
此時在client容器上,可以直接dig vote 看下對vote的dns解析
?
如上,有兩條。可以測試下是不是會被隨機解析到上面,這里用ping
?
是可以看到均衡效果的,這個就是基本的DNS解析來實現(xiàn)負(fù)載均衡。但是這樣會產(chǎn)生問題,某些應(yīng)用程序?qū)NS主機名緩存到IP地址映射,這回導(dǎo)致應(yīng)用程序在訪問更改時超時,具有非零DNS ttl 值會導(dǎo)致DNS條目反應(yīng)最新的詳細(xì)信息時發(fā)生延遲。
?
??基于VIP的負(fù)載均衡可以解決1中DNS總是隨便挑給客戶端帶來的不方便的影響。每個服務(wù)都有一個IP地址,并且該IP地址映射到與該服務(wù)關(guān)聯(lián)的多個容器的IP地址。在這種情況下,與服務(wù)關(guān)聯(lián)的服務(wù)IP不會改變,即使與該服務(wù)關(guān)聯(lián)的容器死亡并重新啟動。
??運行過程中,DNS service會將服務(wù)名”vote”解析到VIP,使用iptables和ipvs,VIP實現(xiàn)2個服務(wù)端”vote”容器的負(fù)載均衡。
?
把上面創(chuàng)建的兩個服務(wù)刪除,然后重新部署。
?
docker service create --replicas 1 --name client --network overlay1 registry.cn-hangzhou.aliyuncs.com/anoy/ubuntu ping anoyi.com
?
docker service create --name vote --network overlay1 --replicas 2 registry.cn-hangzhou.aliyuncs.com/anoy/vote
?
并沒有指定--endpoint-mode,也就是說Docker Swarm默認(rèn)就是用的VIP
?
查看這兩個服務(wù)的VIP
docker service inspect --format {{.Endpoint.VirtualIPs}} vote
docker service inspect --format {{.Endpoint.VirtualIPs}} client
?
然后跟上面姿勢一樣,找下client在哪個節(jié)點上,登上去,看下他是怎么dns vote的。
?
這次DNS就只有一個解析了,解析到的地址是vote服務(wù)的VIP,ping的話也不會存在跳轉(zhuǎn)別的ip的情況。
現(xiàn)在別動,繼續(xù)在client里面執(zhí)行
curl vote | grep -i "container id"
通過返回來的容器id來區(qū)分到底是誰在為我們干活
?
路由網(wǎng)格(Routing mesh)
使用路由網(wǎng)格,服務(wù)暴露的端口會暴露在Swarm集群中的所有工作節(jié)點。Docker是通過創(chuàng)建 ingress overlay網(wǎng)絡(luò)來實現(xiàn)這一點的。所有節(jié)點默認(rèn)使用內(nèi)在的sandbox網(wǎng)絡(luò)命名空間成為ingress overlay網(wǎng)絡(luò)的一部分:
?
直接在上面的實操例子上更新一個端口映射
docker service update --publish-add 80:80 9fk2k04fw98p
?
Sandbox和vote容器是ingress網(wǎng)絡(luò)的一部分,它有助于路由網(wǎng)格。client容器和vote容器是overlay1網(wǎng)絡(luò)的一部分,有助于內(nèi)部負(fù)載均衡。所有容器都是默認(rèn)docker_gwbridge網(wǎng)絡(luò)的一部分。遵循iptables中的NAT規(guī)則顯示,端口80上的主機流量發(fā)送到node1里的Sandbox.
這樣,然后瀏覽器訪問(不同刷新):
?
跟預(yù)期的一樣,每個節(jié)點上不停的刷新都會看到下面的容器id會交替變化,說明負(fù)載均衡是好使的。
?
總結(jié)
以上是生活随笔為你收集整理的Docker Swarm服务发现和负载均衡原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 负载均衡-基本概念
- 下一篇: redis批量操作及性能分析