1. 程式人生 > 其它 >徹底搞懂 Kubernetes 的底層網路,看這幾張圖就夠了【轉】

徹底搞懂 Kubernetes 的底層網路,看這幾張圖就夠了【轉】

如果大家已經使用了 kubernetes技術,並運行了一些測試或生產的服務,可能已經能體會到 K8s 技術帶來的革命性變化,如果還沒有用過的小夥伴,我建議儘快入坑,畢竟這是技術趨勢。

目前儘管已經有很多工具可以用來設定和管理叢集,但我們仍然需要知道在k8s底層發生了什麼,尤其在碰到問題時,只有知道到底層原理才有可能從某個現象去分析到底是哪裡出了問題,才能去解決實際問題。

從技術上說 Kubernetes 其實在底層它是非常複雜的,它有很多元件,因此,必須瞭解它們如何相互配合並協同工作,才能實際去理解實際中的問題,那說到這裡,不得不說K8s的網路是最複雜且最關鍵之一。

因此,這篇我們通過圖文來深入理解 Kubernetes 中的網路如何工作。

Kubernetes網路模型

Kubernetes Networking 的核心是一種重要的基本設計理念:

每個Pod都有唯一的IP。

此 Pod IP 由該Pod中的所有容器共享,並且可以與所有其他Pod路由。你是否曾經注意到Kubernetes節點上執行著一些“暫停”容器?它們被稱為“沙盒容器”,其唯一的工作就是保留和儲存由Pod中的所有容器共享的網路名稱空間(netns)。這樣,即使容器死亡,並且在其位置建立了一個新容器,容器IP也不會改變。這種按單機IP模式的巨大好處是與基礎主機之間沒有IP或埠衝突。而且,我們不必擔心應用程式使用哪個埠。

有了這個,Kubernetes 唯一的要求就是,這些Pod IP可以從其他所有Pod進行路由/訪問,而不管它們位於哪個節點上。

節點內通訊

第一步是確保同一節點上的Pod能夠互相通訊。然後將該思想擴充套件到跨節點,到Internet等的通訊。

在每個Kubernetes節點(在本例中為Linux機器)上,都有一個根網路名稱空間(根為基礎,而不是超級使用者)-root netns。

主網路介面eth0在此根netns中。

同樣,每個Pod都有其自己的網路,並且有一個虛擬乙太網對將其連線到根網路。這基本上是一個管道對,一端在根網中,另一端在pod網中。

我們將Pod-end命名為eth0,因此Pod不瞭解底層主機,並認為它具有自己的根網路設定。另一端的名稱類似於vethxxx。

可以使用ifconfig或ip a命令在節點上列出所有這些介面。

對節點上的所有Pod完成此操作。為了使這些Pod相互通訊,使用了Linux乙太網橋cbr0。Docker使用了一個類似的橋,名為docker0。

可以使用brctl show命令列出網橋。

假設一個數據包從pod1到pod2。

  1. 它將pod1的網路保留在eth0處,並將根網路保留在vethxxx。

  2. 將其傳遞給cbr0,後者使用ARP請求發現目的地,並說“誰擁有此IP?”

  3. vethyyy說它具有該IP,因此網橋知道將資料包轉發到何處。

  4. 資料包到達vethyyy,穿過管道對併到達pod2的網路。

這就是節點上的容器相互通訊的方式。顯然還有其他方法,但這可能是最簡單的方法.

節點間通訊

正如之前提到的,pod也必須在節點之間可訪問。Kubernetes並不關心它是如何完成的。我們可以使用L2(跨節點的ARP),L3(跨節點的IP路由-如雲提供商路由表)覆蓋網路。只要流量可以到達另一個節點上所需的Pod,這都沒有關係。每個節點都為Pod IP分配了唯一的CIDR塊(一系列IP地址),因此每個Pod具有一個唯一的IP,該IP與另一個節點上的Pod不衝突。

在大多數情況下,尤其是在雲環境中,雲提供商路由表可確保資料包到達正確的目的地。通過在每個節點上設定正確的路由,可以完成同一件事。還有許多其他的網路外掛也可以發揮自己的作用。

在這裡,我們有兩個節點,類似於我們之前看到的。每個節點都有各種網路名稱空間,網路介面和網橋。

假設一個數據包從pod1到pod4(在另一個節點上)。

  1. 它將pod1的網路保留在eth0處,並將根網路保留在vethxxx。

  2. 它傳遞給cbr0,後者發出ARP請求以查詢目的地。

  3. 它從cbr0傳到主網路介面eth0,因為此節點上沒有人具有pod4的IP地址。

  4. 它將離開node1,這時候src = pod1和dst = pod4。

  5. 路由表具有為每個節點CIDR塊設定的路由,並且將資料包路由到其CIDR塊包含pod4 IP的節點。

  6. 因此,資料包到達主網路介面eth0的node2。現在,即使pod4不是eth0的IP,由於已將節點配置為啟用IP轉發,因此資料包仍轉發到cbr0。在節點的路由表中查詢與pod4 IP匹配的所有路由。它找到cbr0作為此節點的CIDR塊的目標。可以使用route -n命令列出節點路由表.

  7. 橋接器接收資料包,發出ARP請求,然後發現IP屬於vethyyy。

  8. 資料包穿過管道對併到達pod4

以上就是Kubernetes網路的基礎內容,歡迎大家留言討論。

轉自

徹底搞懂 Kubernetes 的底層網路,看這幾張圖就夠了
https://mp.weixin.qq.com/s/Y1hMdeu-8xqGNuLChUlTbA