溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

發(fā)布時間:2020-06-26 15:57:57 來源:網(wǎng)絡(luò) 閱讀:26836 作者:linuxjavachen 欄目:建站服務(wù)器

容器和宿主機(jī)、容器之間以及夸主機(jī)容器如何通訊呢?這就需要使用到Docker網(wǎng)絡(luò)。

在前面的介紹中我們在Dockerfile中通過EXPOSE參數(shù)來設(shè)置容器暴露的端口,讓在docker run中使用-p來設(shè)置宿主機(jī)端口到容器端口的映射,這只是最簡單的宿主機(jī)和容器通訊,同樣使用宿主機(jī)IP:PORT方式可以讓其他容器和該容器通訊,但是這樣有個問題,首先應(yīng)用程序需要對IP進(jìn)行硬編碼,其次容器每次重啟IP都會變化,顯然在生產(chǎn)環(huán)節(jié)中應(yīng)該做到的盡可能的解耦,下面我們先看一下Docker網(wǎng)絡(luò)的構(gòu)成。

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

查看網(wǎng)絡(luò)設(shè)置

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊啟動docker服務(wù)就會產(chǎn)生一個docker0的虛擬網(wǎng)橋(多端口虛擬交換機(jī))設(shè)備。veth*這個是啟動一個容器就會產(chǎn)生一個這樣的設(shè)備該設(shè)備與容器內(nèi)的eth0虛擬網(wǎng)卡對應(yīng),這個veth*你可以理解為某個網(wǎng)橋上的接口,所以它只有MAC地址而沒有IP地址,畢竟二層交換機(jī)網(wǎng)口是沒有IP地址的,這個接口的另外一端就插在容器的網(wǎng)卡上,這個網(wǎng)卡有IP也有MAC(也可以理解為一根連在docker0上的網(wǎng)線,畢竟容器內(nèi)的網(wǎng)卡和容器外的是一對,460就是容器外ID,459就是容器內(nèi)網(wǎng)卡的ID)網(wǎng)橋在內(nèi)核層連通了其他物理或者虛擬網(wǎng)卡。

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

下面看一下docker run命令中和網(wǎng)絡(luò)有關(guān)的參數(shù):

--dns=IP  #指定DNS服務(wù)器
--dns-search=DOMAIN  #指定搜索域
-h HOSTNAME  #設(shè)置容器的主機(jī)名稱
--link=容器名:別名  #啟動該容器時與指定的容器進(jìn)行鏈接,這樣容器間可以通過名稱來訪問
-p  #映射主機(jī)端口
--net=bridge  #默認(rèn)配置,為容器創(chuàng)建獨(dú)立的網(wǎng)絡(luò)命名空間,分配網(wǎng)卡、IP地址并通過veth接口
              #將容器掛到docker0虛擬網(wǎng)橋上。
--net=none    #為容器創(chuàng)建獨(dú)立的網(wǎng)絡(luò)命名空間,但不進(jìn)行網(wǎng)絡(luò)設(shè)置,容器沒有網(wǎng)卡和IP
--net=host    #容器和宿主機(jī)共享網(wǎng)絡(luò)設(shè)置,在容器中看到的網(wǎng)絡(luò)信息都與宿主機(jī)一樣,也就是
              #不為容器創(chuàng)建獨(dú)立的網(wǎng)絡(luò)命名空間。
--net=user_defined_network  #用戶自行使用network創(chuàng)建一個網(wǎng)絡(luò),同一個網(wǎng)絡(luò)內(nèi)的容器彼
                            #此可見。類似于vmware中你可以創(chuàng)建多個網(wǎng)絡(luò)通道比如vmnet1
                            #、vmnet2等。
--net=container:容器名稱或者ID  #表示該容器共享指定容器的網(wǎng)絡(luò)命名空間。

容器的DNS配置:

容器中的主機(jī)名和DNS設(shè)置是通過/etc/resolv.conf、/etc/hostname和/etc/hosts三個文件來維護(hù)的,如下圖:

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊/etc/resolv.conf文件在創(chuàng)建容器時,默認(rèn)和宿主機(jī)上的一樣;/etc/hosts文件默認(rèn)只有一條容器自己的記錄;/etc/hostname記錄了容器自己的主機(jī)名。你可以直接修改容器的這三個文件,但是容器一旦重啟就失效了。

所以在運(yùn)行docker run的時候使用--dns=IP來在容器中的/etc/rsovle.conf文件之后添加額外的DNS服務(wù)器地址;

--hostname=HOSTNAME來指定主機(jī)名稱。

容器的訪問控制:

外部要想訪問Docker容器或者Docker容器訪問外部網(wǎng)絡(luò)那么,下面的參數(shù)需要為1,表示啟用IPV4的轉(zhuǎn)發(fā)

sysctl net.ipv4.ip_forward

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

另外還需要注意一下幾點(diǎn):

  • 另外默認(rèn)情況下容器可以訪問外部網(wǎng)絡(luò),但是外部網(wǎng)絡(luò)無法訪問容器

  • 容器是通過SNAT方式出去并訪問外部網(wǎng)絡(luò)的

  • 外部訪問容器還取決于宿主機(jī)和容器內(nèi)的防火墻,如果允許訪問在在docker run中加入-P或者-p參數(shù)指定宿主機(jī)到容器的端口映射


(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

流量進(jìn)入到宿主機(jī)網(wǎng)卡,先進(jìn)入到PREROUTING鏈中,然后將流量引入到DOCKER鏈,通過DNAT把32768流量修改地址為docker容器地址和端口。


libnetwork

這是Docker種的一個插件化網(wǎng)絡(luò)功能。這個模型結(jié)構(gòu)很簡潔。它包括三個基于元素:

  1. 沙盒:代表一個容器,也可以理解為網(wǎng)絡(luò)命名空間

  2. 接入點(diǎn):代表可以掛載容器的接口,會分配IP地址

  3. 網(wǎng)絡(luò):可以連通多個接入點(diǎn)的子網(wǎng)

首先驅(qū)動注冊自己的到網(wǎng)絡(luò)控制器,網(wǎng)絡(luò)控制器創(chuàng)建網(wǎng)絡(luò),然后在在網(wǎng)絡(luò)上創(chuàng)建接入點(diǎn),最后把容器連接到接入點(diǎn)上。刪除過程則是反向操作,先把容器從接口上卸載,然后刪除接入點(diǎn),最后刪除網(wǎng)絡(luò)。目前支持的驅(qū)動類型有4種:

類型說明
Null不提供網(wǎng)絡(luò)服務(wù),容器如果接入到這兒類型的網(wǎng)絡(luò)接入點(diǎn)上,則沒有網(wǎng)絡(luò)連接
Briage網(wǎng)橋,根Docker0一樣,使用傳統(tǒng)的Linux網(wǎng)橋和Iptables來實(shí)現(xiàn),通過NAT容器可以和宿主機(jī)以及宿主機(jī)以外進(jìn)行通訊。
Overlay使用vxlan隧道實(shí)現(xiàn)跨主機(jī)通信,這個和軟件定義網(wǎng)絡(luò)中是一個概念,軟件定義網(wǎng)絡(luò)中也有多種實(shí)現(xiàn)方式其中就有vxlan,另外一個比較常用的是GRE,其實(shí)這些都是建立隧道。GRE是建立二層點(diǎn)到點(diǎn)隧道,vxlan可以看做是vlan的升級,因?yàn)閭鹘y(tǒng)vland通過打標(biāo)簽的方式來區(qū)分不同網(wǎng)絡(luò),但是標(biāo)簽有限最多4096個VLAN網(wǎng)絡(luò);而vxlan的標(biāo)簽是24位所以網(wǎng)絡(luò)個數(shù)大大提升,另外它是L2 over UDP的形式,這樣可以跨越三層。這種SDN在公有云平臺使用較多因?yàn)橐?guī)模大,多租戶。
host

主機(jī)模式,容器使用宿主機(jī)的網(wǎng)絡(luò)命名空間,也就是使用宿主機(jī)網(wǎng)卡IP對外通信(顧名思義它們兩個是同一IP)。但這種方式?jīng)]有獨(dú)立的網(wǎng)絡(luò)協(xié)議棧,容器會和宿主機(jī)競爭使用網(wǎng)絡(luò)協(xié)議棧,而且宿主機(jī)上的很多服務(wù)使用的端口在容器中就不能使用。

Remote擴(kuò)展類型,預(yù)留給其他方案

通過上面的描述可以看到容器的這些網(wǎng)絡(luò)類型和虛擬化里面的及其相似。下面說一下常用命令

列出網(wǎng)絡(luò):

docker network ls [options]
# -f driver=NAME   列出特定驅(qū)動類型的網(wǎng)絡(luò)

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

創(chuàng)建網(wǎng)絡(luò):

docker network create [options] NETWORK-NAME
# -d 驅(qū)動類型
# --gateway IP 網(wǎng)關(guān)地址
# --internal 禁止外部對該網(wǎng)絡(luò)訪問
# --ip-range IP 分配IP地址的范圍
# --subnet VALUE 設(shè)置子網(wǎng)掩碼
# --ipam-driver STRING IP地址管理的插件類型
# --ipam-opt VALUE IP地址管理插件的選項(xiàng)
# --ipv6 是否支持IPV6
# --lable VALUE 為網(wǎng)絡(luò)添加標(biāo)簽信息
# --o VALUE 網(wǎng)絡(luò)驅(qū)動選項(xiàng)

看下面的例子

docker network create -d bridge --gateway 172.16.200.254 --subnet 172.16.200.0/24 vmnet01

我這里建立一個172.16.200.0的網(wǎng)絡(luò),并指定了默認(rèn)網(wǎng)關(guān)的IP,使用網(wǎng)橋模式。

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊注意:如果不使用-d指定網(wǎng)絡(luò)驅(qū)動類型,則默認(rèn)為網(wǎng)橋。

查看內(nèi)部細(xì)節(jié)

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

網(wǎng)橋驅(qū)動的一些選項(xiàng):

選項(xiàng)說明
com.docker.network.bridge.name網(wǎng)橋名稱,就是在ifconfig中看到的,建議加上這個選項(xiàng),否則網(wǎng)卡多了不容易識別。默認(rèn)的docker0就是默認(rèn)網(wǎng)絡(luò)bridge的別名,針對docker0配置IP就相當(dāng)于給虛擬交換機(jī)配置管理IP,同時這個IP也是容器網(wǎng)關(guān)地址。
com.docker.network.bridge.enable_ip_masquerade是否啟用ip_masquerade,這是地址偽裝,類似SNAT,但是有點(diǎn)區(qū)別,它用將發(fā)送數(shù)據(jù)的網(wǎng)卡IP替換源IP,容器每次啟動IP地址都發(fā)生變化,那么如何確保我們用相同的地址或者域名訪問這個容器呢?總不可能每次啟動容器都修改iptables。使用ip_masquerade這樣每次容器的IP發(fā)生變化,會自動獲取IP并修改iptables。
com.docker.network.bridge.enable_icc該網(wǎng)橋是否允許容器間通信。默認(rèn)網(wǎng)橋docker0的icc是true,所以也就是默認(rèn)允許容器間通信。容器創(chuàng)建或者連接到網(wǎng)橋后就會使用網(wǎng)橋上配置的這些參數(shù),如果該網(wǎng)橋的icc是false則,容器間無法通信,當(dāng)仍然可以通過容器鏈接的方式設(shè)置容器間通信。
com.docker.network.bridge.host_binding_ipv4綁定容器端口時的默認(rèn)IP是什么,默認(rèn)網(wǎng)橋docker0的配置是0.0.0.0也就是接受主機(jī)來自所有網(wǎng)絡(luò)接口上的流量。
com.docker.network.driver.mtu設(shè)置容器的MTU
com.docker.network.bridge.default_bridge是否為默認(rèn)網(wǎng)橋,容器創(chuàng)建默認(rèn)會使用的網(wǎng)橋,除非使用--net參數(shù)來設(shè)置連接到哪個網(wǎng)橋。
docker network -d -o "com.docker.network.bridge.name"="XX"

注意:創(chuàng)建網(wǎng)橋網(wǎng)絡(luò)如果不知道子網(wǎng)則會按照默認(rèn)的172.16.0.0/16往后排17、18....。同時會為這個網(wǎng)橋設(shè)置一個IP通常是這個子網(wǎng)的第一個IP,那么ifconfig中看到的名字和創(chuàng)建網(wǎng)絡(luò)是的名字不同,名字是隨機(jī)的,所以這就是為什么需要使用上面的-o參數(shù)中的com.docker.network.bridge.name來指定一個名字。其實(shí)通過docker命令創(chuàng)建網(wǎng)絡(luò)后臺其實(shí)是創(chuàng)建的Linux網(wǎng)橋。


將容器連接到網(wǎng)絡(luò):

該命令是把正在運(yùn)行的容器進(jìn)行切換網(wǎng)絡(luò),如果是創(chuàng)建容器的話,需要在docker run命令中使用--net參數(shù)來指定網(wǎng)絡(luò),如果不指定,則使用默認(rèn)網(wǎng)橋。

docker network connect [options] NETWORK-NAME CONTAINER
# --ip IP  為容器手動分配一個地址,如果不指定則自動分配
# --alias VALUE  為容器添加一個別名
# --link VALUE  添加鏈接到另一個容器
# --link-local-ip VALUE 為容器添加一個鏈接地址

看下面的例子,我們就把一個正在運(yùn)行的容器連接到我們上面創(chuàng)建的網(wǎng)絡(luò)上。

docker network connect vmnet01 jspSrv01

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

連接到其他網(wǎng)絡(luò)之后并不影響外網(wǎng)訪問。

從網(wǎng)絡(luò)中卸載容器:

docker network disconnect [options] NETWORK-NAME CONTAINER
# -f 強(qiáng)制把容器從網(wǎng)絡(luò)接口上卸載

看下面的例子,我們把剛才的容器從vmnet01上卸載

docker network disconnect -f vmnet01 jspSrv01

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

卸載后你發(fā)現(xiàn)還有網(wǎng)絡(luò)信息,其實(shí)它是又回到默認(rèn)網(wǎng)橋上了

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

刪除一個網(wǎng)絡(luò):

當(dāng)網(wǎng)絡(luò)不存在接入點(diǎn)時,刪除成功。

docker network rm NETWORK-NAME

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

查看網(wǎng)絡(luò)內(nèi)部:

docker network inspect [options] NETWORK-NAME
# -f STRING 對指定字符進(jìn)行格式化輸出


跨主機(jī)網(wǎng)絡(luò)通信:

跨主機(jī)通信的方式有三種:

  1. 容器使用host模式,直接使用host主機(jī)的IP,但是這樣端口容易出現(xiàn)沖突。使用場景有限。

  2. 端口映射,也就是我們之前一直使用的,通過網(wǎng)橋模式的網(wǎng)絡(luò),通過DNAT來實(shí)現(xiàn)外部訪問,但缺少靈活度。

  3. 直接路由,你可以使用默認(rèn)的Docker0,也可以新建一個網(wǎng)橋。在Docker主機(jī)上添加一條靜態(tài)路由實(shí)現(xiàn)。這個方案的問題是雖然跨了主機(jī),但是不同主機(jī)上的容器必須連接到相同網(wǎng)橋這就意味著IP段一樣,所以這就有很大局限性。

  4. 使用SDN方式,比如Flanneldocker1.9以后原生支持的Overlay網(wǎng)絡(luò)或者Open vSwitch

下面我們就基于docker自帶的overlay來實(shí)現(xiàn),需要注意使用overlay網(wǎng)絡(luò)有2中模式一個是swarm模式,一個是非swarm模式,在非swarm模式下使用則需要借助服務(wù)發(fā)現(xiàn)第三方組件。

docker實(shí)現(xiàn)跨主機(jī)通信需要的網(wǎng)絡(luò)驅(qū)動類型為overlay,但是同時還需要一個鍵值型的服務(wù)發(fā)現(xiàn)和配置共享軟件,比如Zookeeper、Doozerd、Etcd、Consul等。Zookeeper、Doozerd、Etcd在架構(gòu)上很類似,只提供原始的鍵值存儲,要求程序開發(fā)人員自己提供服務(wù)發(fā)現(xiàn)功能,而Consul則內(nèi)置了服務(wù)發(fā)現(xiàn),只要用戶注冊服務(wù)并通過DNS或HTTP接口執(zhí)行服務(wù)發(fā)現(xiàn)即可,同時它還具有健康檢查功能。我們這里使用Consul來作為服務(wù)發(fā)現(xiàn)工具。先說一下環(huán)境:

計(jì)算機(jī)名稱IP功能
dockerothsrv

eth0:192.168.124.139

eth2:172.16.100.10

Docker私有倉庫、Consul服務(wù)
Docker01

eth0:192.168.124.138

eth2:172.16.100.20

Docker容器服務(wù)器
Docker02

eth0:192.168.124.141

eth2:172.16.100.30

Docker容器服務(wù)器

建立一個Consul服務(wù):

這個你可以直接在系統(tǒng)中搭建,也可以運(yùn)行一個容器來完成,我們這里通過運(yùn)行容器來實(shí)現(xiàn)因?yàn)楫吘故侵v跨主機(jī)通訊,我們在dockerothsrv服務(wù)器上安裝

docker run -d -p 8500:8500 -h consul progrium/consul -server -bootstrap

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

配置docker主機(jī):

這里就需要修改dockerd的配置文件,兩臺Docker服務(wù)器都增加,增加一些內(nèi)容,如下圖:

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

參數(shù)說明
cluster-store指向鍵值存儲的地址,在consul中注冊,它得存儲形式就是鍵值。
cluster-advertise
這是一個主機(jī)網(wǎng)絡(luò)接口或者IP地址加端口的組合,也就是本主機(jī)中dockerd實(shí)例在consul集群中的地址,遠(yuǎn)程dockerd服務(wù)連接本dockerd服務(wù)時所使用的值,也是Docker01和Docker02服務(wù)器互通的端口。它可以使用IP:PORT形式,也可以是INTERFACE:PORT形式。這個端口是你的dockerd服務(wù)以daemon形式運(yùn)行時指定的端口。入上圖tcp://0.0.0.0后面的5555。有些文檔中你會看到2376或者2375這樣的端口,這是因?yàn)镈ocker官方文檔中寫的是這個,因?yàn)閐ockerd默認(rèn)是本地socket運(yùn)行不接受網(wǎng)絡(luò)遠(yuǎn)程連接,所以如果需要則需要指定-H tcp選項(xiàng)中的IP:PORT,2375是不加密端口,2376是加密端口。

重啟dockerd服務(wù)

systemctl restart docker

查看一下

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊


建立overlay驅(qū)動類型網(wǎng)絡(luò):

docker network create -d overlay oNet

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

你只需要在一臺主機(jī)上建立,然后在另外一臺主機(jī)上就可以看到。如下圖:

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

說明:docker_gwbridge網(wǎng)絡(luò)這是一個本地網(wǎng)橋,它會在2中情況下自動建立,一個是初始化或者加入一個swarm集群時;另外是

測試:

新建2個容器使用自動的oNet網(wǎng)絡(luò)

Docker01

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

Docker02

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

查看一下網(wǎng)絡(luò)詳情

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊兩個容器相互Ping一下看看

#關(guān)閉2臺宿主機(jī)上的防火墻,否則通不了
systemctl stop firewalld

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊


跨主機(jī)通信原理:

因?yàn)楹竺嫖覀円榭淳W(wǎng)絡(luò)命名空間,而docker的網(wǎng)絡(luò)命名空間不是建立在/var/run/netns下,所以我們把docker的網(wǎng)絡(luò)命名空間鏈接到那里,這樣就可以通過ip命令進(jìn)行查看

ln -s /var/run/docker/netns/ /var/run/netns
#通過IP netns查看網(wǎng)絡(luò)命名空間

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

通過命令查看容器內(nèi)的網(wǎng)卡和宿主機(jī)上的哪個網(wǎng)卡是一對兒

ip addr
docker exec aaa ethtool -S eth0/1

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

發(fā)現(xiàn)容器內(nèi)的eth0也就是10.0.0.0網(wǎng)段的這個網(wǎng)卡沒有關(guān)聯(lián)到宿主機(jī)上的任何虛擬網(wǎng)卡,那它去哪里了?反而容器中eth2關(guān)聯(lián)到496,而496走的是docker_gwbridge網(wǎng)橋,可這個網(wǎng)橋是172.18.0.0/16網(wǎng)段,那到底是如何和10.0.0.0網(wǎng)段通訊呢?我們查看一下命名空間?

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

至于是哪個命名空間你只能逐一查看,4-cd這個命名空間中是10.0.0.0網(wǎng)段,容器中的eth0關(guān)聯(lián)到這個命名空間中的494上,而這個494則連接到了br0網(wǎng)橋上。其中vxlan1是VXLAN隧道端點(diǎn),它是VXLAN網(wǎng)絡(luò)的設(shè)備邊緣,用于VXLAN報(bào)文非封包和解包,包括ARP請求報(bào)文和正常的VXLAN數(shù)據(jù)報(bào)文,封裝好以后報(bào)文通過隧道向另一端的VTEP也就是VXLAN隧道端點(diǎn)發(fā)送,另一端的VTEP收到后解開報(bào)文。

通過下圖可以看到這個命名空間的路由。

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

可以通過下面的命令查看vxlan1的VLANID是多少。需要知道每建立一個網(wǎng)絡(luò)都有一個獨(dú)立的網(wǎng)絡(luò)命名空間。

ip netns exec 4-cd7565b196 ip -d link show vxlan1

兩臺主機(jī)上的vxlanX中的X不一樣,但是同一個overlay網(wǎng)絡(luò)中的vxlan的VLANID是一樣的??匆幌路纸鈭D:

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

通信過程是這樣:

  • 宿主機(jī)A的容器01 ping 10.0.0.4 通過該容器的eth0發(fā)送出去,并通過路由表得知發(fā)往br0,br0相當(dāng)于虛擬交換機(jī),如果目標(biāo)主機(jī)在同一宿主機(jī),則直接通過br0通信,如果不在則通過vxlan

  • br0收到請求會把請求交給vxlan1,這里你PING一下,然后通過下面的命令可以看出來

  • ip netns exec 網(wǎng)絡(luò)命名空間 ip neigh
  • vxlan中保存有MAC地址表(docker守護(hù)進(jìn)程通過gossip協(xié)議在concul數(shù)據(jù)庫中學(xué)來的),并通過宿主機(jī)A的eth2發(fā)送出去

  • 報(bào)文到達(dá)宿主機(jī)B,拆包發(fā)現(xiàn)是vxlan報(bào)文,獲取IP,則交給它上面的vxlan設(shè)備(同一ID的設(shè)備)

  • 宿主機(jī)B上vxlan拆包,交給br0,然后br0根據(jù)MAC表完成最后的投遞。

overlay的不足:

  • 由于overlay網(wǎng)絡(luò)和宿主機(jī)默認(rèn)網(wǎng)絡(luò)不在同一網(wǎng)絡(luò)下,所以為了解決和宿主機(jī)通訊問題,docker為宿主機(jī)和容器額外添加一個網(wǎng)卡,為宿主機(jī)添加的就是docker_gwbridge為容器添加的就是eth2,這兩個網(wǎng)卡是一個IP段。但這樣會造成使用上的不方便,容器間使用一套IP,外網(wǎng)訪問容器使用另外一套IP

  • 容器對外提供仍然需要通過端口綁定來實(shí)現(xiàn),外界無法通過IP直接訪問容器

  • overlay必須依賴docker進(jìn)程和鍵值數(shù)據(jù)庫來通信。

  • docker原生的overlay性能損耗比較大,生產(chǎn)中不建議使用


無論你采取什么方案,都需要面臨一些問題:

  1. 跨主機(jī)通信(不同主機(jī)上的容器要可以相互通信而且還可以在整個IDC環(huán)境內(nèi)被訪問到)

  2. 容器漂移

  3. 跨主機(jī)容器IP分配,要避免IP沖突


網(wǎng)絡(luò)性能對比:

(七)Docker網(wǎng)絡(luò)和 overlay跨主機(jī)通訊

由此看出Bridge的性能損耗在10%左右,docker原生overlay性能損耗最大。思科的Calico overlay性能幾乎接近Bridge性能。


擴(kuò)展只知識:

為什么需要服務(wù)發(fā)現(xiàn)?

寫一個程序調(diào)用某個服務(wù),如果這個服務(wù)在其他服務(wù)器上按照傳統(tǒng)方法的話,我們要先得到那個服務(wù)器的IP以及那個服務(wù)所使用的端口,無論哪個服務(wù)所在服務(wù)器是物理機(jī)還是虛擬機(jī)都一樣它們的IP地址相對靜態(tài),我們只需要把這個信息寫在代碼中或者代碼程序所依賴的配置文件中即可。但現(xiàn)在的情況不一樣了,尤其是云計(jì)算的微服務(wù)架構(gòu)比如容器技術(shù),服務(wù)運(yùn)行在容器中,無論這個容器是在物理機(jī)還是在虛擬機(jī)總之這個獲取這個容器的地址很麻煩,因?yàn)槿萜骰蛘叻Q該服務(wù)的網(wǎng)絡(luò)地址是動態(tài)分配的,而且因?yàn)榉?wù)容量(運(yùn)行該容器的實(shí)例個數(shù))所以動態(tài)伸縮所以導(dǎo)致也無法用靜態(tài)地址,那要想調(diào)用服務(wù)就需要使用新的方式進(jìn)行服務(wù)發(fā)現(xiàn)。

服務(wù)發(fā)現(xiàn)有兩種模式,客戶端發(fā)現(xiàn)和服務(wù)器端發(fā)現(xiàn),常用的是服務(wù)器端發(fā)現(xiàn)因?yàn)橄鄬τ诳蛻舳税l(fā)現(xiàn)來說,服務(wù)器端發(fā)現(xiàn)把Service Registry抽離出來。Service Registry就是服務(wù)注冊,服務(wù)實(shí)例會在這里進(jìn)行注冊,當(dāng)不用的時候會注銷??蛻舳送ㄟ^負(fù)載均衡器向服務(wù)發(fā)起請求,負(fù)載均衡器在Service Registry中查找并將請求發(fā)送給可用服務(wù)實(shí)例。所有的服務(wù)發(fā)現(xiàn)工具中都有Service Registry這樣一個角色,它是核心,它是一個K/V的數(shù)據(jù)庫里面包含服務(wù)實(shí)例的網(wǎng)絡(luò)地址。通常Service Registry必須具備高可用,而且要時刻保持更新。


服務(wù)發(fā)現(xiàn)的注冊方式:有自注冊和第三方注冊

  • 自注冊:自己注冊自己,其實(shí)就是服務(wù)實(shí)例自己去Service Registry中注冊和注銷,在必要的情況下還會發(fā)送心跳信息給Registry。優(yōu)點(diǎn)是簡單不需要其他組件、缺點(diǎn)是服務(wù)實(shí)例和Service Registry是耦合的,開發(fā)人員必須要為服務(wù)單獨(dú)寫注冊代碼。

  • 第三方注冊:顧名思義注冊和注銷不是由服務(wù)實(shí)例自己完成,是由一個叫做服務(wù)注冊器來做,它對運(yùn)行中的服務(wù)實(shí)例進(jìn)行監(jiān)聽跟蹤,當(dāng)它發(fā)現(xiàn)服務(wù)可用時就會自動為其注冊。優(yōu)點(diǎn)是解耦,注冊由統(tǒng)一組件完成,開發(fā)人員不用單獨(dú)寫注冊器;缺點(diǎn)是部署環(huán)境中必須有注冊器,如果沒有就得自己來設(shè)置。


什么是Overlay?

overlay就是網(wǎng)絡(luò)疊加,一個數(shù)據(jù)包或者幀封裝在另外一個數(shù)據(jù)包或者幀里面。被封裝的包轉(zhuǎn)發(fā)到隧道另一端時進(jìn)行解封裝。Vxlan或者GRE/NVGRE都是一種疊加網(wǎng)絡(luò)技術(shù),屬于2層overlay技術(shù),思路就是將以太網(wǎng)報(bào)文放在某種隧道上傳輸,只是構(gòu)建隧道的方式或者協(xié)議不同。隧道有2層和3層之分,2層常見的就是PPTP或者L2TP等。三層常見的GRE、IPsec等。

overlay是在現(xiàn)有網(wǎng)絡(luò)之上構(gòu)建虛擬網(wǎng)絡(luò),上層應(yīng)用只和虛擬網(wǎng)絡(luò)有關(guān)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI