好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > 詳解Docker Swarm服務發現和負載均衡原理

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

熱門標簽:百度地圖標注備注 威海人工智能電銷機器人系統 地圖標注員怎么去做 機器人電銷有什么用 上海電銷卡外呼系統廠家 貴州全自動外呼系統廠家 好看的地圖標注圖標下載 德州外呼系統排名 福州外呼系統中間件

本文將介紹基于 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

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

集群狀態

[root@node1 ~]# docker node ls
ID              HOSTNAME      STATUS       AVAILABILITY    MANAGER STATUS   ENGINE VERSION
rnr2i1y2of3n5vy2vzh2vkzq0 *  node1        Ready        Active       Leader       18.03.1-ce
qvik057dvphx5s06evmswahaf   node2        Ready        Active                 18.03.1-ce

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

docker network create --driver overlay overlay1

基于 DNS 的負載均衡

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

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.com

docker service create --endpoint-mode dnsrr --name vote --network overlay1 --replicas 2 registry.cn-hangzhou.aliyuncs.com/anoy/vote

查看服務信息:

[root@node1 ~]# docker service ls
ID         NAME        MODE        REPLICAS      IMAGE                         PORTS
2mrj3pqyioc3    client       replicated     1/1         registry.cn-hangzhou.aliyuncs.com/anoy/ubuntu:latest
826s79tsixuh    vote        replicated     2/2         registry.cn-hangzhou.aliyuncs.com/anoy/vote:latest

[root@node1 ~]# docker service ps client
ID         NAME        IMAGE                         NODE        DESIRED STATE    CURRENT STATE      ERROR        PORTS
f74i688vbh12    client.1      registry.cn-hangzhou.aliyuncs.com/anoy/ubuntu:latest  node2        Running       Running 2 minutes ago

[root@node1 ~]# docker service ps vote
ID         NAME        IMAGE                        NODE        DESIRED STATE    CURRENT STATE        ERROR        PORTS
7iiuzl2a63hy    vote.1       registry.cn-hangzhou.aliyuncs.com/anoy/vote:latest  node1        Running       Running 47 seconds ago
uyhxxqfdima7    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 ps
CONTAINER ID    IMAGE                         COMMAND         CREATED       STATUS       PORTS        NAMES
1eed67d37cbb    registry.cn-hangzhou.aliyuncs.com/anoy/vote:latest   "gunicorn app:app -b…"  About a minute ago  Up About a minute  80/tcp       vote.2.uyhxxqfdima7smos5pki84wul
436702b21a1c    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/bash

root@436702b21a1c:/# dig vote

;; ANSWER SECTION:
vote.      600 IN A  10.0.0.5
vote.      600 IN A  10.0.0.6

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

root@436702b21a1c:/# ping -c1 vote
PING 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 ms

root@436702b21a1c:/# ping -c1 vote
PING 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 Speed
100 3162 100 3162  0   0  7542   0 --:--:-- --:--:-- --:--:-- 7546
     Processed by container ID 9b42319d4f13

root@436702b21a1c:/# curl vote | grep -i "container id"
 % Total  % Received % Xferd Average Speed  Time  Time   Time Current
                 Dload Upload  Total  Spent  Left Speed
100 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 的負載均衡是如何工作的:

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.com

docker 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/bash

root@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]# ls
1-tetug0isdx 1-vyy22w04t6 be7330b99a27 d67fa9efb59e ingress_sbox

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

[root@node2 netns]# docker ps
CONTAINER ID    IMAGE                         COMMAND         CREATED       STATUS       PORTS        NAMES
43a789312e70    registry.cn-hangzhou.aliyuncs.com/anoy/vote:latest   "gunicorn app:app -b…"  3 minutes ago    Up 3 minutes    80/tcp       vote.1.u46ms31e8zjdxtwrxvaec8zub
f3d1c4ef53f8    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 mangle

Chain 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 0x103

sh-4.2# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
 -> RemoteAddress:Port      Forward Weight ActiveConn InActConn
FWM 258 rr
 -> node2:0           Masq  1   0     0
FWM 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 Speed
100 3162 100 3162  0   0 14409   0 --:--:-- --:--:-- --:--:-- 14438
     Processed by container ID c2af209c4e90

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

路由網格 (Routing mesh)

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

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

首先,會將 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、容器和每個節點的網絡之間的映射關系:

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

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

[root@node1 ~]# iptables -nvL -t nat

Chain 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 sh

sh-4.2# iptables -nvL -t mangle
Chain 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 0x105

sh-4.2# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
 -> RemoteAddress:Port      Forward Weight ActiveConn InActConn
FWM 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 Speed
100 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 Speed
100 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 Speed
100 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 Speed
100 3162 100 3162  0   0  169k   0 --:--:-- --:--:-- --:--:-- 171k
     Processed by container ID b07e95c5c681

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

標簽:南陽 撫州 邵陽 白城 泉州 南陽 葫蘆島 岳陽

巨人網絡通訊聲明:本文標題《詳解Docker Swarm服務發現和負載均衡原理》,本文關鍵詞  詳解,Docker,Swarm,服務,發現,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解Docker Swarm服務發現和負載均衡原理》相關的同類信息!
  • 本頁收集關于詳解Docker Swarm服務發現和負載均衡原理的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: avtt天堂网永久资源手机版| 欧美hdxxxx| 国产精品成人亚洲| 久久精品欧美一区二区三区不卡| 被拉到野外强要好爽| 日韩欧美在线视频观看| futa全肉H文| 大胸美女???www| 国产精品久久天天躁| 中年大妈公园里做皮肉生意| 校花被黑人巨大进入| 毛片在线不卡| 校花扒开尿口开始灌水| 国产成人久久久日韩美女网站直播 | 公共场合高潮(h)公交车| 久久综合狠狠综合久久激情| 丝袜放荡淫老师| 又黄又爽又刺激的视频| JUY507の遗影の前波多野结衣| 公主很忙(n)甜烟| 爽?躁多水?在线观看| 老司机三级斤一区二区三区凹凸 | 国产一级恐怖片| 一本色道老熟妇久久八八综合| 伦理电影午夜伧理片| 林心如一级毛片免费播放| jzjzjzjzjz高潮喷水| 国内见头最多的走秀| 自己降低龟灵敏度的方法| 黑人又大又粗又爽免费视频| 在线色综合| 美女裸体无遮挡露双奶头视频软件| 少妇无套内谢XXOO| 一级毛片特级毛片黄毛片| h文在线阅读| 甜美的咬痕动画| 鋼板租賃的詳情| 青草青青视频在线观看| 日女人逼视频| 丰满妓女BBwHD视频| 美女被免网站在线视频|