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