㈠ Linux裡面k8s有幾種網路模式
1、單機網路模式:Bridge 、Host、Container、None
2、多機網路模式:一類是 Docker 在 1.9 版本中引入Libnetwork項目,對跨節點網路的原生支持;一類是通過插件(plugin)方式引入的第三方實現方案,比如 Flannel,Calico 等等。
㈡ Docker容器間網路互聯原理,講不明白算我輸
如上紅字所描述:同一個宿主機上的不同容器之間的網路如何互通的???
我們安裝完docker之後,docker daemon會為我們自動創建3個網路,如下:
其實docker有4種網路通信模型,分別是:bridge、host、none、container
默認的使用的網路模型是bridge,也是我們生產上會使用到的網路模型。
下文中跟大家分享docker容器互通原理到時候呢,用到的也是bridge網路模型
另外,當我們安裝完docker之後,docker會為我們創建一個叫docker0的網路設備
通過ifconfig命令可以查看到它,看起來它貌似和eth0網路地位相當,像是一張網卡。然而並不是,docker0其實是一個Linux網橋
何以見得?可以通過下面的命令查看操作系統上的網橋信息
那大家怎麼理解Linux網橋的概念呢?
其實大家可以把docker0理解成一台虛擬的交換機!然後像下面這樣類比著理解,就會豁然開朗
1、它好比是大學在機房上課時,老師旁邊的那個大大的交換機設備。
2、把機房裡的電腦都連接在交換機上,類比成docker 容器作為一台設備都連接著宿主機上的docker0。
3、把交換機和機房中的機器的ip在同一個網段,類比成docker0、和你啟動的docker容器的ip也同屬於172網段。
類比成這樣:
我們剛才做類比理解docker0的時候說:把機房裡的電腦都連接在交換機上,類比成docker 容器作為一台設備都連接著宿主機上的docker0。那具體的實現落地實現用的是啥技術呢?
答案是:veth pair
veth pair的全稱是:virtual ethernet,就是虛擬的乙太網卡。
說到乙太網卡大家都不陌生呀,不就是我們常見的那種叫eth0或者是ens的網路設備嗎?
那這個veth pair是怎麼玩的呢?有啥用呢?大家可以看下面這張圖
veth-pair設備總是會成對的出現,用於連接兩個不同network-namespace.
就上圖來說,從network-namespace1的veth0中發送的數據會出現在 network-namespace2的veth1設備中。
雖然這種特性很好,但是如果出現有多個容器,你就會發現組織架構會越來越復雜,越來越亂
不過好在我們已經循序漸進的了解Linux網橋(docker0),以及這里的veth-pair設備,於是我們可以把整體的架構圖重新繪製成下面這樣
因為不同容器有自己隔離後的network-namespace所以他們都有自己的網路協議棧
那我們能不能找到容器裡面的網卡和物理機上的哪張卡是一對網路vethpair設備呢?
如下:
回到宿主機
意思是就是說,容器545ed62d3abf的eth0網卡和宿主機通過ip addr命令查看的網路設備標號55的設備組成一對vethpair設備,彼此流量互通!
先看個簡單的,同一個區域網中的不同主機A、B之間是如何互聯交換數據的。如下圖
那,既然是同一個區域網中,說明A、B的ip地址在同一個網段,如上圖就假設它們都在192.168.1.0網段。
還得再看下面這張OSI 7層網路模型圖。
主機A向主機B發送數據,對主機A來說數據會從最上層的應用層一路往下層傳遞。比如應用層使用的http協議、傳輸層使用的TCP協議,那數據在往下層傳遞的過程中,會根據該層的協議添加上不同的協議頭等信息。
根據OSI7層網路模型的設定,對於接受數據的主機B來說,它會接收到很多數據包!這些數據包會從最下層的物理層依次往上層傳遞,依次根據每一層的網路協議進行拆包。一直到應用層取出主機A發送給他的數據。
那麼問題來了,主機B怎麼判斷它收到的數據包是否是發送給自己的呢?萬一有人發錯了呢?
答案是:根據MAC地址,邏輯如下。
那對於主機A來說,它想發送給主機B數據包,還不能讓主機B把這個數據包扔掉,它只能中規中矩的按乙太網網路協議要求封裝將要發送出去的數據包,往下傳遞到數據鏈路層(這一層傳輸的數據要求,必須要有目標mac地址,因為數據鏈路層是基於mac地址做數據傳輸的)。
那數據包中都需要哪些欄位呢?如下:
其中的dst ip好說,我們可以直接固定寫,或者通過DNS解析域名得到目標ip。
那dst mac怎麼獲取呢?
這就不得不說ARP協議了! ARP其實是一種地址解析協議,它的作用就是:以目標ip為線索,找到目的ip所在機器的mac地址。也就是幫我們找到dst mac地址!大概的過程如下幾個step
推薦閱讀:白日夢的DNS筆記
簡述這個過程:主機A想給主機B發包,那需要知道主機B的mac地址。
嗯,在arp協議的幫助下,主機A順利拿到了主機B的mac地址。於是數據包從網路層流轉到數據鏈路層時已經被封裝成了下面的樣子:
根據OIS7層網路模型,我們都知道數據包經過物理層發送到機器B,機器B接收到數據包後,再將數據包向上流轉,拆包。流轉到主機B的數據鏈路層。
那主機B是如何判斷這個在數據鏈路層的包是否是發給自己的呢?
答案前面說了,根據目的mac地址判斷。
這個例子比較簡單,dst ip就是主機B的本機ip 所以它自己會處理這個數據包。
那數據包處理完之後是需要給主機A一個響應包,那問題又來了,響應包該封裝成什麼樣子呢?對主機B來說響應包也需要src ip、src mac、dst ip、dst mac
同樣的道理,響應包也會按照如下的邏輯被主機A接受,處理。
這一次,讓我在網路告訴你,當你請求 www..com 時都發生了什麼?
有了上面那些知識儲備呢?再看我們今天要探究的問題,就不難了。
如下紅字部分:同一個宿主機上的不同容器是如何互通的?
那我們先分別登陸容器記錄下他們的ip
先看實驗效果:在9001上curl9002
實驗結果是網路互通!
我們再完善一下上面的圖,把docker0、以及兩個容器的ip補充上去,如下圖:
那兩台機器之前要通信是要遵循OSI網路模型、和乙太網協議的。
我們管172.17.0.2叫做容器2
我們管172.17.0.3叫做容器3
比如我們現在是從:容器2上curl 容器3,那麼容器2也必須按照乙太網協議將數據包封裝好,如下
那現在的問題是容器3的mac地址是多少?
容器2會先查自己的本地緩存,如果之前沒有訪問過,那麼緩存中也沒有任何記錄!
不過沒關系,還有arp機制兜底,於是容器2會發送arp請求包,大概如下
容器2會查詢自己的路由表,將這個arp請求從自己的gateway發送出去
我們發現容器2的網關對應的網路設備的ip就是docker0的ip地址,並且經由eth0發送出去!
哎?eth0不就是我們之前說的veth-pair設備嗎?
並且我們通過下面的命令可以知道它的另一端對應著宿主機上的哪個網路設備:
而且我們可以下面的小實驗,驗證上面的觀點是否正確
所以說從容器2的eth0出去的arp請求報文會同等的出現在宿主機的第53個網路設備上。
通過下面的這張圖,你也知道第53個網路設備其實就是下圖中的veth0-1
所以這個arp請求包會被發送到docker0上,由docker0拿到這個arp包發現,目標ip是172.17.0.3並不是自己,所以docker0會進一步將這個arp請求報文廣播出去,所有在172.17.0.0網段的容器都能收到這個報文!其中就包含了容器3!
那容器3收到這個arp報文後,會判斷,哦!目標ip就是自己的ip,於是它將自己的mac地址填充到arp報文中返回給docker0!
同樣的我們可以通過抓包驗證,在宿主機上
於是容器2就拿到了容器3的mac地址,乙太網數據包需要的信息也就齊全了!如下:
再之後容器2就可以和容器3正常互聯了!
容器3會收到很多數據包,那它怎麼知道哪些包是發給自己的,那些不是呢?可以參考如下的判斷邏輯
㈢ docker網路問題 怎麼解決
網路基礎 Docker 現有的網路模型主要是通過使用 Network namespace、Linux Bridge、iptables、veth pair 等技術實現的。(出處8) Network namespace:它主要提供了網路資源的隔離,包括網路設備、IPv4/IPv6 協議棧、IP 路由表、防火牆、/proc/net 目錄、/sys/class/net 目錄、埠(socket)等。 Linux Bridge:功能相當於物理交換機,為連在其上的設備(容器)轉發數據幀,如 docker0 網橋。 Iptables:主要為容器提供 NAT 以及容器網路安全。 veth pair:兩個虛擬網卡組成的數據通道。在 Docker 中,用於連接 Docker 容器和 Linux Bridge。一端在容器中作為 eth0 網卡,另一端在 Linux Bridge 中作為網橋的一個埠。 容器的網路模式 用來設置網路介面的 docker run --net 命令,它的可用參數有四個: none:關閉了 container 內的網路連接。容器有獨立的 Network namespace,但並沒有對其進行任何網路設置,如分配 veth pair 和網橋連接,配置 IP 等。 bridge:通過 veth 介面來連接其他 container。這是 docker 的默認選項。 host:允許 container 使用 host 的網路堆棧信息。容器和宿主機共享 Network namespace。 container:使用另外一個 container 的網路堆棧信息。kubernetes 中的 pod 就是多個容器共享一個 Network namespace。 我們需要從中選一個作為我們的網路方案,實際上只有 bridge 和 host 兩種模式可選。(想了解這四個參數,請翻到附錄B之 Network settings。) 在 docker 默認的網路環境下,單台主機上的容器可以通過 docker0 網橋直接通信,如下圖(圖作者馮明振)所示:
㈣ docker哪種網路模式比較好
Docker的4種網路模式
我們在使用docker run創建Docker容器時,可以用--net選項指定容器的網路模式,Docker有以下4種網路模式:
host模式,使用--net=host指定。
container模式,使用--net=container:NAME_or_ID指定。
none模式,使用--net=none指定。
bridge模式,使用--net=bridge指定,默認設置。
下面分別介紹一下Docker的各個網路模式。
1、host模式
眾所周知,Docker使用了Linux的Namespaces技術來進行資源隔離,如PID Namespace隔離進程,Mount Namespace隔離文件系統,Network Namespace隔離網路等。一個Network Namespace提供了一份獨立的網路環境,包括網卡、路由、Iptable規則等都與其他的Network Namespace隔離。一個Docker容器一般會分配一個獨立的Network Namespace。但如果啟動容器的時候使用host模式,那麼這個容器將不會獲得一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace。容器將不會虛擬出自己的網卡,配置自己的IP等,而是使用宿主機的IP和埠。
例如,我們在10.10.101.105/24的機器上用host模式啟動一個含有web應用的Docker容器,監聽tcp80埠。當我們在容器中執行任何類似ifconfig命令查看網路環境時,看到的都是宿主機上的信息。而外界訪問容器中的應用,則直接使用10.10.101.105:80即可,不用任何NAT轉換,就如直接跑在宿主機中一樣。但是,容器的其他方面,如文件系統、進程列表等還是和宿主機隔離的。
2、 container模式
在理解了host模式後,這個模式也就好理解了。這個模式指定新創建的容器和已經存在的一個容器共享一個Network Namespace,而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的IP,而是和一個指定的容器共享IP、埠范圍等。同樣,兩個容器除了網路方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過lo網卡設備通信。
3、none模式
這個模式和前兩個不同。在這種模式下,Docker容器擁有自己的Network Namespace,但是,並不為Docker容器進行任何網路配置。也就是說,這個Docker容器沒有網卡、IP、路由等信息。需要我們自己為Docker容器添加網卡、配置IP等。
4、bridge模式
bridge模式是Docker默認的網路設置,此模式會為每一個容器分配Network Namespace、設置IP等,並將一個主機上的Docker容器連接到一個虛擬網橋上。
棧是一種常見的數據結構,它雖然有棧頂和棧底之分,但它只能從一端操作(插入或刪除),從而是一種「先進後出」的操作模式。向棧內進數據稱為壓棧(Push),從棧里取出數據叫出棧(POp)。例如壓棧順序為1、2、3、4、5,著出棧的順序為5、4、3、2、1(只考慮一次性出棧的情況)。
棧按照存儲的方式,又分為順序棧和鏈表棧。順序棧基於數組實現,所以順序棧存儲數據的內存是連續的,在創建棧時規定好棧的大小,這樣對內存的使用效率並不高。而鏈式棧則是採用了鏈表來實現,其元素的存儲地址是不連續的,而且是動態分配內存。順序棧在使用的過程中可能出現 棧滿、棧空的情況,由於鏈式棧基於鏈表設計,因此不會有棧滿的情況(也會棧空)。
㈤ 雲計算核心技術Docker教程:Docker使用網橋網路
【點擊右上角加'關注',全國產經信息不錯過】
就網路而言,網橋網路是在網段之間轉發流量的鏈路層設備。網橋可以是在主機內核中運行的硬體設備或軟體設備。
就Docker而言,網橋網路使用軟體網橋,該軟體網橋允許連接到同一網橋網路的容器進行通信,同時提供與未連接到該網橋網路的容器的隔離。Docker網橋驅動程序會自動在主機中安裝規則,以使不同網橋網路上的容器無法直接相互通信。
橋接網路適用於在同一Docker守護程序主機上運行的容器。為了在不同Docker守護程序主機上運行的容器之間進行通信,您可以在OS級別管理路由,也可以使用 覆蓋網路。
啟動Docker時,會自動創建一個默認的橋接網路(也稱為bridge),並且除非另有說明,否則新啟動的容器將連接到它。您還可以創建用戶定義的自定義網橋網路。用戶定義的網橋網路優於默認bridge 網路。
用戶定義的網橋和默認網橋之間的
用戶定義的網橋可在容器之間提供自動DNS解析。
預設橋接網路上的容器只能通過IP地址相互訪問,除非您使用被認為是傳統的--link選項。在用戶定義的網橋網路上,容器可以通過名稱或別名相互解析。
想像一個具有Web前端和資料庫後端的應用程序。如果調用容器web和db,則db無論應用程序堆棧在哪個Docker主機上運行,Web容器都可以在處連接到db容器。
如果在默認網橋網路上運行相同的應用程序堆棧,則需要在容器之間手動創建鏈接(使用舊式--link 標志)。這些鏈接需要雙向創建,因此您可以看到,要進行通信的容器要多於兩個,這會變得很復雜。或者,您可以操作/etc/hosts容器中的文件,但這會導致難以調試的問題。
用戶定義的網橋提供了更好的隔離性。
所有未--network指定的容器都將連接到默認網橋網路。這可能是一種風險,因為不相關的堆棧/服務/容器隨後能夠進行通信。
使用用戶定義的網路可提供作用域網路,其中只有連接到該網路的容器才能通信。
容器可以隨時隨地從用戶定義的網路連接和分離。
在容器的生命周期內,您可以即時將其與用戶定義的網路連接或斷開連接。要從默認橋接網路中刪除容器,您需要停止容器並使用其他網路選項重新創建它。
每個用戶定義的網路都會創建一個可配置的網橋。
如果您的容器使用默認的橋接網路,則可以對其進行配置,但是所有容器都使用相同的設置,例如MTU和iptables規則。另外,配置默認橋接網路發生在Docker本身之外,並且需要重新啟動Docker。
用戶定義的橋接網路是使用創建和配置的 docker network create。如果不同的應用程序組具有不同的網路要求,則可以在創建時分別配置每個用戶定義的網橋。
默認網橋網路上的鏈接容器共享環境變數。
最初,在兩個容器之間共享環境變數的唯一方法是使用--linkflag鏈接它們。用戶定義的網路無法進行這種類型的變數共享。但是,存在共享環境變數的高級方法。一些想法:
多個容器可以使用Docker卷掛載包含共享信息的文件或目錄。
使用可以一起啟動多個容器docker-compose,並且compose文件可以定義共享變數。
您可以使用群體服務來代替獨立容器,並利用共享機密和 配置。
連接到同一用戶定義網橋網路的容器可以有效地將所有埠彼此公開。為了使容器或不同網路上的非Docker主機可以訪問該埠,必須使用或 標志發布該埠。-p--publish
全國產經平台聯系電話:010-65367702,郵箱:[email protected],地址:北京市朝陽區金台西路2號人民日報社
㈥ 怎麼查看docker所在的網路模式
docker inspect可以查看當前容器所有信息 裡面就包含網路內容 可以看下linux就該這么學 網站上不少docker資料
㈦ Docker容器網路-實現篇
前面介紹了: Docker容器網路-基礎篇
前文說到容器網路對Linux虛擬化技術的依賴,這一篇章我們將一探究竟,看看Docker究竟是怎麼做的。通常,Linux容器的網路是被隔離在它自己的Network Namespace中,其中就包括:網卡(Network Interface)、回環設備(Loopback Device)、路由表(Routing Table)和iptables規則。對於一個進程來說,這些要素,就構成了它發起和響應網路請求的基本環境。
我們在執行 docker run -d --name xxx 之後,進入容器內部:
並執行 ifconfig:
我們看到一張叫eth0的網卡,它正是一個Veth Pair設備在容器的這一端。
我們再通過 route 查看該容器的路由表:
我們可以看到這個eth0是這個容器的默認路由設備。我們也可以通過第二條路由規則,看到所有對 169.254.1.1/16 網段的請求都會交由eth0來處理。
而Veth Pair 設備的另一端,則在宿主機上,我們同樣也可以通過查看宿主機的網路設備來查看它:
在宿主機上,容器對應的Veth Pair設備是一張虛擬網卡,我們再用 brctl show 命令查看網橋:
可以清楚的看到Veth Pair的一端 vethd08be47 就插在 docker0 上。
我現在執行docker run 啟動兩個容器,就會發現docker0上插入兩個容器的 Veth Pair的一端。如果我們在一個容器內部互相ping另外一個容器的IP地址,是不是也能ping通?
容器1:
容器2:
從一個容器ping另外一個容器:
我們看到,在一個容器內部ping另外一個容器的ip,是可以ping通的。也就意味著,這兩個容器是可以互相通信的。
我們不妨結合前文時所說的,理解下為什麼一個容器能訪問另一個容器?先簡單看如一幅圖:
當在容器1里訪問容器2的地址,這個時候目的IP地址會匹配到容器1的第二條路由規則,這條路由規則的Gateway是0.0.0.0,意味著這是一條直連規則,也就是說凡是匹配到這個路由規則的請求,會直接通過eth0網卡,通過二層網路發往目的主機。而要通過二層網路到達容器2,就需要127.17.0.3對應的MAC地址。所以,容器1的網路協議棧就需要通過eth0網卡來發送一個ARP廣播,通過IP找到MAC地址。
所謂ARP(Address Resolution Protocol),就是通過三層IP地址找到二層的MAC地址的協議。這里說到的eth0,就是Veth Pair的一端,另一端則插在了宿主機的docker0網橋上。eth0這樣的虛擬網卡插在docker0上,也就意味著eth0變成docker0網橋的「從設備」。從設備會降級成docker0設備的埠,而調用網路協議棧處理數據包的資格全部交給docker0網橋。
所以,在收到ARP請求之後,docker0就會扮演二層交換機的角色,把ARP廣播發給其它插在docker0網橋的虛擬網卡上,這樣,127.17.0.3就會收到這個廣播,並把其MAC地址返回給容器1。有了這個MAC地址,容器1的eth0的網卡就可以把數據包發送出去。這個數據包會經過Veth Pair在宿主機的另一端veth26cf2cc,直接交給docker0。
docker0轉發的過程,就是繼續扮演二層交換機,docker0根據數據包的目標MAC地址,在CAM表查到對應的埠為veth8762ad2,然後把數據包發往這個埠。而這個埠,就是容器2的Veth Pair在宿主機的另一端,這樣,數據包就進入了容器2的Network Namespace,最終容器2將響應(Ping)返回給容器1。在真實的數據傳遞中,Linux內核Netfilter/Iptables也會參與其中,這里不再贅述。
CAM就是交換機通過MAC地址學習維護埠和MAC地址的對應表
這里介紹的容器間的通信方式就是docker中最常見的bridge模式,當然此外還有host模式、container模式、none模式等,對其它模式有興趣的可以去閱讀相關資料。
好了,這里不禁問個問題,到目前為止只是單主機內部的容器間通信,那跨主機網路呢?在Docker默認配置下,一台宿主機的docker0網橋是無法和其它宿主機連通的,它們之間沒有任何關聯,所以這些網橋上的容器,自然就沒辦法多主機之間互相通信。但是無論怎麼變化,道理都是一樣的,如果我們創建一個公共的網橋,是不是集群中所有容器都可以通過這個公共網橋去連接?
當然在正常的情況下,節點與節點的通信往往可以通過NAT的方式,但是,這個在互聯網發展的今天,在容器化環境下未必適用。例如在向注冊中心注冊實例的時候,肯定會攜帶IP,在正常物理機內的應用當然沒有問題,但是容器化環境卻未必,容器內的IP很可能就是上文所說的172.17.0.2,多個節點都會存在這個IP,大概率這個IP是沖突的。
如果我們想避免這個問題,就會攜帶宿主機的IP和映射的埠去注冊。但是這又帶來一個問題,即容器內的應用去意識到這是一個容器,而非物理機,當在容器內,應用需要去拿容器所在的物理機的IP,當在容器外,應用需要去拿當前物理機的IP。顯然,這並不是一個很好的設計,這需要應用去配合配置。所以,基於此,我們肯定要尋找其他的容器網路解決方案。
在上圖這種容器網路中,我們需要在我們已有的主機網路上,通過軟體構建一個覆蓋在多個主機之上,且能把所有容器連通的虛擬網路。這種就是Overlay Network(覆蓋網路)。
關於這些具體的網路解決方案,例如Flannel、Calico等,我會在後續篇幅繼續陳述。
㈧ 什麼是Docker網路
這個問題很簡單,現在無線通信系統中,每個基站覆蓋的區域類似一個六邊形,多個基站組合起來,恰恰類似蜜蜂的窩的形狀,就叫做蜂窩網路了!
目前主流通訊服務提供上絕大部分採用蜂窩網路。什麼是蜂窩網路呢?簡單地說,就是把行動電話的服務區別分為一個個正六邊形的子區,每個小區設一個基站。形成了形狀酷似「蜂窩」的結構,因而把這種移動通信方式稱為蜂窩移動通信方式。蜂窩網路又可分為模擬蜂窩網路和數字蜂窩網路,主要區別於傳輸信息的方式。
蜂窩網路被廣泛採用的原因是源於一個數學猜想,正六邊形被認為是使用最少個結點可以覆蓋最大面積的圖形,出於節約設備構建成本的考慮,正六邊形是最好的選擇。這樣形成的網路覆蓋在一起,形狀非常象蜂窩,因此被稱作蜂窩網路。
蜂窩網路組成主要有以下三部分:移動站,基站子系統,網路子系統.移動站就是我們的網路終端設備,比如手機或者一些蜂窩工控設備 。基站子系統包括我們日常見到的移動機站(大鐵塔)、無線收發設備、專用網路(一般是光纖)、無數的數字設備等等的。我們可以把基站子系統看作是無線網路與有線網路之間的轉換器。
常見的蜂窩網路類型有:GSM網路(有些國家叫pcs-1900)、CDMA網路、3G網路、FDMA、TDMA、PDC、TACS、AMPS等