這篇文章給大家介紹怎樣進(jìn)行Kubernetes的網(wǎng)絡(luò)原理解析,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
在魏都等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶(hù)提供成都網(wǎng)站制作、做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需求定制開(kāi)發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),成都營(yíng)銷(xiāo)網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站建設(shè),魏都網(wǎng)站建設(shè)費(fèi)用合理。
Network Namespace(網(wǎng)絡(luò)命名空間):Linux在網(wǎng)絡(luò)棧中引入網(wǎng)絡(luò)命名空間,將獨(dú)立的網(wǎng)絡(luò)協(xié)議棧隔離到不同的命令空間中,彼此間無(wú)法通信;docker利用這一特性,實(shí)現(xiàn)不容器間的網(wǎng)絡(luò)隔離。
Iptables/Netfilter:Netfilter負(fù)責(zé)在內(nèi)核中執(zhí)行各種掛接的規(guī)則(過(guò)濾、修改、丟棄等),運(yùn)行在內(nèi)核模式中;Iptables模式是在用戶(hù)模式下運(yùn)行的進(jìn)程,負(fù)責(zé)協(xié)助維護(hù)內(nèi)核中Netfilter的各種規(guī)則表;通過(guò)分析進(jìn)入主機(jī)的網(wǎng)絡(luò)封包,將封包的表頭數(shù)據(jù)提取出來(lái)進(jìn)行分析,以決定該聯(lián)機(jī)為放行或抵擋的機(jī)制。 由于這種方式可以直接分析封包表頭數(shù)據(jù),所以包括硬件地址(MAC), 軟件地址 (IP), TCP, UDP, ICMP 等封包的信息都可以進(jìn)行過(guò)濾分析。
Veth設(shè)備對(duì):Veth設(shè)備對(duì)的引入是為了實(shí)現(xiàn)在不同網(wǎng)絡(luò)命名空間的通信。
Bridge(網(wǎng)橋):網(wǎng)橋是一個(gè)二層網(wǎng)絡(luò)設(shè)備,是最簡(jiǎn)單的CNI網(wǎng)絡(luò)插件,它首先在Host創(chuàng)建一個(gè)網(wǎng)橋,然后再通過(guò)veth pair連接該網(wǎng)橋到container netns。另外,Bridge模式下,多主機(jī)網(wǎng)絡(luò)通信需要額外配置主機(jī)路由
Route(路由):Linux系統(tǒng)包含一個(gè)完整的路由功能,當(dāng)IP層在處理數(shù)據(jù)發(fā)送或轉(zhuǎn)發(fā)的時(shí)候會(huì)使用路由表來(lái)決定發(fā)往哪里。
Container Network Interface (CNI) 最早是由CoreOS發(fā)起的容器網(wǎng)絡(luò)規(guī)范,是 Kubernetes網(wǎng)絡(luò)插件的基礎(chǔ)。其基本思想為:Container Runtime在創(chuàng)建容器時(shí),先創(chuàng)建好network namespace,然后調(diào)用CNI插件為這個(gè)netns配置網(wǎng)絡(luò),其后再啟動(dòng)容器內(nèi)的進(jìn)程
Kubernetes網(wǎng)絡(luò)有一個(gè)重要的基本設(shè)計(jì)原則:
每個(gè)Pod擁有唯一的IP
這個(gè)Pod IP被該P(yáng)od內(nèi)的所有容器共享,并且其它所有Pod都可以路由到該P(yáng)od。你可曾注意到,你的Kubernetes節(jié)點(diǎn)上運(yùn)行著一些”pause”容器?它們被稱(chēng)作“沙盒容器(sandbox containers)”,其唯一任務(wù)是保留并持有一個(gè)網(wǎng)絡(luò)命名空間(netns),該命名空間被Pod內(nèi)所有容器共享。通過(guò)這種方式,即使一個(gè)容器死掉,新的容器創(chuàng)建出來(lái)代替這個(gè)容器,Pod IP也不會(huì)改變。這種IP-per-pod模型的巨大優(yōu)勢(shì)是,Pod和底層主機(jī)不會(huì)有IP或者端口沖突。我們不用擔(dān)心應(yīng)用使用了什么端口。
這點(diǎn)滿(mǎn)足后,Kubernetes唯一的要求是,這些Pod IP可被其它所有Pod訪(fǎng)問(wèn),不管那些Pod在哪個(gè)節(jié)點(diǎn)。
第一步是確保同一節(jié)點(diǎn)上的Pod可以相互通信,然后可以擴(kuò)展到跨節(jié)點(diǎn)通信、internet上的通信,等等。
Kubernetes Node(root network namespace)
在每個(gè)Kubernetes節(jié)點(diǎn)(本場(chǎng)景指的是Linux機(jī)器)上,都有一個(gè)根(root)命名空間(root是作為基準(zhǔn),而不是超級(jí)用戶(hù))— root netns(root network namespace)。
主要的網(wǎng)絡(luò)接口 eth0 就是在這個(gè)root netns下。
Kubernetes Node(pod network namespace)
類(lèi)似的,每個(gè)Pod都有其自身的netns(network namespace),通過(guò)一個(gè)虛擬的以太網(wǎng)對(duì)連接到root netns。這基本上就是一個(gè)管道對(duì),一端在root netns內(nèi),另一端在Pod的netns內(nèi)。
我們把Pod端的網(wǎng)絡(luò)接口叫 eth0,這樣Pod就不需要知道底層主機(jī),它認(rèn)為它擁有自己的根網(wǎng)絡(luò)設(shè)備。另一端命名成比如 vethxxx。你可以用
ifconfig
或者
ip a
命令列出你的節(jié)點(diǎn)上的所有這些接口。
Kubernetes Node(linux network bridge)
節(jié)點(diǎn)上的所有Pod都會(huì)完成這個(gè)過(guò)程。這些Pod要相互通信,就要用到linux的以太網(wǎng)橋 cbr0 了。Docker使用了類(lèi)似的網(wǎng)橋,稱(chēng)為docker0。你可以用
brctl show
命令列出所有網(wǎng)橋。
Kubernetes Node(same node pod-to-pod communication)
假設(shè)一個(gè)網(wǎng)絡(luò)數(shù)據(jù)包要由pod1到pod2
它由pod1中netns的eth0網(wǎng)口離開(kāi),通過(guò)vethxxx進(jìn)入root netns。
然后被傳到cbr0,cbr0使用ARP請(qǐng)求,說(shuō)“誰(shuí)擁有這個(gè)IP”,從而發(fā)現(xiàn)目標(biāo)地址。
vethyyy說(shuō)它有這個(gè)IP,因此網(wǎng)橋就知道了往哪里轉(zhuǎn)發(fā)這個(gè)包。
數(shù)據(jù)包到達(dá)vethyyy,跨過(guò)管道對(duì),到達(dá)pod2的netns。
這就是同一節(jié)點(diǎn)內(nèi)容器間通信的流程。當(dāng)然也可以用其它方式,但是無(wú)疑這是最簡(jiǎn)單的方式,同時(shí)也是Docker采用的方式。
正如我前面提到,Pod也需要跨節(jié)點(diǎn)可達(dá)。Kubernetes不關(guān)心如何實(shí)現(xiàn)。我們可以使用L2(ARP跨節(jié)點(diǎn)),L3(IP路由跨節(jié)點(diǎn),就像云提供商的路由表),Overlay網(wǎng)絡(luò),或者甚至信鴿。無(wú)所謂,只要流量能到達(dá)另一個(gè)節(jié)點(diǎn)的期望Pod就好。每個(gè)節(jié)點(diǎn)都為Pod IPs分配了唯一的CIDR塊(一段IP地址范圍),因此每個(gè)Pod都擁有唯一的IP,不會(huì)和其它節(jié)點(diǎn)上的Pod沖突。
大多數(shù)情況下,特別是在云環(huán)境上,云提供商的路由表就能確保數(shù)據(jù)包到達(dá)正確的目的地。我們?cè)诿總€(gè)節(jié)點(diǎn)上建立正確的路由也能達(dá)到同樣的目的。許多其它的網(wǎng)絡(luò)插件通過(guò)自己的方式達(dá)到這個(gè)目的。
這里我們有兩個(gè)節(jié)點(diǎn),與之前看到的類(lèi)似。每個(gè)節(jié)點(diǎn)有不同的網(wǎng)絡(luò)命名空間、網(wǎng)絡(luò)接口以及網(wǎng)橋。
Kubernetes Nodes with route table(cross node pod-to-pod communication)
假設(shè)一個(gè)數(shù)據(jù)包要從pod1到達(dá)pod4(在不同的節(jié)點(diǎn)上)
它由pod1中netns的eth0網(wǎng)口離開(kāi),通過(guò)vethxxx進(jìn)入root netns。
然后被傳到cbr0,cbr0通過(guò)發(fā)送ARP請(qǐng)求來(lái)找到目標(biāo)地址。
本節(jié)點(diǎn)上沒(méi)有Pod擁有pod4的IP地址,根據(jù)路由判斷數(shù)據(jù)包由cbr0 傳到主網(wǎng)絡(luò)接口 eth0.
數(shù)據(jù)包的源地址為pod1,目標(biāo)地址為pod4,它以這種方式離開(kāi)node1進(jìn)入電纜。
路由表有每個(gè)節(jié)點(diǎn)的CIDR塊的路由設(shè)定,它把數(shù)據(jù)包路由到CIDR塊包含pod4的IP的節(jié)點(diǎn)。
因此數(shù)據(jù)包到達(dá)了node2的主網(wǎng)絡(luò)接口eth0?,F(xiàn)在即使pod4不是eth0的IP,數(shù)據(jù)包也仍然能轉(zhuǎn)發(fā)到cbr0,因?yàn)楣?jié)點(diǎn)配置了IP forwarding enabled。節(jié)點(diǎn)的路由表尋找任意能匹配pod4 IP的路由。它發(fā)現(xiàn)了 cbr0 是這個(gè)節(jié)點(diǎn)的CIDR塊的目標(biāo)地址。你可以用route -n命令列出該節(jié)點(diǎn)的路由表,它會(huì)顯示cbr0的路由,類(lèi)型如下:
網(wǎng)橋接收了數(shù)據(jù)包,發(fā)送ARP請(qǐng)求,發(fā)現(xiàn)目標(biāo)IP屬于vethyyy。
數(shù)據(jù)包跨過(guò)管道對(duì)到達(dá)pod4。
關(guān)于怎樣進(jìn)行Kubernetes的網(wǎng)絡(luò)原理解析就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
網(wǎng)站標(biāo)題:怎樣進(jìn)行Kubernetes的網(wǎng)絡(luò)原理解析
鏈接URL:http://jinyejixie.com/article44/ghhche.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、定制開(kāi)發(fā)、域名注冊(cè)、微信小程序、電子商務(wù)、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)