亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

詳解Docker Swarm服務發現和負載均衡原理

2024-09-01 13:54:46
字體:
來源:轉載
供稿:網友

本文將介紹基于 DNS 的負載均衡、基于 VIP 的負載均衡和路由網格(Routing Mesh)。

使用的技術

Docker 使用了 Linux 內核 iptables 和 IPVS 的功能來實現服務發現和負載均衡。

iptables 是 Linux 內核中可用的包過濾技術,它可用于根據數據包的內容進行分類、修改和轉發決策。

IPVS 是 Linux 內核中可用的傳輸級負載均衡器。

準備工作

swarm 集群: 【Manager】node1、【Worker】node2

客戶端鏡像: registry.cn-hangzhou.aliyuncs.com/anoy/ubuntu

服務端鏡像: registry.cn-hangzhou.aliyuncs.com/anoy/vote

Docker,Swarm,負載均衡

如圖所示,我們將在 swarm 集群中部署 “client” 服務 和 “vote” 服務,其中 “vote” 服務部署多個副本??蛻舳苏埱?“vote” 服務時,輸出結果中包含服務端的容器 ID,這樣就更方便演示網絡請求。

集群狀態

[root@node1 ~]# docker node lsID              HOSTNAME      STATUS       AVAILABILITY    MANAGER STATUS   ENGINE VERSIONrnr2i1y2of3n5vy2vzh2vkzq0 *  node1        Ready        Active       Leader       18.03.1-ceqvik057dvphx5s06evmswahaf   node2        Ready        Active                 18.03.1-ce

使用如下命令,創建 overlay 網絡:

docker network create --driver overlay overlay1

基于 DNS 的負載均衡

下圖描述了基于 DNS 的負載均衡是如何工作的:

Docker,Swarm,負載均衡

DNS server 內嵌于 Docker 引擎。Docker DNS 解析服務名 “vote” 并返回容器 ID 地址列表(隨機排序)。客戶端通常會挑第一個 IP 訪問,因此負載均衡可能發生在服務器的不同實例之間。

使用如下命令創建 2 個基于 DNS 負載均衡的服務 “client” 、 “vote”:

docker service create --endpoint-mode dnsrr --replicas 1 --name client --network overlay1 registry.cn-hangzhou.aliyuncs.com/anoy/ubuntu ping anoyi.comdocker service create --endpoint-mode dnsrr --name vote --network overlay1 --replicas 2 registry.cn-hangzhou.aliyuncs.com/anoy/vote

查看服務信息:

[root@node1 ~]# docker service lsID         NAME        MODE        REPLICAS      IMAGE                         PORTS2mrj3pqyioc3    client       replicated     1/1         registry.cn-hangzhou.aliyuncs.com/anoy/ubuntu:latest826s79tsixuh    vote        replicated     2/2         registry.cn-hangzhou.aliyuncs.com/anoy/vote:latest[root@node1 ~]# docker service ps clientID         NAME        IMAGE                         NODE        DESIRED STATE    CURRENT STATE      ERROR        PORTSf74i688vbh12    client.1      registry.cn-hangzhou.aliyuncs.com/anoy/ubuntu:latest  node2        Running       Running 2 minutes ago[root@node1 ~]# docker service ps voteID         NAME        IMAGE                        NODE        DESIRED STATE    CURRENT STATE        ERROR        PORTS7iiuzl2a63hy    vote.1       registry.cn-hangzhou.aliyuncs.com/anoy/vote:latest  node1        Running       Running 47 seconds agouyhxxqfdima7    vote.2       registry.cn-hangzhou.aliyuncs.com/anoy/vote:latest  node2        Running       Running about a minute ago

可以看出 "client" 運行于 node2,在 node2 上進入 client 容器,使用 dig 來解析服務名 "vote",如下所示,"vote" 解析到 10.0.0.6 和 10.0.0.5

[root@node2 ~]# docker psCONTAINER ID    IMAGE                         COMMAND         CREATED       STATUS       PORTS        NAMES1eed67d37cbb    registry.cn-hangzhou.aliyuncs.com/anoy/vote:latest   "gunicorn app:app -b…"  About a minute ago  Up About a minute  80/tcp       vote.2.uyhxxqfdima7smos5pki84wul436702b21a1c    registry.cn-hangzhou.aliyuncs.com/anoy/ubuntu:latest  "ping anoyi.com"     3 minutes ago    Up 3 minutes              client.1.f74i688vbh12on8oniufht633[root@node2 ~]# docker exec -it 436702b21a1c /bin/bashroot@436702b21a1c:/# dig vote;; ANSWER SECTION:vote.      600 IN A  10.0.0.5vote.      600 IN A  10.0.0.6

使用 ping 解析 "vote" 服務,如下所示,交替解析到 10.0.0.6 和 10.0.0.5

root@436702b21a1c:/# ping -c1 votePING vote (10.0.0.6) 56(84) bytes of data.64 bytes from vote.2.uyhxxqfdima7smos5pki84wul.overlay1 (10.0.0.6): icmp_seq=1 ttl=64 time=0.087 msroot@436702b21a1c:/# ping -c1 votePING vote (10.0.0.5) 56(84) bytes of data.64 bytes from vote.1.7iiuzl2a63hyj084qgufc175v.overlay1 (10.0.0.5): icmp_seq=1 ttl=64 time=0.767 ms

如果使用 curl,如下所示,請求也能解析到不同的容器

root@436702b21a1c:/# curl vote | grep -i "container id" % Total  % Received % Xferd Average Speed  Time  Time   Time Current                 Dload Upload  Total  Spent  Left Speed100 3162 100 3162  0   0  7542   0 --:--:-- --:--:-- --:--:-- 7546     Processed by container ID 9b42319d4f13root@436702b21a1c:/# curl vote | grep -i "container id" % Total  % Received % Xferd Average Speed  Time  Time   Time Current                 Dload Upload  Total  Spent  Left Speed100 3162 100 3162  0   0  452k   0 --:--:-- --:--:-- --:--:-- 514k     Processed by container ID 1eed67d37cbb

基于 DNS 負載均衡存在如下問題:

  1. 某些應用程序將 DNS 主機名緩存到 IP 地址映射,這會導致應用程序在映射更改時超時
  2. 具有非零 DNS ttl 值會導致 DNS 條目反映最新的詳細信息時發生延遲

基于 VIP 的負載均衡

基于 VIP 的負載均衡克服了基于 DNS 負載均衡的一些問題。在這種方法中,每個服務都有一個 IP 地址,并且該 IP 地址映射到與該服務關聯的多個容器的 IP 地址。在這種情況下,與服務關聯的服務 IP 不會改變,即使與該服務關聯的容器死亡并重新啟動。

下圖描述了基于 VIP 的負載均衡是如何工作的:

Docker,Swarm,負載均衡

DNS server 會將服務名 "vote" 解析到 VIP,使用 iptables 和 ipvs,VIP 實現 2 個服務端 "vote" 容器的負載均衡。

使用如下命令創建 2 個 VIP 模式的服務 “client” 、 “vote”:

docker service create --replicas 1 --name client --network overlay1 registry.cn-hangzhou.aliyuncs.com/anoy/ubuntu ping anoyi.comdocker service create --name vote --network overlay1 --replicas 2 registry.cn-hangzhou.aliyuncs.com/anoy/vote

查看這 2 個服務和它們的服務 IP:

[root@node1 ~]# docker service inspect --format {{.Endpoint.VirtualIPs}} vote[{tetug0isdx1gri62g7cfm889i 10.0.0.9/24}][root@node1 ~]# docker service inspect --format {{.Endpoint.VirtualIPs}} client[{tetug0isdx1gri62g7cfm889i 10.0.0.7/24}]

在 "client" 的容器中使用如下命令,可以看到服務名 "vote" 映射到 VIP "10.0.0.9"

[root@node2 ~]# docker exec -it f3d1c4ef53f8 /bin/bashroot@f3d1c4ef53f8:/# dig vote;; ANSWER SECTION:vote.      600 IN A  10.0.0.9

Service IP "10.0.0.9" 使用 Linux 內核的 iptables 和 IPVS 負載均衡到 2 個容器。iptables 實現防火墻規則,IPVS 實現負載均衡。為了證明這一點,我們需要使用 nsenter 進入容器的網絡空間 ( namespace )。為此,我們需要找到網絡的命名空間。

如下是 node2 上的網絡命名空間:

[root@node2 ~]# cd /run/docker/netns/[root@node2 netns]# ls1-tetug0isdx 1-vyy22w04t6 be7330b99a27 d67fa9efb59e ingress_sbox

前 2 個命名空間是用于 overlay 網絡,后面的用于容器。下面的命令用于找到 "client" 容器的網絡命名空間:

[root@node2 netns]# docker psCONTAINER ID    IMAGE                         COMMAND         CREATED       STATUS       PORTS        NAMES43a789312e70    registry.cn-hangzhou.aliyuncs.com/anoy/vote:latest   "gunicorn app:app -b…"  3 minutes ago    Up 3 minutes    80/tcp       vote.1.u46ms31e8zjdxtwrxvaec8zubf3d1c4ef53f8    registry.cn-hangzhou.aliyuncs.com/anoy/ubuntu:latest  "ping anoyi.com"     4 minutes ago    Up 4 minutes              client.1.ycox088aek5ajejezubwsjqf2[root@node2 netns]# docker inspect f3d1c4ef53f8 | grep -i sandbox      "SandboxID": "be7330b99a274a03a7f58e9e991346dc6f048836a1682c7244a6068acbfb664c",      "SandboxKey": "/var/run/docker/netns/be7330b99a27",

SandboxID 即為 "client" 容器的網絡命名空間。

使用如下命令,我們就能夠進入到 "client" 容器的網絡命令空間:

nsenter --net=f3d1c4ef53f8 sh

下面,我們可以看到 iptables 的轉發規則和 IPVS 輸出:

sh-4.2# iptables -nvL -t mangleChain OUTPUT (policy ACCEPT 606 packets, 50867 bytes) pkts bytes target   prot opt in   out   source        destination  0   0 MARK    all -- *   *    0.0.0.0/0      10.0.0.7       MARK set 0x102  0   0 MARK    all -- *   *    0.0.0.0/0      10.0.0.9       MARK set 0x103sh-4.2# ipvsadmIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port      Forward Weight ActiveConn InActConnFWM 258 rr -> node2:0           Masq  1   0     0FWM 259 rr -> 10.0.0.10:0         Masq  1   0     0 -> 10.0.0.11:0         Masq  1   0     0

Service IP "10.0.0.9" 使用 iptables OUTPUT 鏈獲得標記 0x103 (十六進制 -> 十進制:259),然后 IPVS 使用此標記并將它負載均衡到 "10.0.0.10" 和 "10.0.0.11" 。

查看 vote 服務的 2 個容器的 IP 如下所示,即 VIP "10.0.0.9" 負載均衡到不同的容器實例:

[root@node2 netns]# docker inspect vote.1.u46ms31e8zjdxtwrxvaec8zub | grep IPv4            "IPv4Address": "10.0.0.10"[root@node1 ~]# docker inspect vote.2.tutj19i4iwu1xn7arsaq815cu | grep IPv4            "IPv4Address": "10.0.0.11"

進入 client 服務的容器,使用 curl 請求 vote 服務,輸出結果如下,即請求分發到不同的容器:

root@f3d1c4ef53f8:/# curl vote | grep -i "container id" % Total  % Received % Xferd Average Speed  Time  Time   Time Current                 Dload Upload  Total  Spent  Left Speed100 3162 100 3162  0   0 14409   0 --:--:-- --:--:-- --:--:-- 14438     Processed by container ID c2af209c4e90root@f3d1c4ef53f8:/# curl vote | grep -i "container id" % Total  % Received % Xferd Average Speed  Time  Time   Time Current                 Dload Upload  Total  Spent  Left Speed100 3162 100 3162  0   0  165k   0 --:--:-- --:--:-- --:--:-- 171k     Processed by container ID 43a789312e70

路由網格 (Routing mesh)

使用路由網格,服務暴露的端口會暴露在 Swarm 集群中的所有工作節點。Docker 是通過創建 "ingress" overlay 網絡來實現這一點的,所有節點默認使用內在的 sandbox 網絡命名空間成為 "ingress" overlay 網絡的一部分。

下圖描述了 Routing mesh 如何實現負載均衡的:

Docker,Swarm,負載均衡

首先,會將 Hostname 或 IP 映射到 Sandbox IP,Sandbox 中的 iptables 和 IPVS 負責將請求負載均衡到 2 個 vote 容器。Ingress sandbox 網絡命名空間駐留在 swarm 集群中的所有工作節點,它通過將主機映射的端口負載均衡到后端容器來協助路由網格功能。

使用如下命令創建 vote 服務,使用路由網格暴露端口到所有節點:

 

復制代碼 代碼如下:
docker service create --name vote --network overlay1 --replicas 2 -p 8080:80 registry.cn-hangzhou.aliyuncs.com/anoy/vote

 

下圖顯示了 Sandbox、容器和每個節點的網絡之間的映射關系:

Docker,Swarm,負載均衡

如圖所示,Sandbox 和 vote 容器是 "ingress" 網絡的一部分,它有助于路由網格。client 容器和 vote 容器是 "overlay1" 網絡的一部分,它有助于內部負載均衡。所有容器都是默認 "docker_gwbridge" 網絡的一部分。

遵循 iptables 中的 NAT 規則顯示,端口 8080 上的主機流量發送到 node1 里的 Sandbox:

[root@node1 ~]# iptables -nvL -t natChain DOCKER-INGRESS (2 references) pkts bytes target   prot opt in   out   source        destination  0   0 DNAT    tcp -- *   *    0.0.0.0/0      0.0.0.0/0      tcp dpt:8080 to:172.18.0.2:8080 315 18876 RETURN   all -- *   *    0.0.0.0/0      0.0.0.0/0

進入 node1 上的 Sandbox 網絡命名空間 (ingress_sbox),查看 iptables 的轉發規則和 IPVS 輸出:

[root@node1 netns]# nsenter --net=ingress_sbox shsh-4.2# iptables -nvL -t mangleChain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target   prot opt in   out   source        destination  0   0 MARK    tcp -- *   *    0.0.0.0/0      0.0.0.0/0      tcp dpt:8080 MARK set 0x105sh-4.2# ipvsadmIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port      Forward Weight ActiveConn InActConnFWM 261 rr -> 10.255.0.5:0         Masq  1   0     0 -> 10.255.0.6:0         Masq  1   0     0

端口 8080 標記為 0x105 (十六進制 -> 十進制:261),IPVS 使用此標記將它負載均衡到 "10.255.0.5" 和 "10.255.0.6" 。

查看 vote 服務的 2 個容器的 IP 如下所示,即主機端口 8080 的流量會負載均衡到不同的容器實例:

[root@node1 netns]# docker inspect 6173afd5fab8 | grep IPv4            "IPv4Address": "10.255.0.6"            "IPv4Address": "10.0.0.14"[root@node2 ~]# docker inspect b07e95c5c681 | grep IPv4            "IPv4Address": "10.255.0.5"            "IPv4Address": "10.0.0.13"

驗證負載均衡,在 node1 上通過 node2 的 IP 和 8080 端口請求 vote 服務:

[root@node1 netns]# curl node2:8080 | grep -i "container id" % Total  % Received % Xferd Average Speed  Time  Time   Time Current                 Dload Upload  Total  Spent  Left Speed100 3162 100 3162  0   0  199k   0 --:--:-- --:--:-- --:--:-- 192k     Processed by container ID 6173afd5fab8[root@node1 netns]# curl node2:8080 | grep -i "container id" % Total  % Received % Xferd Average Speed  Time  Time   Time Current                 Dload Upload  Total  Spent  Left Speed100 3162 100 3162  0   0  7551   0 --:--:-- --:--:-- --:--:-- 7546     Processed by container ID b07e95c5c681

在 node2 上通過 node1 的 IP 和 8080 端口請求 vote 服務:

[root@node2 ~]# curl node1:8080 | grep -i "container id" % Total  % Received % Xferd Average Speed  Time  Time   Time Current                 Dload Upload  Total  Spent  Left Speed100 3162 100 3162  0   0  7531   0 --:--:-- --:--:-- --:--:-- 7546     Processed by container ID 6173afd5fab8[root@node2 ~]# curl node1:8080 | grep -i "container id" % Total  % Received % Xferd Average Speed  Time  Time   Time Current                 Dload Upload  Total  Spent  Left Speed100 3162 100 3162  0   0  169k   0 --:--:-- --:--:-- --:--:-- 171k     Processed by container ID b07e95c5c681

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到服務器教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成年人视频网站欧美| 精品国偷自产在线视频| 国产999精品视频| 98精品在线视频| 久久久久久有精品国产| 亚洲欧美制服丝袜| 国产成人激情视频| 欧美精品手机在线| 一二美女精品欧洲| 欧美日韩精品在线| 亚洲www在线| 日韩有码视频在线| 亚洲精品欧美日韩| 91高清视频免费观看| 中文字幕一区二区精品| 国产精品成人av在线| 视频在线观看99| 日韩视频在线观看免费| 日本欧美精品在线| 欧美视频国产精品| 国产成人精品一区| 国产欧亚日韩视频| 国产亚洲欧洲在线| 久久视频在线视频| 精品久久久久久久中文字幕| 午夜精品视频网站| 久久久999国产精品| 欧美激情视频一区二区三区不卡| 久久理论片午夜琪琪电影网| 亚洲国产另类 国产精品国产免费| 国产精品一区二区三| www国产精品com| 欧美日韩国产精品专区| 国产主播欧美精品| 成年无码av片在线| 亚洲最新av在线网站| 国产美女91呻吟求| 亚洲xxxx在线| 国产欧美日韩91| 久久五月天色综合| 亚洲一区二区国产| 91免费观看网站| 欧美巨大黑人极品精男| 久久久久久97| 国产亚洲精品久久| 国产精品老女人视频| 日韩综合视频在线观看| 国产视频久久网| 97国产一区二区精品久久呦| 日韩电影中文 亚洲精品乱码| 国产视频观看一区| 黑人极品videos精品欧美裸| 日韩欧美极品在线观看| 国产欧美一区二区三区四区| 欧美福利视频在线| 中国人与牲禽动交精品| 久久精品欧美视频| 国产精品99导航| 欧美成人免费观看| 国产精品视频男人的天堂| 久久精品91久久香蕉加勒比| 亚洲国产欧美在线成人app| 九九精品在线视频| 在线成人激情视频| 国产成人中文字幕| 日韩一区二区三区在线播放| 日韩av中文字幕在线播放| 久久中文字幕在线视频| 亚洲乱码一区av黑人高潮| 亚洲激情中文字幕| 日韩影视在线观看| 一二美女精品欧洲| 亚洲a成v人在线观看| 亚洲片av在线| 日本sm极度另类视频| 欧美一级淫片videoshd| 97超级碰在线看视频免费在线看| 久久久免费高清电视剧观看| 欧美做爰性生交视频| 久久久噜久噜久久综合| 中文字幕自拍vr一区二区三区| 欧美久久精品一级黑人c片| 亚洲综合小说区| 久久人人爽人人爽爽久久| 欧美激情一区二区久久久| 成人激情在线播放| 日韩亚洲第一页| 性日韩欧美在线视频| 一区二区三区天堂av| 日日骚久久av| 欧美日韩一区二区在线| 97视频在线观看视频免费视频| 日韩av在线免费看| 91国产精品91| 日韩在线免费视频观看| 91亚洲精华国产精华| 亚洲福利在线观看| 欧美另类99xxxxx| 日韩av电影国产| 精品偷拍一区二区三区在线看| 久久久国产视频91| 欧美在线激情视频| 欧美三级欧美成人高清www| 亚洲精品综合精品自拍| 亚洲第一精品自拍| 久久精品国产亚洲一区二区| 国产精品福利在线| 日韩精品在线私人| 亚洲精品视频久久| 欧美激情第6页| 日韩在线激情视频| 国产精品网站入口| 亚洲a级在线观看| 国产脚交av在线一区二区| 久久噜噜噜精品国产亚洲综合| 亚洲成**性毛茸茸| 一区二区亚洲欧洲国产日韩| 欧美理论电影网| 日本精品性网站在线观看| 亚洲男人天堂网站| 亚洲欧美激情精品一区二区| 91九色国产在线| 一区二区三区四区精品| 日本高清视频一区| 亚洲免费视频在线观看| 国产欧美欧洲在线观看| 尤物九九久久国产精品的特点| 欧美在线性视频| 久久久噜噜噜久久| 亚洲男人天堂九九视频| 欧美日韩国产激情| 精品人伦一区二区三区蜜桃免费| 久久精品亚洲热| 国产成人91久久精品| 日韩精品视频在线免费观看| 欧美激情精品久久久久久免费印度| 成人信息集中地欧美| 精品国产1区2区| 黑人巨大精品欧美一区二区| 欧美第一淫aaasss性| 亚洲在线视频福利| 正在播放亚洲1区| 欧美午夜性色大片在线观看| 一区二区三区动漫| 成年人精品视频| 久久99国产精品自在自在app| 久久久亚洲国产| 久久久久久中文| 在线亚洲国产精品网| 国产剧情日韩欧美| 久久久久免费视频| 91精品久久久久久久久久久久久久| 国产精品国产三级国产aⅴ9色| 国产在线观看精品一区二区三区| 国产精自产拍久久久久久蜜| 亚洲天堂av综合网| 欧美高清视频一区二区| 久久人人爽人人爽人人片亚洲| 最近更新的2019中文字幕| 久久精品久久久久电影| 精品美女国产在线| 日韩av在线资源| 日本亚洲欧洲色| 日韩在线视频中文字幕|