k8s pod內以及pod間通信機制


轉載 https://cloud.tencent.com/developer/article/1618617

pod 通信機制

如果要說明 pod 的通信機制,要從一個鏡像說起,在 kubectl 安裝kubernetes 的時候一定會看到 k8s.gcr.io/pause 這個鏡像,不知道有沒有疑問,這個到底是干嘛的?其它幾個鏡像顧名思義,但是這個【暫停】是什么?沒錯,他就是用來 hold 一個 Pod 內部多個 Container 網絡通信。

如果在計算節點上運行 docker ps 命令

[root@localhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE c250329fad3c bridge bridge local c7c3d1f77969 compose_extnetwork bridge local 199b85fbf2fa host host local b488be9da3d6 none null local

如上所示,你可以看到在創建 nginx pod 過程中,不僅創建了一個nginx 容器,並附帶了一個 pause 容器,而且 pause 容器是在 nginx容器之前創建的,這個被暫停的容器把所有的容器收納到一起,一個基礎容器,唯一目的就是保存所有的命名空間。容器中 pod 共享同一個 IP 地址。故同一個 Pod 中 Container 可以做到直接通過 localhost 直接通信,那么同一個節點多個 Pod 之間如何通信的呢?

(d)

pause 容器啟動之前,會為容器創建虛擬一對 ethernet 接口,一個保留在宿主機 vethxxx(插在網橋上),一個保留在容器網絡命名空間內,並重命名為eth0。兩個虛擬接口的兩端,從一端進入,另一端出來。任何 Pod 連接到該網橋的 Pod 都可以收發數據。如(d)圖所示。


4、跨 node pod 通信

跨節點 Pod 通信,相當於創建一個整個集群公用的【 網橋 】然后把集群中所有的 Pod 連接起來,就可以通信了。

(e)

其中跨整個集群的 Pod ip 是唯一的,當報文從一個節點轉發到另外一個節點時,報文首先通過 veth,然后通過網橋,轉發到物理適配器網卡,最后轉發到其它節點的虛擬網橋,進而到達 veth 目標容器。如(e)圖所示。

其實現方式有 Flannel、calico、weave 等。

注意 k8s 的網橋跟 docker0  網橋功能類似,但是 k8s 並沒有復用 docker0 網橋,其原因是 Kubernetes 為了連接 infra 容器更加方便,而是重新實現了 CNI 網絡接口功能,它允許網絡插件使用 CNI 接口,比如 flannel,它本身實現也經過幾個過程,其本質上來說,是基於「隧道」機制實現。示意圖(f)所示:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM