目錄:node
說在前面的話,說一下廣泛公司的網絡架構,不過像咱們運維這一塊,接觸網絡的也不是不少了,如今通常都是在雲上操做,並且機房也不多去了,可是k8s這一塊又不得沒必要備一些網絡的傳統知識,因此要想把k8s掌握,網絡是必須懂的。
linux
網絡基礎知識
一、公司網絡架構
二、交換技術
三、路由技術
四、OSI七層模型
五、TCP/UDP協議
kubernetes網絡模型
一、Docker容器網絡模型
二、pod網絡
三、CNI(容器網絡接口)nginx
一、公司網絡架構git
先看一下這個架構圖,最下面的是咱們的服務器,就是咱們維護的服務器,要想接入到網絡中,它要通過上面鏈路通過的轉發,像服務器,辦公電腦都是鏈接的交換機,交換機是一個端口比較多的,而後它處於接入層,而後再往上就是核心的交換機,就是三層的,而且是一些網絡策略,再往上咱們須要將咱們核心交換機的網絡中的數據轉發到互聯網,它就要經過路由器轉發出去到互聯網,而後到互聯網就能夠訪問一些網站,百度,谷歌等,而後其餘層面訪問百度服務器,實際互聯網訪問百度服務器,也是經過各個設備,交換機,路由等進行轉發,到達百度,經過這種形式呢,將一些小的獨立的網絡與其餘網絡連在一塊,造成一個龐大的總體,這就是互聯網。github
大部分分紅了如下幾層:
路由器:網絡出口
核心層:主要完成數據高效轉發、鏈路備份等,它是路由器下面核心的入口,下面全部的交換機和服務器最上面的入口,這一層主要是保證高效的轉發下面的數據,但在這一層有時候還會獨立的剝離出一層,也就是在二層交換機上面添加一個匯聚層,匯聚層通常都是完成一些網絡策略,數據包從互聯網來了,而後在三層作一些管控,下面的數據包出現一些,怎麼管控,下面可能會劃分不少的vlan,不少虛擬的局域網,通常大型公司都是經過使用三層交換,來劃分多個vlan來實現不能策略的管控,好比說辦公網絡是不通的,要是想通的話,須要申請ecl,公司與機房的網絡也是不通的,這是默認不讓通,也是爲了安全着想,而後就是公司與測試機房也是不通的,要是想通也是須要申請ecl,因此這些都是在覈心層,匯聚層去管控的,而後在下面接入交換機,這個跟機房的都是同樣的docker
大部分就是分紅三層:接入層--->核心層/匯聚層--->網絡出口
匯聚層:網絡策略、安全、工做站交換機的接入、VLAN之間通訊等功能
接入層:工做站的接入
下面咱們研究的事是也就是接入層當咱們的服務器、pc電腦,若是想到達互聯網它的數據包怎麼途徑的去轉發的?
咱們還要知作別人訪問咱們的服務器,這個數據是怎麼來的,還要了解不一樣區域的局域網之間通訊是怎麼個流程?
若是在同一個vlan裏面,也就是同一個局域網通訊它們又是一個怎麼樣的通訊?緩存
瞭解這麼多問題,那麼就要去了解這些網絡設備,第一個就是交換機(switch),第二個就是路由器(router)
在咱們學習k8s中,像裏面的網絡雖然是看不見摸不着的網絡設備,可是它背後的工做都是這些組成的,只不過這些路由器交換機你是看不到的,你看到的都是服務器上的一些操做,可是背後是怎麼出去的,須要咱們掌握。安全
二、交換技術
有想過局域網內主機怎麼通訊的?主機訪問外網又是怎麼通訊的?
想要搞懂這些問題得從交換機、路由器講起。
這個是一個華爲h3c的交換機,這個是24口的,也有48口的,因此它的口要相比路由器多不少不少,它主要是爲了接入更多的工做站,由於工做站就有不少的pc電腦了,服務器,因此多不少,因此它面向的對象就是一些實際的計算機,它涉及的口業比較多,而路由器它自己的上下級關係設備比較少,通常也就4-5個,這個交換機作的用的就是這個交換技術,咱們要了解這個交換技術怎麼去工做的,經過局域網內主機怎麼通訊的?主機訪問外網又是怎麼通訊的?進行出發,去理解這個交換技術怎麼去工做的服務器
交換機工做在OSI參考模型的第二層,即數據鏈路層。交換機擁有一條高帶寬的背部總線交換矩陣,在同一時間可進行多個端口對之間的數據傳輸。網絡
而交換機又在工做上分爲2層和3層,這個也是指的是OSI中的2層和3層(3層傳輸層,2層數據鏈路層)
交換技術分爲2層和3層:
2層:主要用於小型局域網,僅支持在數據鏈路層轉發數據,對工做站接入,這個也就是基於MAC地址的轉發,
3層:三層交換技術誕生,最初是爲了解決廣播域的問題,多年發展,三層交換機書已經成爲構建中大型網絡的主要力量,這個也就是基於路由器的功能,基於IP,數據包進行去轉發,主要也是解決一個廣播域的問題。
例若有一臺交換機,下面分別有兩臺pc,分別爲主機a,和主機b,如今是主機a去訪問主機b怎麼去通訊?
這就不得去了解交換機怎麼去工做的,由於自己咱們的兩臺pc是物理隔離的,上面有交換機進行鏈接,它們實現的通訊那麼就要去理解交換機的工做原理。
下面簡單總結了OSI模型對應的功能
應用層:(各類應用程序協議,如http、ftp、pop三、smtp等)
傳輸層:TCP/UDP (接收上一層的數據,在必要的時候把數據進行分割,並將這些數據交給網絡層,且保證這些數據段有效到達對端)
網絡層:IP地址 (控制子網的運行,如邏輯編址、分組傳輸、路由選擇) 對應設備路由器
數據鏈路層:MAC地址(物理尋址,也就是機器上在出廠商留下的編碼,也就是網卡,也是網絡中惟一的標識,同時將原始比特流轉變爲邏輯的傳輸線路)對應設備交換機
物理層:比特流(機械、電子、定時接口通訊信道上的原始比特流傳輸)
其實在交換機中它是根據二層的MAC地址進行轉發的,mac地址也就是每一個電腦上的網卡,這個網卡是有一個物理地址的,也是惟一的,也就是廠商出的時候,幫你帶出去的,而交換機就是基於這個mac地址進行轉發通訊的,若是主機a發送一個文件到主機b,要發給誰那麼就要涉及到一個ip地址,也就是至關於一個門牌號,經過這個標識能夠找到你,因此必需要知道這個ip是誰,但交換機不會考慮這個ip是誰,由於它設計原理就是基於Mac地址進行尋址的,因此主機a發送這個數據包時,必須知道目標主機的mac地址,才能封裝一個二層的,這個包稱爲幀,那怎麼去找的這個ip呢,自己這個mac地址就是惟一的,而它的IP是同一個網段,若是不是一個網段也不能之間通訊了,雖然知道了對方的ip地址,可是交換機的工做設計是經過對方的mac地址進行轉發的,由於它工做是在二層,因此這裏還依賴了一個ARP的協議,這個ARP是根據IP地址獲取物理地址的一個TCP/IP協議。主機發送信息時將包含目標IP地址的ARP請求廣播到局域網絡上的全部主機,並接收返回消息,以此肯定目標的物理地址;收到返回消息後將該IP地址和物理地址存入本機ARP緩存中並保留必定時間,下次請求時直接查詢ARP緩存以節約資源,完成存檔以後,下次就能直接請求並轉發數據包了,那麼這就組成了四元組,首先源IP,源mac,目的ip,目的mac,也就是一個二層的包,這樣就完成一個數據的傳輸。
這期間就會涉及到一個廣播域的問題,在公司中有一個大的網絡,而在這個網絡中會劃分爲不少的虛擬網,好比交換機下面接了20多臺主機,若是發的這個廣播包,要被其餘的攔截了,或者有一些主機就喜歡發廣播包,好比沒有這個目的地址,好比沒有這個1.30這個主機,那麼這個交換機找不到一直就廣播,那麼就會產生大量的流量丟失,網絡延遲,網絡癱瘓等等,那麼爲了解決這個問題,可能上百的主機劃分爲小的局域網,若是廣播域不劃分的話,那麼這個廣播域遇到一個找不到的目的mac就會產生一些很差的因素,若是換成小的局域網的話,只會影響小部分,也就是vlan,一個vlan就是一個廣播域,一個路由器下的一個端口就是一個廣播域,vlan的做用就是將物理環境邏輯上劃分爲不一樣的局域網,而vlan就是隔離這個廣播域的,路由器也能隔離廣播域,因此路由器下面就是一個廣播域,若是某個vlan中出現廣播風暴或者arp(arp實際就是經過僞造IP地址和MAC地址進行欺騙。使以太網數據包的源地址、目標地址和ARP數通訊量致使網絡中斷或中間人。ARP主要存在於局域網中。若其中一臺計算機感染ARP病毒。就會試圖經過ARP欺騙截獲局域網內其餘計算機的信息,形成局域網內的計算機通訊故障。)就會影響這個vlan這個廣播域中的主機,這也是大型公司網絡架構爲何劃分vlan的緣由。
廣播域
交換機在轉發數據時會先進行廣播,這個廣播能夠發送的區域就是一個廣播域。交換機之間對廣播幀是透明的,因此交換機之間組成的網絡是一個廣播域。
路由器的一個接口下的網絡是一個廣播域,因此路由器能夠隔離廣播域。
ARP(地址解析協議,在IPV6中用NDP替代)
發送這個廣播幀是由ARP協議實現,ARP是經過IP地址獲取物理地址的一個TCP/IP協議,主要負責將某個IP地址解析成對應的MAC地址。
三層交換機
前面講的二層交換機只工做在數據鏈路層,路由器則工做在網絡層。而功能強大的三層交換機可同時工做在數據鏈路層和網絡層,並根據 MAC地址或IP地址轉發數據包,而三層的交換機又支持路由器的功能,路由器是工做在網絡層,而三層交換機又集成了二層和三層,因此叫作三層交換機,當咱們把二層交換機換成3層的以後,就能實現不一樣vlan之間的通訊了,不一樣vlan也就是隔離的局域網,而後使用二層的話是過不去的,由於這個不在同一個網段了,這個廣播包也散不到這一塊了,那只有走路由表的形式轉發出去,可是三層的交換機不能替代路由的功能,由於三層交換機設計之初就是來解決不一樣vlan不能局域網之間的廣播域的問題,通過多年的時間,三層也不只僅只作這一塊,還會作一些網絡策略之類的,安全之類的,比較成熟了。
網橋
網橋(Bridge)是早期的兩端口二層網絡設備,用來鏈接不一樣網段。網橋的兩個端口分別有一條獨立的交換信道,不是共享一條背板總線,可隔離衝突域。網橋比集線器(Hub)性能更好,集線器上各端口都是共享同一條背板總線的。後來,網橋被具備更多端口、同時也可隔離衝突域的交換機(Switch)所取代。
VLAN(Virtual Local Area Network):虛擬局域網
VLAN是一種將局域網設備從邏輯上劃分紅一個個網段。
一個VLAN就是一個廣播域,VLAN之間的通訊是經過第3層的路由器來完成的。VLAN應用很是普遍,基本上大部分網絡項目都會劃分vlan。
VLAN的主要好處:
分割廣播域,減小廣播風暴影響範圍。
提升網絡安全性,根據不一樣的部門、用途、應用劃分不一樣網段
其實剛纔說道arp緩存表,廣播的時候,會收到一份目的的mac地址表,而後緩存再留一份,其實這個是經過命令行也能看到的
用arp -a 就能看到,而緩存表也是爲了,下次再去發送數據包的時候,不用再去廣播目的mac來,它會先從本身的緩存表去找有沒有對應的目的mac表,有的話就直接轉發數據包,可是這個表也有保留時間,若是這個表不活躍了也就沒了。
在k8s中一臺中容器是怎麼通訊的,就是經過ARP協議,跟交換機原理同樣,由於它有網橋也就是一個交換機的角色進行來實現的,ARP協議在網橋中都是支持的
三、路由技術
這個也是一個h3c的路由器,裏面才6個口,可是這個口通常分爲2個角色,固然除了一個console管理口,一個是LAN口一個是WAN口,
路由器主要分爲兩個端口類型:LAN口和WAN口
WAN口:配置公網IP,接入到互聯網,轉發來自LAN口的IP數據包。
LAN口:配置內網IP(網關),鏈接內部交換機,對接的是工做機,工做站。
那麼這裏又出現了一個公網IP和內網IP,wan口確定須要配置一個公網ip的,它好讓下面的機器出去可以訪問外網,那麼自己互聯網就一個內網的IP怎麼才能鏈接到互聯網呢,那麼就是須要一個互聯網上互相信任的公網ip ,公網就是互聯網可見的,其餘人均可以隨意的訪問這個IP,那麼內網IP呢,只有內部局域網之間訪問,就像機房的服務器同樣,有兩個網卡,一個是內網一個是公網,外網IP是配置的公網,內網是配置的內網IP,出外網確定須要走公網網卡。
路由器是鏈接兩個或多個網絡的硬件設備,將從端口上接收的數據包,根據數據包的目的地址智能轉發出去。
路由器的功能:
路由
轉發
隔離子網
隔離廣播域
路由器是互聯網的樞紐,是鏈接互聯網中各個局域網、廣域網的設備,相比交換機來講,路由器的數據轉發很複雜,它會根據目的地址給出一條最優的路徑。那麼路徑信息的來源有兩種:動態路由和靜態路由。
就是說公司的網絡怎麼到互聯網呢,就是說互聯網的用戶怎麼訪問咱們的服務呢,都是經過路由器轉發,而交換機只作局域網之間數據包的轉發,也就是能在二層經過MAC地址,能發廣播包的環境下才能夠轉發這個數據包,可是路由器的轉發比較複雜,它去轉發它會考慮哪一個路徑比較好,最優的路徑,走最近的路,也就是路由器會作這麼一個事,而這個路徑分爲兩個一個爲靜態一個爲動態。
靜態路由:指人工手動指定到目標主機的地址而後記錄在路由表中,若是其中某個節點不可用則須要從新指定,手動的可能就像在你的linux服務器上或者路由器上手動去添加路由表,這個路由我應該轉發給誰,下一跳是誰,當下一跳不能用了,那麼這個數據包在這個路由器就不能用了,下一跳轉發不過去就丟棄了,數據包過不去,訪問天然就是不可達網絡。
動態路由:則是路由器根據動態路由協議自動計算出路徑永久可用,能實時地適應網絡結構的變化。
經常使用的動態路由協議:
RIP( Routing Information Protocol ,路由信息協議)
OSPF(Open Shortest Path First,開放式最短路徑優先)
BGP(Border Gateway Protocol,邊界網關協議)
四、OSI七層模型
OSI(Open System Interconnection)是國際標準化組織(ISO)制定的一個用於計算機或通訊系統間互聯的標準體系,通常稱爲OSI參考模型或七層模型。
咱們常常說的七層和四層的轉發其實就是基於OSI七層模型的體系
從主機a到主機b,經歷了哪些階段通過的處理,這個的話,通常就是經過下面這種方式從主機a的數據到主機b的數據,先進行封裝對這個數據包進行封裝,到4層以後就是一個傳輸層,也就是TCP/UDP的協議,爲兩個端系統的會話層之間,提供創建、維護和取消傳輸鏈接的功能,負責端到端的可靠數據傳輸,在這一層,信息傳送的協議數據單元稱爲段或報文,而後到達網絡層,主要定義了可以標識全部結點的邏輯地址,還定義了路由實現的方式和學習的方式,根據ip的地址的標識進行,通常使用的都是市面的路由器來完成,而後到數據鏈路層,到達交換機,也就是物理地址,經過ARP協議地址解析協議,解析目的mac和源mac地址,加入緩存中,以便下次使用而後到物理層將數據包轉化爲計算機能夠識別的比特序列,而後一層一層的返回拆開返回到目標主機
五、TCP/UDP協議
TCP(Transmission Control Protocol,傳輸控制協議),面向鏈接協議,雙方先創建可靠的鏈接,再發送數據。tcp主要適用於傳輸數據量大,可靠性要求高的應用場景,它設計數據包若是超過了mpu,最大傳輸單元,最大是1500字節,若是數據包超出了1500字節就進行分組,就是在三層這裏進行分組,分紅不少的小塊進行發佈,而且這個組會打成一個序號,這個序號就能保證發送的數據,是否是連續或者損壞,而後重傳,tcp保證來保證數據包的可靠性
UDP(User Data Protocol,用戶數據報協議),面向非鏈接協議,不與對方創建鏈接,直接將數據包發送給對方。適用於一次只傳輸少許的數據,可靠性要求低的應用場景。相對TCP傳輸速度快。這個udp沒有三次握手就直接進行發送數據包,可是發包呢,但不能肯定你這個包能不能準確接收到,由於沒有ack來返回序列號來肯定,這個序列號爲1了,我收到這個包,序列號爲2了我收到這個包,若是發送一個3沒有收到這個包就會跟你重傳,它設計的也比較簡單,你給我個端口,我就能給你發這個包,無論你收沒收到,不會響應,並且超出最大的傳輸單元以後,也會進行分組,可是不能保證分組的數據包的可靠性,其中有一個包丟了,其它的包就不能作整合了,由於這個數據包跟你分開以後,少了一塊,那麼這個數據包就是一個損壞的狀態,對方就收不到了,由於這個數據包丟棄了。
4.2 Kubernetes網絡模型說在前面的話考慮的k8s的網絡是怎麼走的,容器怎麼出去的網絡,容器與容器之間是怎麼訪問的,pod與pod之間是怎麼訪問的,它們怎麼訪問個人pod,這也就是網絡模型,可是這個網絡模型有一個前提,怎麼給這個pod分配一個可見的ip地址,而後這個ip地址在網絡中怎麼去訪問,訪問的時候要不要作個nginx過去才能訪問到它,因此這個網絡模型就是來約束各類條件的。
像flannel和calico網絡插件都有必定的要求,怎麼接入到k8s裏面必須知足這些要求,也就是都知足這些要求才能被第三方網絡插件支持
Kubernetes 要求全部的網絡插件實現必須知足以下要求:
一個Pod一個IP。 這個是必須的,一個pod能夠與節點上的全部pod能夠通訊,就是直接能夠訪問的,不須要nginx代理
全部的 Pod 能夠與任何其餘 Pod 直接通訊,無需使用 NAT 映射。 k8s的全部節點均可以訪問這個pod,這個首先是在蘇主機出發能夠訪問到全部的pod
全部節點能夠與全部 Pod 直接通訊,無需使用 NAT 映射
Pod 內部獲取到的 IP 地址與其餘 Pod 或節點與其通訊時的 IP 地址是同一個。
在同一個節點docker的網絡是什麼樣的?要了解pod在同一個節點與同一個節點的通訊,能夠先從docker的網絡模型先去理解,這個跟pod與pod的相通訊是同樣的。
一、Docker容器網絡模型
先看下Linux網絡名詞:
也就是安裝好一個linux主機以後,會建立一個網絡命名空間也就是全部的進程都在這個網絡命名空間裏面,因此均可以在這個linux中訪問這個網絡,可是這個docker利用這個大的網絡命名空間進行了隔離,也就是一個容器也就是一個網絡命名空間,因此在宿主上看不到也訪問不到某個容器的網絡的,是看不到的,而容器之間也看不到對方的網絡的,因此容器使用的namespace給容器作的網絡的隔離,而後容器還有個問題
也就是容器已經都有本身的命名空間了,容器與宿主機也是隔離的,個人數據包是怎麼出去的,因此這裏就用到了這個設備對veth
網絡的命名空間:Linux在網絡棧中引入網絡命名空間,將獨立的網絡協議棧隔離到不一樣的命令空間中,彼此間沒法通訊;Docker利用這一特性,實現不一樣容器間的網絡隔離。
Veth設備對:Veth設備對的引入是爲了實如今不一樣網絡命名空間的通訊。這個設備對至關於一個網線同樣,容器的網絡命名空間與宿主機上的命名空間,宿主機的命名空間爲root,如今想讓containers的命名空間與宿主機的命名空間進行通訊的話,因此會用到這個veth的這個設備對,這個網線,讓容器的命名空間接入到宿主機的命名空間中,當在k8s中起個pod時,當使用docker起個容器時,用ifconfig會看到不少veth的不少設備,其實這就是另外一端,能夠說是水晶頭的另外一頭,容器自己就有一個本身虛擬的網絡,它想出去只有藉助宿主機的網絡出去,由於自己就是在宿主機上的一個藏着的網絡,它要想出去還得經過宿主機,因此它有這個設備對就能完成數據的轉發。
Iptables/Netfilter:Docker使用Netfilter實現容器網絡轉發。要是docker要想上網,雖然有了容器與宿主機網絡命名空間的這麼一個數據包過來,可是它怎麼經過宿主機的網絡訪問到外部的網絡呢,因此它用到了netfilter,它的linux的一個IP包的過濾機制,而後來實現容器之間的網絡的轉發,容器到達宿主機,而veth這個口實際是接入了網橋中,而後能夠這麼想象,每一個容器就是一個電腦,交換機就是一個網橋,能夠經過命令看到另外一端,能看一下這個網橋加入了哪些網線,這個交換機下面有哪些主機,經過這個命令能夠看出跟交換機的原理差很少,經過arp協議獲取mac地址,也就是封裝二層數據包這個幀包,而後之間在二層進行轉發的,可是它要訪問外網又須要iptables的snat dnat,根據原地址目標地址轉發外網
[root@k8s-node1 ~]# yum -y install bridge-utils [root@k8s-node1 ~]# brctl show cni0 bridge name bridge id STP enabled interfaces cni0 8000.e27423da0b65 no vethbf3ee8ae vethf4889480
網橋:網橋是一個二層網絡設備,經過網橋能夠將Linux支持的不一樣的端口鏈接起來,並實現相似交換機那樣的多對多的通訊。這個能夠經過ifconfig能夠看到docker0的網橋,這個網橋是docker建立容器也就是讓它加入到這個交換機裏面實現相互的訪問了。
路由:Linux系統包含一個完整的路由功能,當IP層在處理數據發送或轉發的時候,會使用路由表來決定發往哪裏。這個呢會遇到也就是用到第三方插件的時候,會出現不少的路由表來實現容器之間的通訊
Docker容器網絡示意圖以下:
這個就是容器網絡的示意圖,每一個容器都有一個veth的設備對,也就是部署一個pod後會出現這個一個設備對來鏈接宿主機的命名空間,這個對一頭是網線一頭是網橋,也就是eth0(docker0),若是他們通訊的話,直接走二層廣播包協議封包就能實現網絡的轉發了,它想出去就經過iptables的nat,來藉助宿主機的網絡訪問外網
二、Pod 網絡
問題:Pod是K8S最小調度單元,一個Pod由一個容器或多個容器組成,當多個容器時,怎麼都用這一個Pod IP?
就是我這個pod中無論有多少個容器只能用這一個ip通訊,這也是它設計pod的意義
實現:k8s會在每一個Pod裏先啓動一個infra container小容器,而後讓其餘的容器鏈接進來這個網絡命名空間,而後其餘容器看到的網絡試圖就徹底同樣了。即網絡設備、IP地址、Mac地址等。這就是解決網絡共享的一種解法。在Pod的IP地址就是infra container的IP地址。
這個infra每一個容器啓動的時候都會幫你拉一個infra的小容器能夠在kubelet,conf配置文件能夠看到,這個容器也比較簡單使用go啓動這麼一個容器,來保持一個持久運行的狀態,建立的時候自己都帶一個自身的網絡命名空間,這個裏面不跑任何的程序,可是它主要來維護網絡的命名空間,業務容器實際就是連接到這個網絡命名空間的,而這個命名空間對與用戶是不可見的,好比咱們跑的微服務,使用sidecar模式跑了多個容器,那麼看到的只用到一個podIP,那麼建立的業務容器會連接到這個infra中,好比再建立一個sidecar容器,它都會連接到這裏面,這個IP也都給pause,它有獨立的網絡命名空間,而後kubelet幫它分了一個ip ,也就是get pod -o wide看到的ip ,這個IP全網都是惟一的,因此就能夠訪問這個IP,就能訪問到業務暴露的端口,因此經過這種機制將pod的網絡共享
k8s的pod和容器,pod是一個或者多個容器組成的,可是它的網絡命名空間也是一個,只不過它爲了親密性的應用,增長了一個pod的概念,而docker容器一個容器一個網絡命名空間,他們其實也很少,都是兩個獨立的命名空間,跟上面圖同樣了,宿主機一個網絡命名空間,而後pod1一個網絡命名空間,pod2一個網絡命名空間,它兩個進行通訊,和兩個container進行通訊其實都是同樣的,由於都是兩個network,namespace的通訊,都是經過veth進行轉發過來,交換機從二層轉發過來,訪問也是同樣的。
在 Kubernetes 中,每個 Pod 都有一個真實的 IP 地址,而且每個 Pod 均可以使用此 IP 地址與 其餘 Pod 通訊。
Pod之間通訊會有兩種狀況:
兩個Pod在同一個Node上,也就是兩個服務兩個副本的話,都分佈在node1上面
兩個Pod在不一樣Node上,也就是兩個服務兩個副本的話,都分佈在node1和node2上面
這兩種狀況的數據通訊的流程都是不同的
先看下第一種狀況:兩個Pod在同一個Node上
同節點Pod之間通訊道理與Docker網絡同樣的,以下圖:
對 Pod1 來講,eth0 經過虛擬以太網設備(veth0)鏈接到 root namespace;
網橋 cbr0 中爲 veth0 配置了一個網段。一旦數據包到達網橋,網橋使用ARP 協議解析出其正確的目標網段 veth1;
網橋 cbr0 將數據包發送到 veth1;
數據包到達 veth1 時,被直接轉發到 Pod2 的 network namespace 中的 eth0 網絡設備。
再看下第二種狀況:兩個Pod在不一樣Node上
還有就是兩個pod在不一樣節點,上面那張圖,當pod1出這個這個數據包時,由於兩個pod是在不一樣node上了,兩個不一樣的node至關於兩個不一樣的機器,若是在任何沒有處理的狀況下,這個數據包確定是出不去的,由於訪問的地址是node2上的地址,因此想一想怎麼將這個數據包送出去,因此能送出去就須要第三的網絡組件來實現了,說白了第三方的網絡插件,主要來實現的跨節點網絡之間的通訊,而不是本地容器節點的通訊,由於這個有了,因此不須要它來實現,它主要實現的是怎麼將原始的數據源的數據包發送到目的的eth0口上。
K8S網絡模型要求Pod IP在整個網絡中均可訪問,這種需求是由第三方網絡組件實現。
因此兩個容器進行跨節點的通訊,它是由第三方組件進行轉發的,中間的雲就是第三方組件,無論是由路由方案仍是隧道方案也好,要把node1的包發到指定的目的節點的node上。
三、CNI(容器網絡接口)
在k8s中cni是如今k8s容器網絡接口的規範,自己docker中有個cnm,也是一個網絡標準的,可是那種不太適應與集羣的這種形式,後來結果一些大型的公司作了這麼一個cni的網絡接口的標準
CNI(Container Network Interface,容器網絡接口):是一個容器網絡規範,Kubernetes網絡採用的就是這個CNI規範
CNI實現依賴兩種插件,一種CNI Plugin是負責容器鏈接到主機,而且能爲他分配IP,另外一種就是能爲它這些容器管理IP,就像說兩個pod能不能設置一個IP,因此這個是不行的,都收到這個數據包,誰來響應呀,因此是由IPAM負責配置容器網絡命名空間的網絡,來保證每一個pod分配一個惟一的IP
CNI插件默認路徑: ls /opt/cni/bin/
這個目錄就是爲容器來分配IP的,當kubelet啓動一個pod時,而後來調用這個配置文件來配置網絡
這裏面的二進制文件都是這個地址來提供的,能夠把裏面的包下載下來,在release裏面能夠下載打好的包,這個插件就是來知足各類第三方網絡組件的支持
地址:https://github.com/containernetworking/cni
當你在宿主機上部署Flanneld後,flanneld 啓動後會在每臺宿主機上生成它對應的CNI 配置文件(它實際上是一個 ConfigMap),從而告訴Kubernetes,這個集羣要使用 Flannel 做爲容器網絡方案。
CNI配置文件路徑:
容器網絡的管理也是有配置文件的,這裏面配置就是某一個第三方組件,所管理的配置信息,一些屬性信息cat /etc/cni/net.d/10-flannel.conflist
當 kubelet 組件須要建立 Pod 的時候,先調用dockershim它先建立一個 Infra 容器。而後調用 CNI 插件爲 Infra 容器配置網絡。
這兩個路徑在kubelet啓動參數中定義:
--network-plugin=cni \ 指定cni網絡 --cni-conf-dir=/etc/cni/net.d \ 指定cni配置文件的位置 --cni-bin-dir=/opt/cni/bin 指定cni二進制文件的位置
小結,其實cni存在的意義就在於,讓第三方網絡組件可以更順利的鏈接k8s,由於pod由kubelet去建立的,它建立pod的網絡也是kubelet幫它去分配的,那kubelet這麼去建立的容器呢?kubelet來調用docker的API去實現的,也就是使用dockershim來建立容器,而且也會調用這個二進制文件,而後爲這個容器分配這個網絡,好比分配一個目的ip,有cni就是爲了網絡規範,k8s這塊不能都知足全部的需求,因此它制定了一個規範,只要安裝它的規範來就能接入到k8s的網絡中來,第二個它能結藕組件,也就是都能接入想用的組件均可以,只要知足這個需求,因此的組件都能接入進來。
問題總結:
一、一個局域網內主機A和主機B之間通訊數據包傳輸流程
也就是在一個vlan裏面通訊的流程,首先要檢查本身的ARP緩存表有沒有MAC地址,二層的傳輸是基於Mac地址的,不會考慮哪一個IP是多少,在一個局域網進行通訊首先判斷髮送到的目的地址。
C類網段:192.168.30.0/24首先判斷源ip和目的ip,都是否是在一個網段裏面,這是一個前提在一個局域網進行通訊,也就是原地址發送到主機b這臺,首先要作一個數據包的封裝,由於是在二層,首先要獲取目的的mac地址
1)在本機查找ARP緩存表有沒有二層數據包這個幀所需的mac地址,若是沒有就會發送ARP廣播包,這麼這個主機確定能收到,這個是有根網線進行來鏈接的,那麼交換機收到這個廣播包,會詢問目的主機的mac地址是多少那麼造成這個四元組:源IP,源mac,目的IP,目的mac,若是交換機沒有這個目的的mac那麼就會發送這個局域網內全部主機,由於這個有這個目的ip了,因此目的IP它會響應個人mac地址是多少多少,那麼若是不是,它就會將這個包給丟棄了,那麼響應以後b會發給交換機,交換機再發送給主機a,而後進行封包,主機a就能發送給主機b,那麼這就是一個2層局域網之間的通訊原理。
中間會有一個ARP緩存表,這個表都會在主機a,主機b,交換機去記錄通過二層傳輸的源IP和目的IP對應的mac地址,以便下次再傳輸時,直接使用現有的進行去封裝
那麼若是這個局域網的交換機去發送廣播包,不一樣網段下的主機會不會收到,若是沒有三層交換機是收不到的,若是使用的三層交換機也就是核心交換機,它能夠處理2層的ARP,那麼不一樣網段的交換機也能收到,若是是路由器的話,那天然收不到了,由於路由器下面每個端口,都有一個vlan,路由器隔離了這個廣播包,那麼若是它是一個三層的核心交換機,它能處理二層的還能處理三層的,那麼它是能夠收到的。
二、主機A和主機B不在一個局域網之間通訊數據包傳輸流程
vlan1 192.168.36.0/24 vlan2 192.168.35.0/24
他們是不在一個子網中,那麼這兩個進行去通訊,須要通過路由器了,由於它超過了二層數據包轉發的範圍了,那這種狀況下進行通訊首先也是判斷目標IP是否是在一個子網裏面,若是在一個子網裏面那麼它會發送到本身的默認網關,能夠經過ip route能夠看到
[root@k8s-node2 ~]# ip route default via 10.4.7.1 dev eth0 proto static metric 100 10.4.7.0/24 dev eth0 proto kernel scope link src 10.4.7.21 metric 100 10.244.0.0/24 dev cni0 proto kernel scope link src 10.244.0.1 10.244.1.0/24 via 10.244.1.0 dev flannel.1 onlink 10.244.2.0/24 via 10.244.2.0 dev flannel.1 onlink 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
由於目標ip已經不在一個子網中了,去arp廣播,天然沒辦法響應,仍是丟棄的,仍是沒人響應,就會走默認的網關,10.4.7.1也就是下一跳地址,而後這個數據包就會轉發到這個網關上,而後網關要查看本機的路由表,通常路由表就會記錄一些目的地址還有下一跳地址,而後從哪一個路由表去出
路由表:目的地址。好比192.168.35.0/24,網關 接口,由於下面的信息都知道,因此就沒有下一跳了也就是數據包從vlan1進入二層,再進入核心交換機這裏有兩個口,a口還有b口,a口就是默認的網關,而後查詢路由表這個網段的是從b口出,而後到達交換機到2層,而後到目的的vlan上,這個期間二層也會記錄mac地址。