欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Docker Swarm服務(wù)發(fā)現(xiàn)和負(fù)載均衡原理

 更新時(shí)間:2018年05月04日 09:36:50   作者:Anoyi  
這篇文章主要介紹了詳解Docker Swarm服務(wù)發(fā)現(xiàn)和負(fù)載均衡原理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

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

使用的技術(shù)

Docker 使用了 Linux 內(nèi)核 iptables 和 IPVS 的功能來實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和負(fù)載均衡。

iptables 是 Linux 內(nèi)核中可用的包過濾技術(shù),它可用于根據(jù)數(shù)據(jù)包的內(nèi)容進(jìn)行分類、修改和轉(zhuǎn)發(fā)決策。

IPVS 是 Linux 內(nèi)核中可用的傳輸級(jí)負(fù)載均衡器。

準(zhǔn)備工作

swarm 集群: 【Manager】node1、【W(wǎng)orker】node2

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

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

如圖所示,我們將在 swarm 集群中部署 “client” 服務(wù) 和 “vote” 服務(wù),其中 “vote” 服務(wù)部署多個(gè)副本??蛻舳苏?qǐng)求 “vote” 服務(wù)時(shí),輸出結(jié)果中包含服務(wù)端的容器 ID,這樣就更方便演示網(wǎng)絡(luò)請(qǐng)求。

集群狀態(tài)

[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

使用如下命令,創(chuàng)建 overlay 網(wǎng)絡(luò):

docker network create --driver overlay overlay1

基于 DNS 的負(fù)載均衡

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

DNS server 內(nèi)嵌于 Docker 引擎。Docker DNS 解析服務(wù)名 “vote” 并返回容器 ID 地址列表(隨機(jī)排序)??蛻舳送ǔ?huì)挑第一個(gè) IP 訪問,因此負(fù)載均衡可能發(fā)生在服務(wù)器的不同實(shí)例之間。

使用如下命令創(chuàng)建 2 個(gè)基于 DNS 負(fù)載均衡的服務(wù) “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

查看服務(wù)信息:

[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" 運(yùn)行于 node2,在 node2 上進(jìn)入 client 容器,使用 dig 來解析服務(wù)名 "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" 服務(wù),如下所示,交替解析到 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,如下所示,請(qǐng)求也能解析到不同的容器

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 負(fù)載均衡存在如下問題:

  1. 某些應(yīng)用程序?qū)?DNS 主機(jī)名緩存到 IP 地址映射,這會(huì)導(dǎo)致應(yīng)用程序在映射更改時(shí)超時(shí)
  2. 具有非零 DNS ttl 值會(huì)導(dǎo)致 DNS 條目反映最新的詳細(xì)信息時(shí)發(fā)生延遲

基于 VIP 的負(fù)載均衡

基于 VIP 的負(fù)載均衡克服了基于 DNS 負(fù)載均衡的一些問題。在這種方法中,每個(gè)服務(wù)都有一個(gè) IP 地址,并且該 IP 地址映射到與該服務(wù)關(guān)聯(lián)的多個(gè)容器的 IP 地址。在這種情況下,與服務(wù)關(guān)聯(lián)的服務(wù) IP 不會(huì)改變,即使與該服務(wù)關(guān)聯(lián)的容器死亡并重新啟動(dòng)。

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

DNS server 會(huì)將服務(wù)名 "vote" 解析到 VIP,使用 iptables 和 ipvs,VIP 實(shí)現(xiàn) 2 個(gè)服務(wù)端 "vote" 容器的負(fù)載均衡。

使用如下命令創(chuàng)建 2 個(gè) VIP 模式的服務(wù) “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 個(gè)服務(wù)和它們的服務(wù) 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" 的容器中使用如下命令,可以看到服務(wù)名 "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 內(nèi)核的 iptables 和 IPVS 負(fù)載均衡到 2 個(gè)容器。iptables 實(shí)現(xiàn)防火墻規(guī)則,IPVS 實(shí)現(xiàn)負(fù)載均衡。為了證明這一點(diǎn),我們需要使用 nsenter 進(jìn)入容器的網(wǎng)絡(luò)空間 ( namespace )。為此,我們需要找到網(wǎng)絡(luò)的命名空間。

如下是 node2 上的網(wǎng)絡(luò)命名空間:

[root@node2 ~]# cd /run/docker/netns/

[root@node2 netns]# ls
1-tetug0isdx 1-vyy22w04t6 be7330b99a27 d67fa9efb59e ingress_sbox

前 2 個(gè)命名空間是用于 overlay 網(wǎng)絡(luò),后面的用于容器。下面的命令用于找到 "client" 容器的網(wǎng)絡(luò)命名空間:

[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" 容器的網(wǎng)絡(luò)命名空間。

使用如下命令,我們就能夠進(jìn)入到 "client" 容器的網(wǎng)絡(luò)命令空間:

nsenter --net=f3d1c4ef53f8 sh

下面,我們可以看到 iptables 的轉(zhuǎn)發(fā)規(guī)則和 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 鏈獲得標(biāo)記 0x103 (十六進(jìn)制 -> 十進(jìn)制:259),然后 IPVS 使用此標(biāo)記并將它負(fù)載均衡到 "10.0.0.10" 和 "10.0.0.11" 。

查看 vote 服務(wù)的 2 個(gè)容器的 IP 如下所示,即 VIP "10.0.0.9" 負(fù)載均衡到不同的容器實(shí)例:

[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"

進(jìn)入 client 服務(wù)的容器,使用 curl 請(qǐng)求 vote 服務(wù),輸出結(jié)果如下,即請(qǐng)求分發(fā)到不同的容器:

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

路由網(wǎng)格 (Routing mesh)

使用路由網(wǎng)格,服務(wù)暴露的端口會(huì)暴露在 Swarm 集群中的所有工作節(jié)點(diǎn)。Docker 是通過創(chuàng)建 "ingress" overlay 網(wǎng)絡(luò)來實(shí)現(xiàn)這一點(diǎn)的,所有節(jié)點(diǎn)默認(rèn)使用內(nèi)在的 sandbox 網(wǎng)絡(luò)命名空間成為 "ingress" overlay 網(wǎng)絡(luò)的一部分。

下圖描述了 Routing mesh 如何實(shí)現(xiàn)負(fù)載均衡的:

首先,會(huì)將 Hostname 或 IP 映射到 Sandbox IP,Sandbox 中的 iptables 和 IPVS 負(fù)責(zé)將請(qǐng)求負(fù)載均衡到 2 個(gè) vote 容器。Ingress sandbox 網(wǎng)絡(luò)命名空間駐留在 swarm 集群中的所有工作節(jié)點(diǎn),它通過將主機(jī)映射的端口負(fù)載均衡到后端容器來協(xié)助路由網(wǎng)格功能。

使用如下命令創(chuàng)建 vote 服務(wù),使用路由網(wǎng)格暴露端口到所有節(jié)點(diǎn):

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

下圖顯示了 Sandbox、容器和每個(gè)節(jié)點(diǎn)的網(wǎng)絡(luò)之間的映射關(guān)系:

如圖所示,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ī)則顯示,端口 8080 上的主機(jī)流量發(fā)送到 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

進(jìn)入 node1 上的 Sandbox 網(wǎng)絡(luò)命名空間 (ingress_sbox),查看 iptables 的轉(zhuǎn)發(fā)規(guī)則和 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 標(biāo)記為 0x105 (十六進(jìn)制 -> 十進(jìn)制:261),IPVS 使用此標(biāo)記將它負(fù)載均衡到 "10.255.0.5" 和 "10.255.0.6" 。

查看 vote 服務(wù)的 2 個(gè)容器的 IP 如下所示,即主機(jī)端口 8080 的流量會(huì)負(fù)載均衡到不同的容器實(shí)例:

[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"

驗(yàn)證負(fù)載均衡,在 node1 上通過 node2 的 IP 和 8080 端口請(qǐng)求 vote 服務(wù):

[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 端口請(qǐng)求 vote 服務(wù):

[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

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Docker基礎(chǔ)知識(shí)之Linux namespace圖文詳解

    Docker基礎(chǔ)知識(shí)之Linux namespace圖文詳解

    這篇文章主要給大家介紹了關(guān)于Docker基礎(chǔ)知識(shí)之Linux namespace的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Docker 啟動(dòng)Redis 并設(shè)置密碼的操作

    Docker 啟動(dòng)Redis 并設(shè)置密碼的操作

    這篇文章主要介紹了Docker 啟動(dòng)Redis 并設(shè)置密碼的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Docker 下載鏡像慢的問題解決方法

    Docker 下載鏡像慢的問題解決方法

    這篇文章主要介紹了Docker 解決下載鏡像慢的問題的相關(guān)資料,這里提供了具體實(shí)現(xiàn)方法,需要的朋友可以參考下
    2016-11-11
  • 清理或刪除docker無用鏡像的操作方法

    清理或刪除docker無用鏡像的操作方法

    這篇文章主要介紹了清理或刪除docker無用鏡像的操作方法,清除docker無用鏡像首先查看docker占用的資源,只刪除那些未被使用的資源,文中給大家補(bǔ)充介紹了docker?批量刪除無用的容器或鏡像的方法,感興趣的朋友一起看看吧
    2023-01-01
  • Docker搭建持續(xù)集成平臺(tái)Jenkins的最簡(jiǎn)教程分享

    Docker搭建持續(xù)集成平臺(tái)Jenkins的最簡(jiǎn)教程分享

    Jenkins 是一個(gè)廣泛使用的開源持續(xù)集成工具,它能夠自動(dòng)化構(gòu)建、測(cè)試和部署軟件項(xiàng)目,本文我們將使用 Docker 搭建一個(gè)基于 Jenkins 的持續(xù)集成平臺(tái),感興趣的可以了解下
    2024-03-03
  • docker批量刪除臨時(shí)鏡像

    docker批量刪除臨時(shí)鏡像

    在開發(fā)的時(shí)候,需要經(jīng)常發(fā)布開發(fā)包,在使用docker build構(gòu)建鏡像的時(shí)候,同一個(gè)版本經(jīng)常會(huì)使用相同tag,頻繁打包一段時(shí)間后,本地會(huì)出現(xiàn)很多Tag=<none>的臨時(shí)鏡像,下面給大家分享相關(guān)命令docker批量刪除Tag=<none>的臨時(shí)鏡像,感興趣的朋友一起看看吧
    2024-07-07
  • 教你如何通過?SSH?連接到?Docker?容器

    教你如何通過?SSH?連接到?Docker?容器

    如何通過?SSH?連接到正在運(yùn)行的容器,以及為什么在這樣做之前應(yīng)該三思而后行,對(duì)如何通過SSH連接到Docker容器相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧
    2022-01-01
  • Docker打包前后端項(xiàng)目的實(shí)現(xiàn)示例

    Docker打包前后端項(xiàng)目的實(shí)現(xiàn)示例

    目前我們大多數(shù)服務(wù)應(yīng)該會(huì)使用Docker來進(jìn)行部署,本文主要介紹了Docker打包前后端項(xiàng)目的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04
  • Docker Compose在不同環(huán)境的多種安裝方式

    Docker Compose在不同環(huán)境的多種安裝方式

    這篇文章主要介紹了Docker Compose在不同環(huán)境的多種安裝方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 鏡像倉庫?Harbor搭建和使用教程

    鏡像倉庫?Harbor搭建和使用教程

    本文給大家介紹鏡像倉庫?Harbor搭建和使用教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2022-01-01

最新評(píng)論