您好,登錄后才能下訂單哦!
Kubernetes是Google開源的一個容器編排引擎,它支持自動化部署、大規模可伸縮、應用容器化管理。在生產環境中部署一個應用程序時,通常要部署該應用的多個實例以便對應用請求進行負載均衡。
在Kubernetes中,我們可以創建多個容器,每個容器里面運行一個應用實例,然后通過內置的負載均衡策略,實現對這一組應用實例的管理、發現、訪問,而這些細節都不需要運維人員去進行復雜的手工配置和處理。
kubernetes網絡需要解決下面4個問題:
集群內1、公司網絡架構
先看一下這個架構圖,最下面的是我們的服務器,就是我們維護的服務器,要想接入到網絡中,它要經過上面鏈路經過的轉發,像服務器,辦公電腦都是連接的交換機,交換機是一個端口比較多的,然后它處于接入層,然后再往上就是核心的交換機,就是三層的,并且是一些網絡策略,再往上我們需要將我們核心交換機的網絡中的數據轉發到互聯網,它就要通過路由器轉發出去到互聯網,然后到互聯網就可以訪問一些網站,百度,谷歌等,然后其他層面訪問百度服務器,實際互聯網訪問百度服務器,也是通過各個設備,交換機,路由等進行轉發,到達百度,通過這種形式呢,將一些小的獨立的網絡與其他網絡連在一塊,形成一個龐大的整體,這就是互聯網。
大部分分成了以下幾層:
路由器:網絡出口
核心層:主要完成數據高效轉發、鏈路備份等,它是路由器下面核心的入口,下面所有的交換機和服務器最上面的入口,這一層主要是保證高效的轉發下面的數據,但在這一層有時候還會獨立的剝離出一層,也就是在二層交換機上面添加一個匯聚層,匯聚層一般都是完成一些網絡策略,數據包從互聯網來了,然后在三層做一些管控,下面的數據包出現一些,怎么管控,下面可能會劃分很多的vlan,很多虛擬的局域網,一般大型公司都是通過使用三層交換,來劃分多個vlan來實現不能策略的管控,比如說辦公網絡是不通的,要是想通的話,需要申請ecl,公司與機房的網絡也是不通的,這是默認不讓通,也是為了安全著想,然后就是公司與測試機房也是不通的,要是想通也是需要申請ecl,所以這些都是在核心層,匯聚層去管控的,然后在下面接入交換機,這個跟機房的都是一樣的
大部分就是分成三層:接入層--->核心層/匯聚層--->網絡出口
匯聚層:網絡策略、安全、工作站交換機的接入、VLAN之間通信等功能
接入層:工作站的接入
下面我們研究的事是也就是接入層當我們的服務器、pc電腦,如果想到達互聯網它的數據包怎么途徑的去轉發的?
我們還要知道別人訪問我們的服務器,這個數據是怎么來的,還要了解不同區域的局域網之間通信是怎么個流程?
如果在同一個vlan里面,也就是同一個局域網通信它們又是一個怎么樣的通信?
了解這么多問題,那么就要去了解這些網絡設備,第一個就是交換機(switch),第二個就是路由器(router)
在我們學習k8s中,像里面的網絡雖然是看不見摸不著的網絡設備,但是它背后的工作都是這些組成的,只不過這些路由器交換機你是看不到的,你看到的都是服務器上的一些操作,但是背后是怎么出去的,需要我們掌握。
2、交換技術
有想過局域網內主機怎么通信的?主機訪問外網又是怎么通信的?
想要搞懂這些問題得從交換機、路由器講起。
這個是一個華為h4c的交換機,這個是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、pop3、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協議在網橋中都是支持的
3、路由技術
這個也是一個h4c的路由器,里面才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,邊界網關協議)
4、OSI七層模型
OSI(Open System Interconnection)是國際標準化組織(ISO)制定的一個用于計算機或通信系統間互聯的標準體系,一般稱為OSI參考模型或七層模型。
我們經常說的七層和四層的轉發其實就是基于OSI七層模型的體系
從主機a到主機b,經歷了哪些階段經過的處理,這個的話,一般就是通過下面這種方式從主機a的數據到主機b的數據,先進行封裝對這個數據包進行封裝,到4層之后就是一個傳輸層,也就是TCP/UDP的協議,為兩個端系統的會話層之間,提供建立、維護和取消傳輸連接的功能,負責端到端的可靠數據傳輸,在這一層,信息傳送的協議數據單元稱為段或報文,然后到達網絡層,主要定義了能夠標識所有結點的邏輯地址,還定義了路由實現的方式和學習的方式,根據ip的地址的標識進行,一般使用的都是市面的路由器來完成,然后到數據鏈路層,到達交換機,也就是物理地址,通過ARP協議地址解析協議,解析目的mac和源mac地址,加入緩存中,以便下次使用然后到物理層將數據包轉化為計算機可以識別的比特序列,然后一層一層的返回拆開返回到目標主機
5、TCP/UDP協議
TCP(Transmission Control Protocol,傳輸控制協議),面向連接協議,雙方先建立可靠的連接,再發送數據。tcp主要適用于傳輸數據量大,可靠性要求高的應用場景,它設計數據包如果超過了mpu,最大傳輸單元,最大是1500字節,如果數據包超出了1500字節就進行分組,就是在三層這里進行分組,分成很多的小塊進行發布,并且這個組會打成一個序號,這個序號就能保證發送的數據,是不是連續或者損壞,然后重傳,tcp保證來保證數據包的可靠性
UDP(User Data Protocol,用戶數據報協議),面向非連接協議,不與對方建立連接,直接將數據包發送給對方。適用于一次只傳輸少量的數據,可靠性要求低的應用場景。相對TCP傳輸速度快。這個udp沒有三次握手就直接進行發送數據包,但是發包呢,但不能確定你這個包能不能準確接收到,因為沒有ack來返回序列號來確定,這個序列號為1了,我收到這個包,序列號為2了我收到這個包,如果發送一個3沒有收到這個包就會跟你重傳,它設計的也比較簡單,你給我個端口,我就能給你發這個包,不管你收沒收到,不會響應,而且超出最大的傳輸單元之后,也會進行分組,但是不能保證分組的數據包的可靠性,其中有一個包丟了,其它的包就不能做整合了,因為這個數據包跟你分開之后,少了一塊,那么這個數據包就是一個損壞的狀態,對方就收不到了,因為這個數據包丟棄了。
4.2 Kubernetes網絡模型
像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的相通信是一樣的。
1、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,來借助宿主機的網絡訪問外網
2、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 協議解析出其正確的目標網段 veth2;
網橋 cbr0 將數據包發送到 veth2;
數據包到達 veth2 時,被直接轉發到 Pod2 的 network namespace 中的 eth0 網絡設備。
再看下第二種情況:兩個Pod在不同Node上
還有就是兩個pod在不同節點,上面那張圖,當pod1出這個這個數據包時,因為兩個pod是在不同node上了,兩個不同的node相當于兩個不同的機器,如果在任何沒有處理的情況下,這個數據包肯定是出不去的,因為訪問的地址是node2上的地址,所以想想怎么將這個數據包送出去,所以能送出去就需要第三的網絡組件來實現了,說白了第三方的網絡插件,主要來實現的跨節點網絡之間的通信,而不是本地容器節點的通信,因為這個有了,所以不需要它來實現,它主要實現的是怎么將原始的數據源的數據包發送到目的的eth0口上。
K8S網絡模型要求Pod IP在整個網絡中都可訪問,這種需求是由第三方網絡組件實現。
所以兩個容器進行跨節點的通信,它是由第三方組件進行轉發的,中間的云就是第三方組件,不管是由路由方案還是隧道方案也好,要把node1的包發到指定的目的節點的node上。
3、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的網絡中來,第二個它能結藕組件,也就是都能接入想用的組件都可以,只要滿足這個需求,所以的組件都能接入進來。
問題總結:
1、一個局域網內主機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,路由器隔離了這個廣播包,那么如果它是一個三層的核心交換機,它能處理二層的還能處理三層的,那么它是可以收到的。
2、主機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地址。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。