您好,登錄后才能下訂單哦!
Kubernetes是Google開(kāi)源的一個(gè)容器編排引擎,它支持自動(dòng)化部署、大規(guī)??缮炜s、應(yīng)用容器化管理。在生產(chǎn)環(huán)境中部署一個(gè)應(yīng)用程序時(shí),通常要部署該應(yīng)用的多個(gè)實(shí)例以便對(duì)應(yīng)用請(qǐng)求進(jìn)行負(fù)載均衡。
在Kubernetes中,我們可以創(chuàng)建多個(gè)容器,每個(gè)容器里面運(yùn)行一個(gè)應(yīng)用實(shí)例,然后通過(guò)內(nèi)置的負(fù)載均衡策略,實(shí)現(xiàn)對(duì)這一組應(yīng)用實(shí)例的管理、發(fā)現(xiàn)、訪問(wèn),而這些細(xì)節(jié)都不需要運(yùn)維人員去進(jìn)行復(fù)雜的手工配置和處理。
kubernetes網(wǎng)絡(luò)需要解決下面4個(gè)問(wèn)題:
集群內(nèi)1、公司網(wǎng)絡(luò)架構(gòu)
先看一下這個(gè)架構(gòu)圖,最下面的是我們的服務(wù)器,就是我們維護(hù)的服務(wù)器,要想接入到網(wǎng)絡(luò)中,它要經(jīng)過(guò)上面鏈路經(jīng)過(guò)的轉(zhuǎn)發(fā),像服務(wù)器,辦公電腦都是連接的交換機(jī),交換機(jī)是一個(gè)端口比較多的,然后它處于接入層,然后再往上就是核心的交換機(jī),就是三層的,并且是一些網(wǎng)絡(luò)策略,再往上我們需要將我們核心交換機(jī)的網(wǎng)絡(luò)中的數(shù)據(jù)轉(zhuǎn)發(fā)到互聯(lián)網(wǎng),它就要通過(guò)路由器轉(zhuǎn)發(fā)出去到互聯(lián)網(wǎng),然后到互聯(lián)網(wǎng)就可以訪問(wèn)一些網(wǎng)站,百度,谷歌等,然后其他層面訪問(wèn)百度服務(wù)器,實(shí)際互聯(lián)網(wǎng)訪問(wèn)百度服務(wù)器,也是通過(guò)各個(gè)設(shè)備,交換機(jī),路由等進(jìn)行轉(zhuǎn)發(fā),到達(dá)百度,通過(guò)這種形式呢,將一些小的獨(dú)立的網(wǎng)絡(luò)與其他網(wǎng)絡(luò)連在一塊,形成一個(gè)龐大的整體,這就是互聯(lián)網(wǎng)。
大部分分成了以下幾層:
路由器:網(wǎng)絡(luò)出口
核心層:主要完成數(shù)據(jù)高效轉(zhuǎn)發(fā)、鏈路備份等,它是路由器下面核心的入口,下面所有的交換機(jī)和服務(wù)器最上面的入口,這一層主要是保證高效的轉(zhuǎn)發(fā)下面的數(shù)據(jù),但在這一層有時(shí)候還會(huì)獨(dú)立的剝離出一層,也就是在二層交換機(jī)上面添加一個(gè)匯聚層,匯聚層一般都是完成一些網(wǎng)絡(luò)策略,數(shù)據(jù)包從互聯(lián)網(wǎng)來(lái)了,然后在三層做一些管控,下面的數(shù)據(jù)包出現(xiàn)一些,怎么管控,下面可能會(huì)劃分很多的vlan,很多虛擬的局域網(wǎng),一般大型公司都是通過(guò)使用三層交換,來(lái)劃分多個(gè)vlan來(lái)實(shí)現(xiàn)不能策略的管控,比如說(shuō)辦公網(wǎng)絡(luò)是不通的,要是想通的話,需要申請(qǐng)ecl,公司與機(jī)房的網(wǎng)絡(luò)也是不通的,這是默認(rèn)不讓通,也是為了安全著想,然后就是公司與測(cè)試機(jī)房也是不通的,要是想通也是需要申請(qǐng)ecl,所以這些都是在核心層,匯聚層去管控的,然后在下面接入交換機(jī),這個(gè)跟機(jī)房的都是一樣的
大部分就是分成三層:接入層--->核心層/匯聚層--->網(wǎng)絡(luò)出口
匯聚層:網(wǎng)絡(luò)策略、安全、工作站交換機(jī)的接入、VLAN之間通信等功能
接入層:工作站的接入
下面我們研究的事是也就是接入層當(dāng)我們的服務(wù)器、pc電腦,如果想到達(dá)互聯(lián)網(wǎng)它的數(shù)據(jù)包怎么途徑的去轉(zhuǎn)發(fā)的?
我們還要知道別人訪問(wèn)我們的服務(wù)器,這個(gè)數(shù)據(jù)是怎么來(lái)的,還要了解不同區(qū)域的局域網(wǎng)之間通信是怎么個(gè)流程?
如果在同一個(gè)vlan里面,也就是同一個(gè)局域網(wǎng)通信它們又是一個(gè)怎么樣的通信?
了解這么多問(wèn)題,那么就要去了解這些網(wǎng)絡(luò)設(shè)備,第一個(gè)就是交換機(jī)(switch),第二個(gè)就是路由器(router)
在我們學(xué)習(xí)k8s中,像里面的網(wǎng)絡(luò)雖然是看不見(jiàn)摸不著的網(wǎng)絡(luò)設(shè)備,但是它背后的工作都是這些組成的,只不過(guò)這些路由器交換機(jī)你是看不到的,你看到的都是服務(wù)器上的一些操作,但是背后是怎么出去的,需要我們掌握。
2、交換技術(shù)
有想過(guò)局域網(wǎng)內(nèi)主機(jī)怎么通信的?主機(jī)訪問(wèn)外網(wǎng)又是怎么通信的?
想要搞懂這些問(wèn)題得從交換機(jī)、路由器講起。
這個(gè)是一個(gè)華為h4c的交換機(jī),這個(gè)是24口的,也有48口的,所以它的口要相比路由器多很多很多,它主要是為了接入更多的工作站,因?yàn)楣ぷ髡揪陀泻芏嗟膒c電腦了,服務(wù)器,所以多很多,所以它面向的對(duì)象就是一些實(shí)際的計(jì)算機(jī),它涉及的口業(yè)比較多,而路由器它本身的上下級(jí)關(guān)系設(shè)備比較少,一般也就4-5個(gè),這個(gè)交換機(jī)做的用的就是這個(gè)交換技術(shù),我們要了解這個(gè)交換技術(shù)怎么去工作的,通過(guò)局域網(wǎng)內(nèi)主機(jī)怎么通信的?主機(jī)訪問(wèn)外網(wǎng)又是怎么通信的?進(jìn)行出發(fā),去理解這個(gè)交換技術(shù)怎么去工作的
交換機(jī)工作在OSI參考模型的第二層,即數(shù)據(jù)鏈路層。交換機(jī)擁有一條高帶寬的背部總線交換矩陣,在同一時(shí)間可進(jìn)行多個(gè)端口對(duì)之間的數(shù)據(jù)傳輸。
而交換機(jī)又在工作上分為2層和3層,這個(gè)也是指的是OSI中的2層和3層(3層傳輸層,2層數(shù)據(jù)鏈路層)
交換技術(shù)分為2層和3層:
2層:主要用于小型局域網(wǎng),僅支持在數(shù)據(jù)鏈路層轉(zhuǎn)發(fā)數(shù)據(jù),對(duì)工作站接入,這個(gè)也就是基于MAC地址的轉(zhuǎn)發(fā),
3層:三層交換技術(shù)誕生,最初是為了解決廣播域的問(wèn)題,多年發(fā)展,三層交換機(jī)書(shū)已經(jīng)成為構(gòu)建中大型網(wǎng)絡(luò)的主要力量,這個(gè)也就是基于路由器的功能,基于IP,數(shù)據(jù)包進(jìn)行去轉(zhuǎn)發(fā),主要也是解決一個(gè)廣播域的問(wèn)題。
例如有一臺(tái)交換機(jī),下面分別有兩臺(tái)pc,分別為主機(jī)a,和主機(jī)b,現(xiàn)在是主機(jī)a去訪問(wèn)主機(jī)b怎么去通信?
這就不得去了解交換機(jī)怎么去工作的,因?yàn)楸旧砦覀兊膬膳_(tái)pc是物理隔離的,上面有交換機(jī)進(jìn)行連接,它們實(shí)現(xiàn)的通信那么就要去理解交換機(jī)的工作原理。
下面簡(jiǎn)單總結(jié)了OSI模型對(duì)應(yīng)的功能
應(yīng)用層:(各種應(yīng)用程序協(xié)議,如http、ftp、pop3、smtp等)
傳輸層:TCP/UDP (接收上一層的數(shù)據(jù),在必要的時(shí)候把數(shù)據(jù)進(jìn)行分割,并將這些數(shù)據(jù)交給網(wǎng)絡(luò)層,且保證這些數(shù)據(jù)段有效到達(dá)對(duì)端)
網(wǎng)絡(luò)層:IP地址 (控制子網(wǎng)的運(yùn)行,如邏輯編址、分組傳輸、路由選擇) 對(duì)應(yīng)設(shè)備路由器
數(shù)據(jù)鏈路層:MAC地址(物理尋址,也就是機(jī)器上在出廠商留下的編碼,也就是網(wǎng)卡,也是網(wǎng)絡(luò)中唯一的標(biāo)識(shí),同時(shí)將原始比特流轉(zhuǎn)變?yōu)檫壿嫷膫鬏斁€路)對(duì)應(yīng)設(shè)備交換機(jī)
物理層:比特流(機(jī)械、電子、定時(shí)接口通信信道上的原始比特流傳輸)
其實(shí)在交換機(jī)中它是根據(jù)二層的MAC地址進(jìn)行轉(zhuǎn)發(fā)的,mac地址也就是每個(gè)電腦上的網(wǎng)卡,這個(gè)網(wǎng)卡是有一個(gè)物理地址的,也是唯一的,也就是廠商出的時(shí)候,幫你帶出去的,而交換機(jī)就是基于這個(gè)mac地址進(jìn)行轉(zhuǎn)發(fā)通信的,如果主機(jī)a發(fā)送一個(gè)文件到主機(jī)b,要發(fā)給誰(shuí)那么就要涉及到一個(gè)ip地址,也就是相當(dāng)于一個(gè)門(mén)牌號(hào),通過(guò)這個(gè)標(biāo)識(shí)可以找到你,所以必須要知道這個(gè)ip是誰(shuí),但交換機(jī)不會(huì)考慮這個(gè)ip是誰(shuí),因?yàn)樗O(shè)計(jì)原理就是基于Mac地址進(jìn)行尋址的,所以主機(jī)a發(fā)送這個(gè)數(shù)據(jù)包時(shí),必須知道目標(biāo)主機(jī)的mac地址,才能封裝一個(gè)二層的,這個(gè)包稱為幀,那怎么去找的這個(gè)ip呢,本身這個(gè)mac地址就是唯一的,而它的IP是同一個(gè)網(wǎng)段,如果不是一個(gè)網(wǎng)段也不能之間通信了,雖然知道了對(duì)方的ip地址,但是交換機(jī)的工作設(shè)計(jì)是通過(guò)對(duì)方的mac地址進(jìn)行轉(zhuǎn)發(fā)的,因?yàn)樗ぷ魇窃诙?,所以這里還依賴了一個(gè)ARP的協(xié)議,這個(gè)ARP是根據(jù)IP地址獲取物理地址的一個(gè)TCP/IP協(xié)議。主機(jī)發(fā)送信息時(shí)將包含目標(biāo)IP地址的ARP請(qǐng)求廣播到局域網(wǎng)絡(luò)上的所有主機(jī),并接收返回消息,以此確定目標(biāo)的物理地址;收到返回消息后將該IP地址和物理地址存入本機(jī)ARP緩存中并保留一定時(shí)間,下次請(qǐng)求時(shí)直接查詢ARP緩存以節(jié)約資源,完成存檔之后,下次就能直接請(qǐng)求并轉(zhuǎn)發(fā)數(shù)據(jù)包了,那么這就組成了四元組,首先源IP,源mac,目的ip,目的mac,也就是一個(gè)二層的包,這樣就完成一個(gè)數(shù)據(jù)的傳輸。
這期間就會(huì)涉及到一個(gè)廣播域的問(wèn)題,在公司中有一個(gè)大的網(wǎng)絡(luò),而在這個(gè)網(wǎng)絡(luò)中會(huì)劃分為很多的虛擬網(wǎng),比如交換機(jī)下面接了20多臺(tái)主機(jī),如果發(fā)的這個(gè)廣播包,要被其他的攔截了,或者有一些主機(jī)就喜歡發(fā)廣播包,比如沒(méi)有這個(gè)目的地址,比如沒(méi)有這個(gè)1.30這個(gè)主機(jī),那么這個(gè)交換機(jī)找不到一直就廣播,那么就會(huì)產(chǎn)生大量的流量丟失,網(wǎng)絡(luò)延遲,網(wǎng)絡(luò)癱瘓等等,那么為了解決這個(gè)問(wèn)題,可能上百的主機(jī)劃分為小的局域網(wǎng),如果廣播域不劃分的話,那么這個(gè)廣播域遇到一個(gè)找不到的目的mac就會(huì)產(chǎn)生一些不好的因素,如果換成小的局域網(wǎng)的話,只會(huì)影響小部分,也就是vlan,一個(gè)vlan就是一個(gè)廣播域,一個(gè)路由器下的一個(gè)端口就是一個(gè)廣播域,vlan的作用就是將物理環(huán)境邏輯上劃分為不同的局域網(wǎng),而vlan就是隔離這個(gè)廣播域的,路由器也能隔離廣播域,所以路由器下面就是一個(gè)廣播域,如果某個(gè)vlan中出現(xiàn)廣播風(fēng)暴或者arp(arp實(shí)際就是通過(guò)偽造IP地址和MAC地址進(jìn)行欺騙。使以太網(wǎng)數(shù)據(jù)包的源地址、目標(biāo)地址和ARP數(shù)通信量導(dǎo)致網(wǎng)絡(luò)中斷或中間人。ARP主要存在于局域網(wǎng)中。若其中一臺(tái)計(jì)算機(jī)感染ARP病毒。就會(huì)試圖通過(guò)ARP欺騙截獲局域網(wǎng)內(nèi)其他計(jì)算機(jī)的信息,造成局域網(wǎng)內(nèi)的計(jì)算機(jī)通信故障。)就會(huì)影響這個(gè)vlan這個(gè)廣播域中的主機(jī),這也是大型公司網(wǎng)絡(luò)架構(gòu)為什么劃分vlan的原因。
廣播域
交換機(jī)在轉(zhuǎn)發(fā)數(shù)據(jù)時(shí)會(huì)先進(jìn)行廣播,這個(gè)廣播可以發(fā)送的區(qū)域就是一個(gè)廣播域。交換機(jī)之間對(duì)廣播幀是透明的,所以交換機(jī)之間組成的網(wǎng)絡(luò)是一個(gè)廣播域。
路由器的一個(gè)接口下的網(wǎng)絡(luò)是一個(gè)廣播域,所以路由器可以隔離廣播域。
ARP(地址解析協(xié)議,在IPV6中用NDP替代)
發(fā)送這個(gè)廣播幀是由ARP協(xié)議實(shí)現(xiàn),ARP是通過(guò)IP地址獲取物理地址的一個(gè)TCP/IP協(xié)議,主要負(fù)責(zé)將某個(gè)IP地址解析成對(duì)應(yīng)的MAC地址。
三層交換機(jī)
前面講的二層交換機(jī)只工作在數(shù)據(jù)鏈路層,路由器則工作在網(wǎng)絡(luò)層。而功能強(qiáng)大的三層交換機(jī)可同時(shí)工作在數(shù)據(jù)鏈路層和網(wǎng)絡(luò)層,并根據(jù) MAC地址或IP地址轉(zhuǎn)發(fā)數(shù)據(jù)包,而三層的交換機(jī)又支持路由器的功能,路由器是工作在網(wǎng)絡(luò)層,而三層交換機(jī)又集成了二層和三層,所以叫做三層交換機(jī),當(dāng)我們把二層交換機(jī)換成3層的之后,就能實(shí)現(xiàn)不同vlan之間的通信了,不同vlan也就是隔離的局域網(wǎng),然后使用二層的話是過(guò)不去的,因?yàn)檫@個(gè)不在同一個(gè)網(wǎng)段了,這個(gè)廣播包也散不到這一塊了,那只有走路由表的形式轉(zhuǎn)發(fā)出去,但是三層的交換機(jī)不能替代路由的功能,因?yàn)槿龑咏粨Q機(jī)設(shè)計(jì)之初就是來(lái)解決不同vlan不能局域網(wǎng)之間的廣播域的問(wèn)題,經(jīng)過(guò)多年的時(shí)間,三層也不僅僅只做這一塊,還會(huì)做一些網(wǎng)絡(luò)策略之類(lèi)的,安全之類(lèi)的,比較成熟了。
網(wǎng)橋
網(wǎng)橋(Bridge)是早期的兩端口二層網(wǎng)絡(luò)設(shè)備,用來(lái)連接不同網(wǎng)段。網(wǎng)橋的兩個(gè)端口分別有一條獨(dú)立的交換信道,不是共享一條背板總線,可隔離沖突域。網(wǎng)橋比集線器(Hub)性能更好,集線器上各端口都是共享同一條背板總線的。后來(lái),網(wǎng)橋被具有更多端口、同時(shí)也可隔離沖突域的交換機(jī)(Switch)所取代。
VLAN(Virtual Local Area Network):虛擬局域網(wǎng)
VLAN是一種將局域網(wǎng)設(shè)備從邏輯上劃分成一個(gè)個(gè)網(wǎng)段。
一個(gè)VLAN就是一個(gè)廣播域,VLAN之間的通信是通過(guò)第3層的路由器來(lái)完成的。VLAN應(yīng)用非常廣泛,基本上大部分網(wǎng)絡(luò)項(xiàng)目都會(huì)劃分vlan。
VLAN的主要好處:
分割廣播域,減少?gòu)V播風(fēng)暴影響范圍。
提高網(wǎng)絡(luò)安全性,根據(jù)不同的部門(mén)、用途、應(yīng)用劃分不同網(wǎng)段
其實(shí)剛才說(shuō)道arp緩存表,廣播的時(shí)候,會(huì)收到一份目的的mac地址表,然后緩存再留一份,其實(shí)這個(gè)是通過(guò)命令行也能看到的
用arp -a 就能看到,而緩存表也是為了,下次再去發(fā)送數(shù)據(jù)包的時(shí)候,不用再去廣播目的mac來(lái),它會(huì)先從自己的緩存表去找有沒(méi)有對(duì)應(yīng)的目的mac表,有的話就直接轉(zhuǎn)發(fā)數(shù)據(jù)包,但是這個(gè)表也有保留時(shí)間,如果這個(gè)表不活躍了也就沒(méi)了。
在k8s中一臺(tái)中容器是怎么通信的,就是通過(guò)ARP協(xié)議,跟交換機(jī)原理一樣,因?yàn)樗芯W(wǎng)橋也就是一個(gè)交換機(jī)的角色進(jìn)行來(lái)實(shí)現(xiàn)的,ARP協(xié)議在網(wǎng)橋中都是支持的
3、路由技術(shù)
這個(gè)也是一個(gè)h4c的路由器,里面才6個(gè)口,但是這個(gè)口一般分為2個(gè)角色,當(dāng)然除了一個(gè)console管理口,一個(gè)是LAN口一個(gè)是WAN口,
路由器主要分為兩個(gè)端口類(lèi)型:LAN口和WAN口
WAN口:配置公網(wǎng)IP,接入到互聯(lián)網(wǎng),轉(zhuǎn)發(fā)來(lái)自LAN口的IP數(shù)據(jù)包。
LAN口:配置內(nèi)網(wǎng)IP(網(wǎng)關(guān)),連接內(nèi)部交換機(jī),對(duì)接的是工作機(jī),工作站。
那么這里又出現(xiàn)了一個(gè)公網(wǎng)IP和內(nèi)網(wǎng)IP,wan口肯定需要配置一個(gè)公網(wǎng)ip的,它好讓下面的機(jī)器出去能夠訪問(wèn)外網(wǎng),那么本身互聯(lián)網(wǎng)就一個(gè)內(nèi)網(wǎng)的IP怎么才能連接到互聯(lián)網(wǎng)呢,那么就是需要一個(gè)互聯(lián)網(wǎng)上互相信任的公網(wǎng)ip ,公網(wǎng)就是互聯(lián)網(wǎng)可見(jiàn)的,其他人都可以隨意的訪問(wèn)這個(gè)IP,那么內(nèi)網(wǎng)IP呢,只有內(nèi)部局域網(wǎng)之間訪問(wèn),就像機(jī)房的服務(wù)器一樣,有兩個(gè)網(wǎng)卡,一個(gè)是內(nèi)網(wǎng)一個(gè)是公網(wǎng),外網(wǎng)IP是配置的公網(wǎng),內(nèi)網(wǎng)是配置的內(nèi)網(wǎng)IP,出外網(wǎng)肯定需要走公網(wǎng)網(wǎng)卡。
路由器是連接兩個(gè)或多個(gè)網(wǎng)絡(luò)的硬件設(shè)備,將從端口上接收的數(shù)據(jù)包,根據(jù)數(shù)據(jù)包的目的地址智能轉(zhuǎn)發(fā)出去。
路由器的功能:
路由
轉(zhuǎn)發(fā)
隔離子網(wǎng)
隔離廣播域
路由器是互聯(lián)網(wǎng)的樞紐,是連接互聯(lián)網(wǎng)中各個(gè)局域網(wǎng)、廣域網(wǎng)的設(shè)備,相比交換機(jī)來(lái)說(shuō),路由器的數(shù)據(jù)轉(zhuǎn)發(fā)很復(fù)雜,它會(huì)根據(jù)目的地址給出一條最優(yōu)的路徑。那么路徑信息的來(lái)源有兩種:動(dòng)態(tài)路由和靜態(tài)路由。
就是說(shuō)公司的網(wǎng)絡(luò)怎么到互聯(lián)網(wǎng)呢,就是說(shuō)互聯(lián)網(wǎng)的用戶怎么訪問(wèn)我們的服務(wù)呢,都是通過(guò)路由器轉(zhuǎn)發(fā),而交換機(jī)只做局域網(wǎng)之間數(shù)據(jù)包的轉(zhuǎn)發(fā),也就是能在二層通過(guò)MAC地址,能發(fā)廣播包的環(huán)境下才可以轉(zhuǎn)發(fā)這個(gè)數(shù)據(jù)包,但是路由器的轉(zhuǎn)發(fā)比較復(fù)雜,它去轉(zhuǎn)發(fā)它會(huì)考慮哪個(gè)路徑比較好,最優(yōu)的路徑,走最近的路,也就是路由器會(huì)做這么一個(gè)事,而這個(gè)路徑分為兩個(gè)一個(gè)為靜態(tài)一個(gè)為動(dòng)態(tài)。
靜態(tài)路由:指人工手動(dòng)指定到目標(biāo)主機(jī)的地址然后記錄在路由表中,如果其中某個(gè)節(jié)點(diǎn)不可用則需要重新指定,手動(dòng)的可能就像在你的linux服務(wù)器上或者路由器上手動(dòng)去添加路由表,這個(gè)路由我應(yīng)該轉(zhuǎn)發(fā)給誰(shuí),下一跳是誰(shuí),當(dāng)下一跳不能用了,那么這個(gè)數(shù)據(jù)包在這個(gè)路由器就不能用了,下一跳轉(zhuǎn)發(fā)不過(guò)去就丟棄了,數(shù)據(jù)包過(guò)不去,訪問(wèn)自然就是不可達(dá)網(wǎng)絡(luò)。
動(dòng)態(tài)路由:則是路由器根據(jù)動(dòng)態(tài)路由協(xié)議自動(dòng)計(jì)算出路徑永久可用,能實(shí)時(shí)地適應(yīng)網(wǎng)絡(luò)結(jié)構(gòu)的變化。
常用的動(dòng)態(tài)路由協(xié)議:
RIP( Routing Information Protocol ,路由信息協(xié)議)
OSPF(Open Shortest Path First,開(kāi)放式最短路徑優(yōu)先)
BGP(Border Gateway Protocol,邊界網(wǎng)關(guān)協(xié)議)
4、OSI七層模型
OSI(Open System Interconnection)是國(guó)際標(biāo)準(zhǔn)化組織(ISO)制定的一個(gè)用于計(jì)算機(jī)或通信系統(tǒng)間互聯(lián)的標(biāo)準(zhǔn)體系,一般稱為OSI參考模型或七層模型。
我們經(jīng)常說(shuō)的七層和四層的轉(zhuǎn)發(fā)其實(shí)就是基于OSI七層模型的體系
從主機(jī)a到主機(jī)b,經(jīng)歷了哪些階段經(jīng)過(guò)的處理,這個(gè)的話,一般就是通過(guò)下面這種方式從主機(jī)a的數(shù)據(jù)到主機(jī)b的數(shù)據(jù),先進(jìn)行封裝對(duì)這個(gè)數(shù)據(jù)包進(jìn)行封裝,到4層之后就是一個(gè)傳輸層,也就是TCP/UDP的協(xié)議,為兩個(gè)端系統(tǒng)的會(huì)話層之間,提供建立、維護(hù)和取消傳輸連接的功能,負(fù)責(zé)端到端的可靠數(shù)據(jù)傳輸,在這一層,信息傳送的協(xié)議數(shù)據(jù)單元稱為段或報(bào)文,然后到達(dá)網(wǎng)絡(luò)層,主要定義了能夠標(biāo)識(shí)所有結(jié)點(diǎn)的邏輯地址,還定義了路由實(shí)現(xiàn)的方式和學(xué)習(xí)的方式,根據(jù)ip的地址的標(biāo)識(shí)進(jìn)行,一般使用的都是市面的路由器來(lái)完成,然后到數(shù)據(jù)鏈路層,到達(dá)交換機(jī),也就是物理地址,通過(guò)ARP協(xié)議地址解析協(xié)議,解析目的mac和源mac地址,加入緩存中,以便下次使用然后到物理層將數(shù)據(jù)包轉(zhuǎn)化為計(jì)算機(jī)可以識(shí)別的比特序列,然后一層一層的返回拆開(kāi)返回到目標(biāo)主機(jī)
5、TCP/UDP協(xié)議
TCP(Transmission Control Protocol,傳輸控制協(xié)議),面向連接協(xié)議,雙方先建立可靠的連接,再發(fā)送數(shù)據(jù)。tcp主要適用于傳輸數(shù)據(jù)量大,可靠性要求高的應(yīng)用場(chǎng)景,它設(shè)計(jì)數(shù)據(jù)包如果超過(guò)了mpu,最大傳輸單元,最大是1500字節(jié),如果數(shù)據(jù)包超出了1500字節(jié)就進(jìn)行分組,就是在三層這里進(jìn)行分組,分成很多的小塊進(jìn)行發(fā)布,并且這個(gè)組會(huì)打成一個(gè)序號(hào),這個(gè)序號(hào)就能保證發(fā)送的數(shù)據(jù),是不是連續(xù)或者損壞,然后重傳,tcp保證來(lái)保證數(shù)據(jù)包的可靠性
UDP(User Data Protocol,用戶數(shù)據(jù)報(bào)協(xié)議),面向非連接協(xié)議,不與對(duì)方建立連接,直接將數(shù)據(jù)包發(fā)送給對(duì)方。適用于一次只傳輸少量的數(shù)據(jù),可靠性要求低的應(yīng)用場(chǎng)景。相對(duì)TCP傳輸速度快。這個(gè)udp沒(méi)有三次握手就直接進(jìn)行發(fā)送數(shù)據(jù)包,但是發(fā)包呢,但不能確定你這個(gè)包能不能準(zhǔn)確接收到,因?yàn)闆](méi)有ack來(lái)返回序列號(hào)來(lái)確定,這個(gè)序列號(hào)為1了,我收到這個(gè)包,序列號(hào)為2了我收到這個(gè)包,如果發(fā)送一個(gè)3沒(méi)有收到這個(gè)包就會(huì)跟你重傳,它設(shè)計(jì)的也比較簡(jiǎn)單,你給我個(gè)端口,我就能給你發(fā)這個(gè)包,不管你收沒(méi)收到,不會(huì)響應(yīng),而且超出最大的傳輸單元之后,也會(huì)進(jìn)行分組,但是不能保證分組的數(shù)據(jù)包的可靠性,其中有一個(gè)包丟了,其它的包就不能做整合了,因?yàn)檫@個(gè)數(shù)據(jù)包跟你分開(kāi)之后,少了一塊,那么這個(gè)數(shù)據(jù)包就是一個(gè)損壞的狀態(tài),對(duì)方就收不到了,因?yàn)檫@個(gè)數(shù)據(jù)包丟棄了。
4.2 Kubernetes網(wǎng)絡(luò)模型
像flannel和calico網(wǎng)絡(luò)插件都有一定的要求,怎么接入到k8s里面必須滿足這些要求,也就是都滿足這些要求才能被第三方網(wǎng)絡(luò)插件支持
Kubernetes 要求所有的網(wǎng)絡(luò)插件實(shí)現(xiàn)必須滿足如下要求:
一個(gè)Pod一個(gè)IP。 這個(gè)是必須的,一個(gè)pod可以與節(jié)點(diǎn)上的所有pod可以通信,就是直接可以訪問(wèn)的,不需要nginx代理
所有的 Pod 可以與任何其他 Pod 直接通信,無(wú)需使用 NAT 映射。 k8s的所有節(jié)點(diǎn)都可以訪問(wèn)這個(gè)pod,這個(gè)首先是在蘇主機(jī)出發(fā)可以訪問(wèn)到所有的pod
所有節(jié)點(diǎn)可以與所有 Pod 直接通信,無(wú)需使用 NAT 映射
Pod 內(nèi)部獲取到的 IP 地址與其他 Pod 或節(jié)點(diǎn)與其通信時(shí)的 IP 地址是同一個(gè)。
在同一個(gè)節(jié)點(diǎn)docker的網(wǎng)絡(luò)是什么樣的?要了解pod在同一個(gè)節(jié)點(diǎn)與同一個(gè)節(jié)點(diǎn)的通信,可以先從docker的網(wǎng)絡(luò)模型先去理解,這個(gè)跟pod與pod的相通信是一樣的。
1、Docker容器網(wǎng)絡(luò)模型
先看下Linux網(wǎng)絡(luò)名詞:
也就是安裝好一個(gè)linux主機(jī)之后,會(huì)創(chuàng)建一個(gè)網(wǎng)絡(luò)命名空間也就是所有的進(jìn)程都在這個(gè)網(wǎng)絡(luò)命名空間里面,所以都可以在這個(gè)linux中訪問(wèn)這個(gè)網(wǎng)絡(luò),但是這個(gè)docker利用這個(gè)大的網(wǎng)絡(luò)命名空間進(jìn)行了隔離,也就是一個(gè)容器也就是一個(gè)網(wǎng)絡(luò)命名空間,所以在宿主上看不到也訪問(wèn)不到某個(gè)容器的網(wǎng)絡(luò)的,是看不到的,而容器之間也看不到對(duì)方的網(wǎng)絡(luò)的,所以容器使用的namespace給容器做的網(wǎng)絡(luò)的隔離,然后容器還有個(gè)問(wèn)題
也就是容器已經(jīng)都有自己的命名空間了,容器與宿主機(jī)也是隔離的,我的數(shù)據(jù)包是怎么出去的,所以這里就用到了這個(gè)設(shè)備對(duì)veth
網(wǎng)絡(luò)的命名空間:Linux在網(wǎng)絡(luò)棧中引入網(wǎng)絡(luò)命名空間,將獨(dú)立的網(wǎng)絡(luò)協(xié)議棧隔離到不同的命令空間中,彼此間無(wú)法通信;Docker利用這一特性,實(shí)現(xiàn)不同容器間的網(wǎng)絡(luò)隔離。
Veth設(shè)備對(duì):Veth設(shè)備對(duì)的引入是為了實(shí)現(xiàn)在不同網(wǎng)絡(luò)命名空間的通信。這個(gè)設(shè)備對(duì)相當(dāng)于一個(gè)網(wǎng)線一樣,容器的網(wǎng)絡(luò)命名空間與宿主機(jī)上的命名空間,宿主機(jī)的命名空間為root,現(xiàn)在想讓containers的命名空間與宿主機(jī)的命名空間進(jìn)行通信的話,所以會(huì)用到這個(gè)veth的這個(gè)設(shè)備對(duì),這個(gè)網(wǎng)線,讓容器的命名空間接入到宿主機(jī)的命名空間中,當(dāng)在k8s中起個(gè)pod時(shí),當(dāng)使用docker起個(gè)容器時(shí),用ifconfig會(huì)看到很多veth的很多設(shè)備,其實(shí)這就是另一端,可以說(shuō)是水晶頭的另一頭,容器本身就有一個(gè)自己虛擬的網(wǎng)絡(luò),它想出去只有借助宿主機(jī)的網(wǎng)絡(luò)出去,因?yàn)楸旧砭褪窃谒拗鳈C(jī)上的一個(gè)藏著的網(wǎng)絡(luò),它要想出去還得通過(guò)宿主機(jī),所以它有這個(gè)設(shè)備對(duì)就能完成數(shù)據(jù)的轉(zhuǎn)發(fā)。
Iptables/Netfilter:Docker使用Netfilter實(shí)現(xiàn)容器網(wǎng)絡(luò)轉(zhuǎn)發(fā)。要是docker要想上網(wǎng),雖然有了容器與宿主機(jī)網(wǎng)絡(luò)命名空間的這么一個(gè)數(shù)據(jù)包過(guò)來(lái),但是它怎么通過(guò)宿主機(jī)的網(wǎng)絡(luò)訪問(wèn)到外部的網(wǎng)絡(luò)呢,所以它用到了netfilter,它的linux的一個(gè)IP包的過(guò)濾機(jī)制,然后來(lái)實(shí)現(xiàn)容器之間的網(wǎng)絡(luò)的轉(zhuǎn)發(fā),容器到達(dá)宿主機(jī),而veth這個(gè)口實(shí)際是接入了網(wǎng)橋中,然后可以這么想象,每個(gè)容器就是一個(gè)電腦,交換機(jī)就是一個(gè)網(wǎng)橋,可以通過(guò)命令看到另一端,能看一下這個(gè)網(wǎng)橋加入了哪些網(wǎng)線,這個(gè)交換機(jī)下面有哪些主機(jī),通過(guò)這個(gè)命令可以看出跟交換機(jī)的原理差不多,通過(guò)arp協(xié)議獲取mac地址,也就是封裝二層數(shù)據(jù)包這個(gè)幀包,然后之間在二層進(jìn)行轉(zhuǎn)發(fā)的,但是它要訪問(wèn)外網(wǎng)又需要iptables的snat dnat,根據(jù)原地址目標(biāo)地址轉(zhuǎn)發(fā)外網(wǎng)
[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
網(wǎng)橋:網(wǎng)橋是一個(gè)二層網(wǎng)絡(luò)設(shè)備,通過(guò)網(wǎng)橋可以將Linux支持的不同的端口連接起來(lái),并實(shí)現(xiàn)類(lèi)似交換機(jī)那樣的多對(duì)多的通信。這個(gè)可以通過(guò)ifconfig可以看到docker0的網(wǎng)橋,這個(gè)網(wǎng)橋是docker創(chuàng)建容器也就是讓它加入到這個(gè)交換機(jī)里面實(shí)現(xiàn)相互的訪問(wèn)了。
路由:Linux系統(tǒng)包含一個(gè)完整的路由功能,當(dāng)IP層在處理數(shù)據(jù)發(fā)送或轉(zhuǎn)發(fā)的時(shí)候,會(huì)使用路由表來(lái)決定發(fā)往哪里。這個(gè)呢會(huì)遇到也就是用到第三方插件的時(shí)候,會(huì)出現(xiàn)很多的路由表來(lái)實(shí)現(xiàn)容器之間的通信
Docker容器網(wǎng)絡(luò)示意圖如下:
這個(gè)就是容器網(wǎng)絡(luò)的示意圖,每個(gè)容器都有一個(gè)veth的設(shè)備對(duì),也就是部署一個(gè)pod后會(huì)出現(xiàn)這個(gè)一個(gè)設(shè)備對(duì)來(lái)連接宿主機(jī)的命名空間,這個(gè)對(duì)一頭是網(wǎng)線一頭是網(wǎng)橋,也就是eth0(docker0),如果他們通信的話,直接走二層廣播包協(xié)議封包就能實(shí)現(xiàn)網(wǎng)絡(luò)的轉(zhuǎn)發(fā)了,它想出去就通過(guò)iptables的nat,來(lái)借助宿主機(jī)的網(wǎng)絡(luò)訪問(wèn)外網(wǎng)
2、Pod 網(wǎng)絡(luò)
問(wèn)題:Pod是K8S最小調(diào)度單元,一個(gè)Pod由一個(gè)容器或多個(gè)容器組成,當(dāng)多個(gè)容器時(shí),怎么都用這一個(gè)Pod IP?
就是我這個(gè)pod中不管有多少個(gè)容器只能用這一個(gè)ip通信,這也是它設(shè)計(jì)pod的意義
實(shí)現(xiàn):k8s會(huì)在每個(gè)Pod里先啟動(dòng)一個(gè)infra container小容器,然后讓其他的容器連接進(jìn)來(lái)這個(gè)網(wǎng)絡(luò)命名空間,然后其他容器看到的網(wǎng)絡(luò)試圖就完全一樣了。即網(wǎng)絡(luò)設(shè)備、IP地址、Mac地址等。這就是解決網(wǎng)絡(luò)共享的一種解法。在Pod的IP地址就是infra container的IP地址。
這個(gè)infra每個(gè)容器啟動(dòng)的時(shí)候都會(huì)幫你拉一個(gè)infra的小容器可以在kubelet,conf配置文件可以看到,這個(gè)容器也比較簡(jiǎn)單使用go啟動(dòng)這么一個(gè)容器,來(lái)保持一個(gè)持久運(yùn)行的狀態(tài),創(chuàng)建的時(shí)候本身都帶一個(gè)自身的網(wǎng)絡(luò)命名空間,這個(gè)里面不跑任何的程序,但是它主要來(lái)維護(hù)網(wǎng)絡(luò)的命名空間,業(yè)務(wù)容器實(shí)際就是鏈接到這個(gè)網(wǎng)絡(luò)命名空間的,而這個(gè)命名空間對(duì)與用戶是不可見(jiàn)的,比如我們跑的微服務(wù),使用sidecar模式跑了多個(gè)容器,那么看到的只用到一個(gè)podIP,那么創(chuàng)建的業(yè)務(wù)容器會(huì)鏈接到這個(gè)infra中,比如再創(chuàng)建一個(gè)sidecar容器,它都會(huì)鏈接到這里面,這個(gè)IP也都給pause,它有獨(dú)立的網(wǎng)絡(luò)命名空間,然后kubelet幫它分了一個(gè)ip ,也就是get pod -o wide看到的ip ,這個(gè)IP全網(wǎng)都是唯一的,所以就可以訪問(wèn)這個(gè)IP,就能訪問(wèn)到業(yè)務(wù)暴露的端口,所以通過(guò)這種機(jī)制將pod的網(wǎng)絡(luò)共享
k8s的pod和容器,pod是一個(gè)或者多個(gè)容器組成的,但是它的網(wǎng)絡(luò)命名空間也是一個(gè),只不過(guò)它為了親密性的應(yīng)用,增加了一個(gè)pod的概念,而docker容器一個(gè)容器一個(gè)網(wǎng)絡(luò)命名空間,他們其實(shí)也不多,都是兩個(gè)獨(dú)立的命名空間,跟上面圖一樣了,宿主機(jī)一個(gè)網(wǎng)絡(luò)命名空間,然后pod1一個(gè)網(wǎng)絡(luò)命名空間,pod2一個(gè)網(wǎng)絡(luò)命名空間,它兩個(gè)進(jìn)行通信,和兩個(gè)container進(jìn)行通信其實(shí)都是一樣的,因?yàn)槎际莾蓚€(gè)network,namespace的通信,都是通過(guò)veth進(jìn)行轉(zhuǎn)發(fā)過(guò)來(lái),交換機(jī)從二層轉(zhuǎn)發(fā)過(guò)來(lái),訪問(wèn)也是一樣的。
在 Kubernetes 中,每一個(gè) Pod 都有一個(gè)真實(shí)的 IP 地址,并且每一個(gè) Pod 都可以使用此 IP 地址與 其他 Pod 通信。
Pod之間通信會(huì)有兩種情況:
兩個(gè)Pod在同一個(gè)Node上,也就是兩個(gè)服務(wù)兩個(gè)副本的話,都分布在node1上面
兩個(gè)Pod在不同Node上,也就是兩個(gè)服務(wù)兩個(gè)副本的話,都分布在node1和node2上面
這兩種情況的數(shù)據(jù)通信的流程都是不一樣的
先看下第一種情況:兩個(gè)Pod在同一個(gè)Node上
同節(jié)點(diǎn)Pod之間通信道理與Docker網(wǎng)絡(luò)一樣的,如下圖:
對(duì) Pod1 來(lái)說(shuō),eth0 通過(guò)虛擬以太網(wǎng)設(shè)備(veth0)連接到 root namespace;
網(wǎng)橋 cbr0 中為 veth0 配置了一個(gè)網(wǎng)段。一旦數(shù)據(jù)包到達(dá)網(wǎng)橋,網(wǎng)橋使用ARP 協(xié)議解析出其正確的目標(biāo)網(wǎng)段 veth2;
網(wǎng)橋 cbr0 將數(shù)據(jù)包發(fā)送到 veth2;
數(shù)據(jù)包到達(dá) veth2 時(shí),被直接轉(zhuǎn)發(fā)到 Pod2 的 network namespace 中的 eth0 網(wǎng)絡(luò)設(shè)備。
再看下第二種情況:兩個(gè)Pod在不同Node上
還有就是兩個(gè)pod在不同節(jié)點(diǎn),上面那張圖,當(dāng)pod1出這個(gè)這個(gè)數(shù)據(jù)包時(shí),因?yàn)閮蓚€(gè)pod是在不同node上了,兩個(gè)不同的node相當(dāng)于兩個(gè)不同的機(jī)器,如果在任何沒(méi)有處理的情況下,這個(gè)數(shù)據(jù)包肯定是出不去的,因?yàn)樵L問(wèn)的地址是node2上的地址,所以想想怎么將這個(gè)數(shù)據(jù)包送出去,所以能送出去就需要第三的網(wǎng)絡(luò)組件來(lái)實(shí)現(xiàn)了,說(shuō)白了第三方的網(wǎng)絡(luò)插件,主要來(lái)實(shí)現(xiàn)的跨節(jié)點(diǎn)網(wǎng)絡(luò)之間的通信,而不是本地容器節(jié)點(diǎn)的通信,因?yàn)檫@個(gè)有了,所以不需要它來(lái)實(shí)現(xiàn),它主要實(shí)現(xiàn)的是怎么將原始的數(shù)據(jù)源的數(shù)據(jù)包發(fā)送到目的的eth0口上。
K8S網(wǎng)絡(luò)模型要求Pod IP在整個(gè)網(wǎng)絡(luò)中都可訪問(wèn),這種需求是由第三方網(wǎng)絡(luò)組件實(shí)現(xiàn)。
所以兩個(gè)容器進(jìn)行跨節(jié)點(diǎn)的通信,它是由第三方組件進(jìn)行轉(zhuǎn)發(fā)的,中間的云就是第三方組件,不管是由路由方案還是隧道方案也好,要把node1的包發(fā)到指定的目的節(jié)點(diǎn)的node上。
3、CNI(容器網(wǎng)絡(luò)接口)
在k8s中cni是現(xiàn)在k8s容器網(wǎng)絡(luò)接口的規(guī)范,本身docker中有個(gè)cnm,也是一個(gè)網(wǎng)絡(luò)標(biāo)準(zhǔn)的,但是那種不太適應(yīng)與集群的這種形式,后來(lái)結(jié)果一些大型的公司做了這么一個(gè)cni的網(wǎng)絡(luò)接口的標(biāo)準(zhǔn)
CNI(Container Network Interface,容器網(wǎng)絡(luò)接口):是一個(gè)容器網(wǎng)絡(luò)規(guī)范,Kubernetes網(wǎng)絡(luò)采用的就是這個(gè)CNI規(guī)范
CNI實(shí)現(xiàn)依賴兩種插件,一種CNI Plugin是負(fù)責(zé)容器連接到主機(jī),并且能為他分配IP,另一種就是能為它這些容器管理IP,就像說(shuō)兩個(gè)pod能不能設(shè)置一個(gè)IP,所以這個(gè)是不行的,都收到這個(gè)數(shù)據(jù)包,誰(shuí)來(lái)響應(yīng)呀,所以是由IPAM負(fù)責(zé)配置容器網(wǎng)絡(luò)命名空間的網(wǎng)絡(luò),來(lái)保證每個(gè)pod分配一個(gè)唯一的IP
CNI插件默認(rèn)路徑:
ls /opt/cni/bin/
這個(gè)目錄就是為容器來(lái)分配IP的,當(dāng)kubelet啟動(dòng)一個(gè)pod時(shí),然后來(lái)調(diào)用這個(gè)配置文件來(lái)配置網(wǎng)絡(luò)
這里面的二進(jìn)制文件都是這個(gè)地址來(lái)提供的,可以把里面的包下載下來(lái),在release里面可以下載打好的包,這個(gè)插件就是來(lái)滿足各種第三方網(wǎng)絡(luò)組件的支持
地址:https://github.com/containernetworking/cni
當(dāng)你在宿主機(jī)上部署Flanneld后,flanneld 啟動(dòng)后會(huì)在每臺(tái)宿主機(jī)上生成它對(duì)應(yīng)的CNI 配置文件(它其實(shí)是一個(gè) ConfigMap),從而告訴Kubernetes,這個(gè)集群要使用 Flannel 作為容器網(wǎng)絡(luò)方案。
CNI配置文件路徑:
容器網(wǎng)絡(luò)的管理也是有配置文件的,這里面配置就是某一個(gè)第三方組件,所管理的配置信息,一些屬性信息cat /etc/cni/net.d/10-flannel.conflist
當(dāng) kubelet 組件需要?jiǎng)?chuàng)建 Pod 的時(shí)候,先調(diào)用dockershim它先創(chuàng)建一個(gè) Infra 容器。然后調(diào)用 CNI 插件為 Infra 容器配置網(wǎng)絡(luò)。
這兩個(gè)路徑在kubelet啟動(dòng)參數(shù)中定義:
--network-plugin=cni \ 指定cni網(wǎng)絡(luò)
--cni-conf-dir=/etc/cni/net.d \ 指定cni配置文件的位置
--cni-bin-dir=/opt/cni/bin 指定cni二進(jìn)制文件的位置
小結(jié),其實(shí)cni存在的意義就在于,讓第三方網(wǎng)絡(luò)組件能夠更順利的連接k8s,因?yàn)閜od由kubelet去創(chuàng)建的,它創(chuàng)建pod的網(wǎng)絡(luò)也是kubelet幫它去分配的,那kubelet這么去創(chuàng)建的容器呢?kubelet來(lái)調(diào)用docker的API去實(shí)現(xiàn)的,也就是使用dockershim來(lái)創(chuàng)建容器,并且也會(huì)調(diào)用這個(gè)二進(jìn)制文件,然后為這個(gè)容器分配這個(gè)網(wǎng)絡(luò),比如分配一個(gè)目的ip,有cni就是為了網(wǎng)絡(luò)規(guī)范,k8s這塊不能都滿足所有的需求,所以它制定了一個(gè)規(guī)范,只要安裝它的規(guī)范來(lái)就能接入到k8s的網(wǎng)絡(luò)中來(lái),第二個(gè)它能結(jié)藕組件,也就是都能接入想用的組件都可以,只要滿足這個(gè)需求,所以的組件都能接入進(jìn)來(lái)。
問(wèn)題總結(jié):
1、一個(gè)局域網(wǎng)內(nèi)主機(jī)A和主機(jī)B之間通信數(shù)據(jù)包傳輸流程
也就是在一個(gè)vlan里面通信的流程,首先要檢查自己的ARP緩存表有沒(méi)有MAC地址,二層的傳輸是基于Mac地址的,不會(huì)考慮哪個(gè)IP是多少,在一個(gè)局域網(wǎng)進(jìn)行通信首先判斷發(fā)送到的目的地址。
C類(lèi)網(wǎng)段:192.168.30.0/24首先判斷源ip和目的ip,都是不是在一個(gè)網(wǎng)段里面,這是一個(gè)前提在一個(gè)局域網(wǎng)進(jìn)行通信,也就是原地址發(fā)送到主機(jī)b這臺(tái),首先要做一個(gè)數(shù)據(jù)包的封裝,因?yàn)槭窃诙?,首先要獲取目的的mac地址
1)在本機(jī)查找ARP緩存表有沒(méi)有二層數(shù)據(jù)包這個(gè)幀所需的mac地址,如果沒(méi)有就會(huì)發(fā)送ARP廣播包,這么這個(gè)主機(jī)肯定能收到,這個(gè)是有根網(wǎng)線進(jìn)行來(lái)連接的,那么交換機(jī)收到這個(gè)廣播包,會(huì)詢問(wèn)目的主機(jī)的mac地址是多少那么形成這個(gè)四元組:源IP,源mac,目的IP,目的mac,如果交換機(jī)沒(méi)有這個(gè)目的的mac那么就會(huì)發(fā)送這個(gè)局域網(wǎng)內(nèi)所有主機(jī),因?yàn)檫@個(gè)有這個(gè)目的ip了,所以目的IP它會(huì)響應(yīng)我的mac地址是多少多少,那么如果不是,它就會(huì)將這個(gè)包給丟棄了,那么響應(yīng)之后b會(huì)發(fā)給交換機(jī),交換機(jī)再發(fā)送給主機(jī)a,然后進(jìn)行封包,主機(jī)a就能發(fā)送給主機(jī)b,那么這就是一個(gè)2層局域網(wǎng)之間的通信原理。
中間會(huì)有一個(gè)ARP緩存表,這個(gè)表都會(huì)在主機(jī)a,主機(jī)b,交換機(jī)去記錄經(jīng)過(guò)二層傳輸?shù)脑碔P和目的IP對(duì)應(yīng)的mac地址,以便下次再傳輸時(shí),直接使用現(xiàn)有的進(jìn)行去封裝
那么如果這個(gè)局域網(wǎng)的交換機(jī)去發(fā)送廣播包,不同網(wǎng)段下的主機(jī)會(huì)不會(huì)收到,如果沒(méi)有三層交換機(jī)是收不到的,如果使用的三層交換機(jī)也就是核心交換機(jī),它可以處理2層的ARP,那么不同網(wǎng)段的交換機(jī)也能收到,如果是路由器的話,那自然收不到了,因?yàn)槁酚善飨旅婷恳粋€(gè)端口,都有一個(gè)vlan,路由器隔離了這個(gè)廣播包,那么如果它是一個(gè)三層的核心交換機(jī),它能處理二層的還能處理三層的,那么它是可以收到的。
2、主機(jī)A和主機(jī)B不在一個(gè)局域網(wǎng)之間通信數(shù)據(jù)包傳輸流程
vlan1 192.168.36.0/24
vlan2 192.168.35.0/24
他們是不在一個(gè)子網(wǎng)中,那么這兩個(gè)進(jìn)行去通信,需要經(jīng)過(guò)路由器了,因?yàn)樗^(guò)了二層數(shù)據(jù)包轉(zhuǎn)發(fā)的范圍了,那這種情況下進(jìn)行通信首先也是判斷目標(biāo)IP是不是在一個(gè)子網(wǎng)里面,如果在一個(gè)子網(wǎng)里面那么它會(huì)發(fā)送到自己的默認(rèn)網(wǎng)關(guān),可以通過(guò)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
因?yàn)槟繕?biāo)ip已經(jīng)不在一個(gè)子網(wǎng)中了,去arp廣播,自然沒(méi)辦法響應(yīng),還是丟棄的,還是沒(méi)人響應(yīng),就會(huì)走默認(rèn)的網(wǎng)關(guān),10.4.7.1也就是下一跳地址,然后這個(gè)數(shù)據(jù)包就會(huì)轉(zhuǎn)發(fā)到這個(gè)網(wǎng)關(guān)上,然后網(wǎng)關(guān)要查看本機(jī)的路由表,一般路由表就會(huì)記錄一些目的地址還有下一跳地址,然后從哪個(gè)路由表去出
路由表:
目的地址。比如192.168.35.0/24,網(wǎng)關(guān) 接口,因?yàn)橄旅娴男畔⒍贾溃跃蜎](méi)有下一跳了
也就是數(shù)據(jù)包從vlan1進(jìn)入二層,再進(jìn)入核心交換機(jī)這里有兩個(gè)口,a口還有b口,a口就是默認(rèn)的網(wǎng)關(guān),然后查詢路由表這個(gè)網(wǎng)段的是從b口出,然后到達(dá)交換機(jī)到2層,然后到目的的vlan上,這個(gè)期間二層也會(huì)記錄mac地址。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。