Pod
首先來(lái)回顧一下Pod:
Pod 是用于構(gòu)建應(yīng)用程序的最小可部署對(duì)象。單個(gè) Pod 代表集群中正在運(yùn)行的工作負(fù)載,并封裝一個(gè)或多個(gè) Docker 容器、任何所需的存儲(chǔ)以及唯一的 IP 地址。
Kubernetes 網(wǎng)絡(luò)模型
集群中每一個(gè) Pod 都會(huì)獲得自己的、 獨(dú)一無(wú)二的 IP 地址。一個(gè)Pod里的一組容器共享相同的IP地址。
Kubernetes 強(qiáng)制要求所有網(wǎng)絡(luò)設(shè)施都滿足以下基本要求(從而排除了有意隔離網(wǎng)絡(luò)的策略):
- Pod 能夠與所有其他節(jié)點(diǎn)上的 Pod 通信, 且不需要網(wǎng)絡(luò)地址轉(zhuǎn)譯(NAT)
- 節(jié)點(diǎn)上的代理(比如:系統(tǒng)守護(hù)進(jìn)程、kubelet)可以和節(jié)點(diǎn)上的所有 Pod 通信。
考慮到這些限制,我們剩下四個(gè)不同的網(wǎng)絡(luò)問(wèn)題需要解決:
- 容器到容器網(wǎng)絡(luò)
- Pod 到 Pod 網(wǎng)絡(luò)
- Pod 到服務(wù)網(wǎng)絡(luò)
- 互聯(lián)網(wǎng)到服務(wù)網(wǎng)絡(luò)
同一Pod上的容器之間進(jìn)行通信
通常,我們將虛擬機(jī)中的網(wǎng)絡(luò)通信視為直接與以太網(wǎng)設(shè)備交互。默認(rèn)情況下,Linux 將每個(gè)進(jìn)程分配給根網(wǎng)絡(luò)命名空間,以提供對(duì)外部世界的訪問(wèn)。如下圖所示:
Pod 被建模為一組共享網(wǎng)絡(luò)命名空間的 Docker 容器。Pod 中的容器都具有通過(guò)分配給 Pod 的網(wǎng)絡(luò)命名空間分配的相同 IP 地址和端口空間,并且可以通過(guò) localhost 找到彼此,因?yàn)樗鼈凂v留在同一命名空間中。
根本原因是使用Docker的一種網(wǎng)絡(luò)模型:–net=container 能夠讓同一個(gè)Pod內(nèi)的多個(gè)docker容器相互通信。
container模式指定新創(chuàng)建的Docker容器和已經(jīng)存在的一個(gè)容器共享一個(gè)網(wǎng)絡(luò)命名空間,也就是說(shuō)新創(chuàng)建的Docker容器不會(huì)創(chuàng)建自己的網(wǎng)卡,配置自己的 IP,而是和一個(gè)指定的容器共享 IP、端口范圍等。
在k8s中每個(gè)Pod容器有一個(gè)pause容器,它擁有獨(dú)立的網(wǎng)絡(luò)命名空間,在Pod內(nèi)啟動(dòng)Docker容器時(shí)候使用 –net=container就可以讓當(dāng)前Docker容器加入到Pod容器擁有的網(wǎng)絡(luò)命名空間(pause容器)。
同一Node上的不同Pod之間進(jìn)行通信
從 Pod 的角度來(lái)看,它存在于自己的以太網(wǎng)命名空間中。不同的Pod存在于不同的網(wǎng)絡(luò)命名空間里。
但是可以使用Linux虛擬以太網(wǎng)設(shè)備或由兩個(gè)虛擬接口組成的veth對(duì) 將兩個(gè)網(wǎng)絡(luò)命名空間進(jìn)行連接 。要連接 Pod 命名空間,我們可以將 veth 對(duì)的一側(cè)分配給根網(wǎng)絡(luò)命名空間,將另一側(cè)分配給 Pod 的網(wǎng)絡(luò)命名空間。然后使用網(wǎng)橋把兩個(gè)虛擬網(wǎng)絡(luò)組成為一個(gè)以太網(wǎng)。如下圖所示:
在上面這個(gè)網(wǎng)絡(luò)模型下,Pod之間是如何通信的呢?
- Pod 1 向其自己的以太網(wǎng)設(shè)備發(fā)送數(shù)據(jù)包eth0,該設(shè)備可作為 Pod 的默認(rèn)設(shè)備。對(duì)于 Pod 1,eth0通過(guò)虛擬以太網(wǎng)設(shè)備連接到根命名空間veth0
- 網(wǎng)橋cbr0配置有veth0連接到它的網(wǎng)段。一旦數(shù)據(jù)包到達(dá)網(wǎng)橋,網(wǎng)橋就會(huì)使用 ARP 協(xié)議解析將數(shù)據(jù)包發(fā)送到的正確網(wǎng)段
- 當(dāng)數(shù)據(jù)包到達(dá)虛擬設(shè)備veth1時(shí),它會(huì)直接轉(zhuǎn)發(fā)到 Pod 2 的命名空間以及該命名空間內(nèi)的設(shè)備eth0
不同Node上的Pod之間進(jìn)行通信
同樣會(huì)用到虛擬接口和網(wǎng)橋。
- 數(shù)據(jù)包首先通過(guò) Pod 1 的以太網(wǎng)設(shè)備發(fā)送,該設(shè)備與根命名空間 中的虛擬以太網(wǎng)設(shè)備配對(duì)。最終,數(shù)據(jù)包到達(dá)根命名空間的網(wǎng)橋
- ARP 將在網(wǎng)橋處失敗,因?yàn)闆](méi)有設(shè)備連接到具有數(shù)據(jù)包正確 MAC 地址的網(wǎng)橋。發(fā)生故障時(shí),網(wǎng)橋?qū)?shù)據(jù)包從默認(rèn)路由(根命名空間的eth0設(shè)備)發(fā)送出去。此時(shí),路由離開(kāi)節(jié)點(diǎn)并進(jìn)入網(wǎng)絡(luò)
- 我們現(xiàn)在假設(shè)網(wǎng)絡(luò)可以根據(jù)分配給節(jié)點(diǎn) 的 CIDR 塊將數(shù)據(jù)包路由到正確的節(jié)點(diǎn)。數(shù)據(jù)包進(jìn)入目標(biāo)節(jié)點(diǎn)(在 VM 2 上)的根命名空間eth0,并通過(guò)網(wǎng)橋路由到正確的虛擬以太網(wǎng)設(shè)備
- 最后,路由通過(guò)駐留在 Pod 4 命名空間內(nèi)的虛擬以太網(wǎng)設(shè)備對(duì)完成
一般來(lái)說(shuō),每個(gè)節(jié)點(diǎn)都知道如何將數(shù)據(jù)包傳遞到在其內(nèi)運(yùn)行的 Pod。一旦數(shù)據(jù)包到達(dá)目標(biāo)節(jié)點(diǎn),數(shù)據(jù)包的流動(dòng)方式與在同一節(jié)點(diǎn)上的 Pod 之間路由流量的方式相同。
Service
我們要知道,Pod的IP地址不持久,會(huì)隨著擴(kuò)展或縮小、應(yīng)用程序崩潰或節(jié)點(diǎn)重啟而出現(xiàn)和消失。哪怕重啟一個(gè)Pod,它的IP也可能和前一次不一樣。
所以Kubernetes 里使用Service來(lái)管理一組 Pod 的狀態(tài),允許我們跟蹤一組隨時(shí)間動(dòng)態(tài)變化的 Pod 的IP 地址。Service充當(dāng) Pod 的抽象,并將單個(gè)虛擬 IP 地址分配給一組 Pod 的IP 地址。
任何發(fā)送到服務(wù)虛擬 IP 的流量都將被路由到與該虛擬 IP 關(guān)聯(lián)的 Pod 集。這允許與 Service 關(guān)聯(lián)的 Pod 集隨時(shí)更改 ,只要虛擬IP不改,客戶端就感覺(jué)不到Pod的變化。
創(chuàng)建新的 Kubernetes Service時(shí),系統(tǒng)會(huì)創(chuàng)建一個(gè)新的虛擬 IP(也稱為集群 IP)。集群內(nèi)的任何位置,尋址到虛擬 IP 的流量都將負(fù)載均衡到與Service關(guān)聯(lián)的一組Pod。實(shí)際上,Kubernetes 會(huì)自動(dòng)創(chuàng)建并維護(hù)一個(gè)分布式集群內(nèi)負(fù)載均衡器,該均衡器將流量分配到Service關(guān)聯(lián)的健康 Pod。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-860744.html
參考
https://sookocheff.com/post/kubernetes/understanding-kubernetes-networking-model/
https://kubernetes.io/zh-cn/docs/concepts/services-networking/文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-860744.html
到了這里,關(guān)于【Kubernetes】k8s中容器之間、pod之間如何進(jìn)行網(wǎng)絡(luò)通信?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!