溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Kubernetes中的網(wǎng)絡(luò)原理解析該怎么理解

發(fā)布時(shí)間:2021-11-22 16:39:30 來源:億速云 閱讀:124 作者:柒染 欄目:云計(jì)算

這篇文章給大家介紹Kubernetes中的網(wǎng)絡(luò)原理解析該怎么理解,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

01 覆蓋網(wǎng)絡(luò)

覆蓋?絡(luò)(overlay network)是將TCP數(shù)據(jù)包裝在另?種?絡(luò)包??進(jìn)?路由轉(zhuǎn)發(fā)和通信的技術(shù)。Overlay?絡(luò)不是默認(rèn)必須的,但是它們?cè)谔囟▓?chǎng)景下?常有?。?如當(dāng)我們沒有?夠的IP空間,或者?絡(luò)?法處理額外路由,抑或當(dāng)我們需要Overlay提供的某些額外管理特性。?個(gè)常?的場(chǎng)景是當(dāng)云提供商的路由表能處理的路由數(shù)是有限制時(shí),例如AWS路由表最多?持50條路由才不?于影響?絡(luò)性能。因此如果我們有超過50個(gè)Kubernetes節(jié)點(diǎn), AWS路由表將不夠。這種情況下,使?Overlay?絡(luò)將幫到我們。

本質(zhì)上來說, Overlay就是在跨節(jié)點(diǎn)的本地?絡(luò)上的包中再封裝?層包。你可能不想使?Overlay?絡(luò),因?yàn)樗鼤?huì)帶來由封裝和解封所有報(bào)?引起的時(shí)延和復(fù)雜度開銷。通常這是不必要的,因此我們應(yīng)當(dāng)在知道為什么我們需要它時(shí)才使?它。

為了理解Overlay?絡(luò)中流量的流向,我們拿Flannel做例?,它是CoreOS 的?個(gè)開源項(xiàng)?。Flannel通過給每臺(tái)宿主機(jī)分配?個(gè)??的?式為容器提供虛擬?絡(luò),它基于Linux TUN/TAP,使?UDP封裝IP包來創(chuàng)建overlay?絡(luò),并借助etcd維護(hù)?絡(luò)的分配情況。

Kubernetes中的網(wǎng)絡(luò)原理解析該怎么理解

Kubernetes Node with route table (通過Flannel Overlay網(wǎng)絡(luò)進(jìn)行跨節(jié)點(diǎn)的Pod-to-Pod通信)

這?我們注意到它和之前我們看到的設(shè)施是?樣的,只是在root netns中新增了?個(gè)虛擬的以太?設(shè)備,稱為flannel0。它是虛擬擴(kuò)展?絡(luò)Virtual Extensible LAN(VXLAN)的?種實(shí)現(xiàn),但是在Linux上,它只是另?個(gè)?絡(luò)接?。

從pod1到pod4(在不同節(jié)點(diǎn))的數(shù)據(jù)包的流向類似如下:

1)它由pod1中netns的eth0??離開,通過vethxxx進(jìn)?root netns。
2)然后被傳到cbr0, cbr0通過發(fā)送ARP請(qǐng)求來找到?標(biāo)地址。
3)數(shù)據(jù)封裝

3a. 由于本節(jié)點(diǎn)上沒有Pod擁有pod4的IP地址,因此?橋把數(shù)據(jù)包發(fā)送給了flannel0,因?yàn)楣?jié)點(diǎn)的路由表上flannel0被配成了Pod?段的?標(biāo)地址。

3b. flanneld daemon和Kubernetes apiserver或者底層的etcd通信,它知道所有的Pod IP,并且知道它們?cè)谀膫€(gè)節(jié)點(diǎn)上。因此Flannel創(chuàng)建了Pod IP和Node IP之間的映射(在?戶空間)。flannel0取到這個(gè)包,并在其上再??個(gè)UDP包封裝起來,該UDP包頭部的源和?的IP分別被改成了對(duì)應(yīng)節(jié)點(diǎn)的IP,然后發(fā)送這個(gè)新包到特定的VXLAN端?(通常是8472)。

Kubernetes中的網(wǎng)絡(luò)原理解析該怎么理解

Packet-in-packet encapsulation(notice the packet is encapsulated from 3c to 6b in previous diagram)

盡管這個(gè)映射發(fā)?在?戶空間,真實(shí)的封裝以及數(shù)據(jù)的流動(dòng)發(fā)?在內(nèi)核空間,因此仍然是很快的。

3c. 封裝后的包通過eth0發(fā)送出去,因?yàn)樗婕傲斯?jié)點(diǎn)間的路由流量。

4. 包帶著節(jié)點(diǎn)IP信息作為源和?的地址離開本節(jié)點(diǎn)。
5. 云提供商的路由表已經(jīng)知道了如何在節(jié)點(diǎn)間發(fā)送報(bào)?,因此該報(bào)?被發(fā)送到?標(biāo)地址node2。
6. 數(shù)據(jù)解包

6a. 包到達(dá)node2的eth0?卡,由于?標(biāo)端?是特定的VXLAN端?,內(nèi)核將報(bào)?發(fā)送給了
flannel0。
6b. flannel0解封報(bào)?,并將其發(fā)送到 root 命名空間下。從這?開始,報(bào)?的路徑和我們之前在Part1 中看到的?Overlay?絡(luò)就是?致的了。
6c. 由于IP forwarding開啟著,內(nèi)核按照路由表將報(bào)?轉(zhuǎn)發(fā)給了cbr0。

7. ?橋獲取到了包,發(fā)送ARP請(qǐng)求,發(fā)現(xiàn)?標(biāo)IP屬于vethyyy。
8. 包跨過管道對(duì)到達(dá)pod4

這就是Kubernetes中Overlay?絡(luò)的?作?式,雖然不同的實(shí)現(xiàn)還是會(huì)有細(xì)微的差別。有個(gè)常?的誤區(qū)是,當(dāng)我們使?Kubernetes,我們就不得不使?Overlay?絡(luò)。事實(shí)是,這完全依賴于特定場(chǎng)景。因此請(qǐng)確保在確實(shí)需要的場(chǎng)景下才使?。

02動(dòng)態(tài)集群

由于Kubernetes(更通?的說法是分布式系統(tǒng))天?具有不斷變化的特性,因此它的Pod(以及Pod的IP)總是在改變。變化的原因可以是針對(duì)不可預(yù)測(cè)的Pod或節(jié)點(diǎn)崩潰?進(jìn)?的滾動(dòng)升級(jí)和擴(kuò)展。這使得Pod IP不能直接?于通信。我們看?下Kubernetes Service,它是?個(gè)虛擬IP,并伴隨著?組Pod IP作為Endpoint(通過標(biāo)簽選擇器識(shí)別)。它們充當(dāng)虛擬負(fù)載均衡器,其IP保持不變,?后端Pod IP可能會(huì)不斷變化。

Kubernetes中的網(wǎng)絡(luò)原理解析該怎么理解

Kubernetes service對(duì)象中的label選擇器

整個(gè)虛擬IP的實(shí)現(xiàn)實(shí)際上是?組iptables(最新版本可以選擇使?IPVS,但這是另?個(gè)討論)規(guī)則,由Kubernetes組件kube-proxy管理。這個(gè)名字現(xiàn)在實(shí)際上是誤導(dǎo)性的。它在v 1.0之前確實(shí)是?個(gè)代理,并且由于其實(shí)現(xiàn)是內(nèi)核空間和?戶空間之間的不斷復(fù)制,它變得?常耗費(fèi)資源并且速度較慢。現(xiàn)在,它只是?個(gè)控制器,就像Kubernetes中的許多其它控制器?樣,它watch api serverendpoint的更改并相應(yīng)地更新iptables規(guī)則。

Kubernetes中的網(wǎng)絡(luò)原理解析該怎么理解

Iptables DNAT

有了這些iptables規(guī)則,每當(dāng)數(shù)據(jù)包發(fā)往Service IP時(shí),它就進(jìn)?DNAT(DNAT=?標(biāo)?絡(luò)地址轉(zhuǎn)換)操作,這意味著?標(biāo)IP從Service IP更改為其中?個(gè)Endpoint - Pod IP - 由iptables隨機(jī)選擇。這可確保負(fù)載均勻分布在后端Pod中。

Kubernetes中的網(wǎng)絡(luò)原理解析該怎么理解

conntrack表中的5元組條?

當(dāng)這個(gè)DNAT發(fā)?時(shí),這個(gè)信息存儲(chǔ)在conntrack中——Linux連接跟蹤表(iptables規(guī)則5元組轉(zhuǎn)譯并完成存儲(chǔ):protocol, srcIP, srcPort, dstIP, dstPort)。這樣當(dāng)請(qǐng)求回來時(shí),它可以u(píng)n-DNAT,這意味著將源IP從Pod IP更改為Service IP。這樣,客戶端就不?關(guān)?后臺(tái)如何處理數(shù)據(jù)包流。

因此通過使?Kubernetes Service,我們可以使?相同的端??不會(huì)發(fā)?任何沖突(因?yàn)槲覀兛梢詫⒍?重新映射到Endpoint)。這使服務(wù)發(fā)現(xiàn)變得?常容易。我們可以使?內(nèi)部DNS并對(duì)服務(wù)主機(jī)名進(jìn)?硬編碼。

我們甚?可以使?Kubernetes提供的service主機(jī)和端?的環(huán)境變量來完成服務(wù)發(fā)現(xiàn)。

專家建議:采取第?種?法,你可節(jié)省不必要的DNS調(diào)?,但是由于環(huán)境變量存在創(chuàng)建順序的局限性(環(huán)境變量中不包含后來創(chuàng)建的服務(wù)),推薦使?DNS來進(jìn)?服務(wù)名解析。

2.1 出站流量

到?前為?我們討論的Kubernetes Service是在?個(gè)集群內(nèi)?作。但是,在?多數(shù)實(shí)際情況中,應(yīng)?程序需要訪問?些外部api/website。通常,節(jié)點(diǎn)可以同時(shí)具有私有IP和公共IP。對(duì)于互聯(lián)?訪問,這些公共和私有IP存在某種1:1的NAT,特別是在云環(huán)境中。對(duì)于從節(jié)點(diǎn)到某些外部IP的普通通信,源IP從節(jié)點(diǎn)的專?IP更改為其出站數(shù)據(jù)包的公共IP,?站的響應(yīng)數(shù)據(jù)包則剛好相反。但是,當(dāng)Pod發(fā)出與外部IP的連接時(shí),源IP是Pod IP,云提供商的NAT機(jī)制不知道該IP。因此它將丟棄具有除節(jié)點(diǎn)IP之外的源IP的數(shù)據(jù)包。

因此你可能也猜對(duì)了,我們將使?更多的iptables!這些規(guī)則也由kube-proxy添加,執(zhí)?SNAT(源?絡(luò)地址轉(zhuǎn)換),即IP MASQUERADE(IP偽裝)。它告訴內(nèi)核使?此數(shù)據(jù)包發(fā)出的?絡(luò)接?的IP,代替源Pod IP同時(shí)保留conntrack條?以進(jìn)?反SNAT操作。

2.2 入站流量

到?前為??切都很好。Pod可以互相交談,也可以訪問互聯(lián)?。但我們?nèi)匀蝗鄙訇P(guān)鍵部分 - 為?戶請(qǐng)求流量提供服務(wù)。截??前,有兩種主要?法可以做到這?點(diǎn):

  • NodePort /云負(fù)載均衡器(L4 - IP和端?)

將服務(wù)類型設(shè)置為NodePort默認(rèn)會(huì)為服務(wù)分配范圍為30000-33000d的nodePort。即使在特定節(jié)點(diǎn)上沒有運(yùn)?Pod,此nodePort也會(huì)在每個(gè)節(jié)點(diǎn)上打開。此NodePort上的?站流量將再次使?iptables發(fā)送到其中?個(gè)Pod(該P(yáng)od甚?可能在其它節(jié)點(diǎn)上!)。

云環(huán)境中的LoadBalancer服務(wù)類型將在所有節(jié)點(diǎn)之前創(chuàng)建云負(fù)載均衡器(例如ELB),命中相同的nodePort。

  • Ingress(L7 - HTTP / TCP)

許多不同的?具,如Nginx, Traefik, HAProxy等,保留了http主機(jī)名/路徑和各?后端的映射。通常這是基于負(fù)載均衡器和nodePort的流量??點(diǎn),其優(yōu)點(diǎn)是我們可以有?個(gè)??處理所有服務(wù)的?站流量,?不需要多個(gè)nodePort和負(fù)載均衡器。

2.3 網(wǎng)站策略

可以把它想象為Pod的安全組/ ACL。NetworkPolicy規(guī)則允許/拒絕跨Pod的流量。確切的實(shí)現(xiàn)取決于?絡(luò)層/CNI,但?多數(shù)只使?iptables。

?前為?就這樣了。在前?的部分中,我們研究了Kubernetes?絡(luò)的基礎(chǔ)以及overlay?絡(luò)的?作原理?,F(xiàn)在我們知道Service抽象是如何在?個(gè)動(dòng)態(tài)集群內(nèi)起作?并使服務(wù)發(fā)現(xiàn)變得?常容易。我們還介紹了出站和?站流量的?作原理以及?絡(luò)策略如何對(duì)集群內(nèi)的安全性起作?。

關(guān)于Kubernetes中的網(wǎng)絡(luò)原理解析該怎么理解就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(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)容。

AI