国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 服務器 > 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武林網。


注:相關教程知識閱讀請移步到服務器教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 玉林市| 许昌市| 浮梁县| 临夏县| 利辛县| 马关县| 龙泉市| 平谷区| 峡江县| 永福县| 册亨县| 泽库县| 龙胜| 奎屯市| 容城县| 久治县| 义马市| 黑山县| 英超| 麦盖提县| 新建县| 博湖县| 东阿县| 托克托县| 报价| 龙胜| 馆陶县| 崇仁县| 西峡县| 广西| 镇平县| 玉龙| 台东县| 施甸县| 蒲江县| 达尔| 诏安县| 汉源县| 西林县| 墨竹工卡县| 读书|