Kubernetes 網絡:了解網絡模型的完整指南
已發表: 2020-02-18容器管理是網絡的一個重要方面。 隨著當今不斷變化的流量需求,Kubernetes 的重要性增加了十倍。 如果你有興趣學習網絡,你必須先熟悉 Kubernetes。 了解 Kubernetes 將幫助您有效地處理容器管理。 Kubernetes 也是 2020 年市場上頂級的 DevOps 工具之一。
但請不要擔心,因為在本詳細指南中,我們將討論相同的內容。 Kubernetes 是一個容器管理工具,在本文中,您將了解使用它的原因、它的網絡組件是什麼以及它們如何路由流量。
從世界頂級大學在線學習軟件工程。 獲得行政 PG 課程、高級證書課程或碩士課程,以加快您的職業生涯。
讓我們潛入水中。
目錄
什麼是 Kubernetes?
在我們開始討論 Kubernetes 中的網絡之前,我們必須考慮這個工具的基本概念。 這樣,您就不會在本文後面遇到困惑,並對此處提到的所有內容有基本的了解。
Kubernetes 是一個開源的容器編排工具。 它可以幫助您管理容器,這已成為當今網絡最關鍵的方面。 Kubernetes 有很多功能,包括容器的擴容、容器的部署、容器的去擴容等。

Docker 幫助專業人員創建容器,而 Kubernetes 幫助他們管理容器。 這就是為什麼它們都如此重要。 Kubernetes 在集群上運行分佈式系統。 了解它的結構和網絡可以讓您避免錯誤並無錯誤地管理容器。
為什麼要使用 Kubernetes?
在過去的幾年裡,公司的容器需求大幅增加。 除非它們太小,否則它們不能依賴一兩個容器。 他們需要有大量的容器來進行負載平衡。 維持高可用性和平衡流量的要求可能有數百個。
當流量增加時,他們需要更多的容器來處理請求。 同樣,當流量減少時,他們將需要縮小容器。 根據需求管理容器可能具有挑戰性,尤其是如果您手動進行。
手動編排容器可能會花費大量時間和資源,而這些時間和資源很容易花在其他地方。 自動化此任務使事情變得簡單得多。 這樣您就不必擔心容器的縮放和除垢。 這就是 Kubernetes 所做的。 在我們面向初學者的頂級 DevOps 項目文章中閱讀如何在 Kubernetes 的幫助下為初學者創建 DevOps 項目。
它使容器的編排和管理自動化。 它因其功能而廣受歡迎。 它是 Google 的產品,其性能極大地幫助組織自動擴展容器。
Kubernetes 的組件
既然您知道 Kubernetes 是什麼以及它的功能是什麼,我們就可以開始討論它的多個組件了。 只有在熟悉了它的不同部分之後,您才能理解這個工具中的網絡。 然而,沒有什麼可擔心的。 那是因為我們是來幫忙的。 以下是對其各個組成部分的簡要說明。 雖然描述很簡潔,但應該足以讓您大致了解一下。
豆莢
還記得化學中的原子,最小的獨立物體嗎? 好吧,Pod 是 Kubernetes 的原子。 一個 Pod 是集群中的工作負載。 它可以包含一個或多個帶有存儲的容器。 每個 Pod 都有一個唯一的 IP 地址,當它與 Kubernetes 的其他組件交互時,它充當它的身份。 一個 pod 的所有容器都被調度並位於同一台機器中。
控制器
控制器構建 Kubernetes。 控制器監視 API 服務器的狀態,以確保其當前狀態與您指定的狀態相匹配。 如果 API 服務器的狀態由於某種原因發生變化,它會做出相應的反應。 控制器使用循環來檢查集群的狀態並將它們與所需的狀態進行比較。 它還可以執行將當前狀態更改為必要狀態的任務。
節點
如果說 Pod 是原子,那麼 Node 就是 Kubernetes 的齒輪。 他們運行集群。 虛擬機是 Kubernetes 集群中的可訪問節點。 許多人傾向於使用“主機”這個詞而不是“節點”。 我們嘗試在本文中始終如一地使用術語節點。
API 服務器
API 服務器是 Kubernetes 中數據存儲的網關。 它允許您為集群指定所需的狀態。 如果要更改 Kubernetes 集群的狀態並描述所需的狀態,則必須進行 API 調用。
由於您熟悉 Kubernetes 網絡的組件,我們可以從它的網絡模型及其工作原理開始。
Kubernetes 網絡解釋
Kubernetes 網絡遵循具有以下約束的特定模型:
- Pod 無需網絡地址轉換即可與所有其他 Pod 通信
- Nods 無需網絡地址轉換即可與 Pods 通信
- 其他 Pod 看到的 Pod 的 IP 與它看到的自己的 IP 相同
由於這些限制,Kubernetes 只有幾個網絡部分。 他們是:
- 集裝箱到集裝箱轉運
- Pod 到 Pod 傳輸
- Pod 到服務轉移
- 互聯網到服務傳輸
容器到容器
您可能認為在網絡中,虛擬機直接與以太網設備交互,但它的作用遠不止於此。
如果您使用的是 Linux,網絡命名空間將為您提供一個網絡堆棧,其中包含其網絡設備、路由和防火牆規則。 Linux 中每個正在運行的進程都將與這個網絡命名空間進行通信。

Pod 在網絡命名空間中擁有一組容器。 這些容器具有相同的端口空間和 IP 地址,通過網絡命名空間分配給它們。 這些容器通過 localhost 找到彼此,因為它們位於同一個命名空間中。 如果您的應用程序位於 pod 中,它們也可以訪問共享卷。
Pod 到 Pod
Pod 通過其 IP 地址相互通信。 每個 Pod 在 Kubernetes 中都有一個真實且不同的 IP 地址。 您已經知道 Pod 是什麼,因此我們無需觸及該主題。 我們知道 Kubernetes 使用 IP 來促進 pod 之間的通信; 讓我們討論一下它是如何做到的。
Pod 通過它們的節點進行通信。 這就是為什麼要了解 Pod 到 pod 的通信,並且您需要了解節點之間的交互。
- 節點間通信
- 節點內通信
我們將詳細討論它們中的每一個:
節點間通信
當節點位於不同的 pod 中時,它們將通過這種方法進行通信。 我們可以通過一個簡單的例子來理解這種通信方式。 假設有四個不同的 Pod 網絡,分別是 Pod 1、Pod 2、Pod 3,等等。 Pod 1 和 2 位於 Node 1 根網絡中,Pod 3 和 4 位於 2nd 網絡中。
您需要將數據包從 pod 1 傳輸到 pod 4。
數據包首先必須離開 pod 1 網絡並通過 veth0 進入根網絡。 它通過 Linux 網橋,這有助於它找到目的地。 由於節點在其 Pod 中沒有目標,因此將其發送回接口 eth0。 現在它為路由表留下第一個節點。 路由表將數據包路由到所需的節點,該節點位於 pod4 中。 數據包首先到達節點 2,然後到達網橋,網橋將其引導至目的地。
節點內通信
當節點位於同一個 Pod 中時,會發生節點內通信。 我們可以像解釋節點間通信一樣解釋節點內通信。 在這些情況下,數據包從位於 eth0 的第一個 Pod 傳輸。 它通過veth0進入根網絡。 然後它必須通過網橋,然後它會轉到指定的 IP。
這就是 Kubernetes 中 Pod 相互通信的方式。 讓我們進入下一部分。
Pod 到服務
您已經在上一節中看到了流量是如何在 Pod 的 IP 地址之間路由的。 但是,IP 地址存在問題。 Pod 的 IP 可以根據容器的縮放比例消失和重新出現。 所以,如果容器被縮放,Pod IP 的數量會增加,反之亦然。
這些服務有助於管理這種情況。 這裡簡單解釋一下 Kubernetes 裡面有哪些服務,大家不要有什麼疑惑。
Kubernetes 中的服務是什麼?
Kubernetes 中的服務配置必須將請求傳輸到一組 pod 的代理。 這些 pod 獲得流量,選擇器處理此任務。 創建服務後,它會收到一個處理其請求的 IP 地址。 服務有多種類型,我們必須在進入 Pod 進行服務通信之前討論它們。
Kubernetes 中一共有 4 種服務。 他們是:
- 集群IP
- 節點端口
- 負載均衡器
- 外部名稱
ClusterIP 是默認服務類型。 在這種類型中,服務只能在集群中訪問。 在 NodePort 中,服務暴露給每個節點的 IP。 當系統預先創建它時,NodePort 路由到 ClusterIP 服務。 與 ClusterIP 不同,您可以在集群外聯繫此服務。
LoadBalancer 使用雲的負載均衡器將服務公開給外部網絡。 NodePort 和 ClusterIP 是因為它而自動創建的,並且 ExternalName 服務將其傳輸為它反映了 CNAME 記錄。
現在您知道什麼是服務以及有多少種服務類型,讓我們討論一下 Pod 與服務之間的通信是如何發生的。
這個怎麼運作?
在這種情況下,數據包通過 eth0 離開 Pod。 它通過以太網設備到達網橋,從那里傳輸到默認路由 eth0。 但是,它必須通過 iptables 才能被 eth0 接受。 iptables 使用它擁有的指定規則確定數據包的目的地,並將數據包發送到所需的 Pod。 完成此操作後,數據包將轉到 pod 的真實 IP,而不是服務的虛擬 IP。
外部服務
前三種流量路由方法只涉及 Kubernetes。 但在實際情況下,您可能必須將 Kubernetes 網絡連接到第三方網絡以路由流量。 而這部分也差不多。
當與外部網絡連接時,Kubernetes 可以執行兩個功能:
- 將流量從互聯網路由到其網絡
- 將流量從其網絡路由到互聯網
前者需要一個 Ingress 網絡,後者需要一個 Egress 網絡。 讓我們來看看它們。
入口
將您的流量從公共網絡路由到您的 Kubernetes 系統是非常棘手的。 它需要 LoadBalancer 和 Controller 來處理數據包。 這是它如何工作的示例。
首先,您將部署一項服務,您的雲提供商將創建一個新的負載均衡器。 負載均衡器將使用服務的指定端口在集群內的虛擬機之間分配流量。 在這裡,iptables 將他們從負載均衡器獲得的流量傳輸到所需的 Pod。 Pod 將以其 IP 響應客戶端,conntrack 幫助以正確的方式重寫 IP。
網絡中的第 7 層負載均衡器能夠根據 URL 和路徑對傳入流量進行分段。 當您使用 Ingress 網絡時,這非常有用。
出口
當您將流量從 Kubernetes 網絡的節點路由到 Internet 時,很大程度上取決於您的網絡配置,以了解一切如何工作。 我們將在這裡討論一個一般性的例子來觸及這個話題。
數據包從 Pod 的命名空間開始,通過 veth 到達根命名空間。 然後它會從它前往默認服務的網橋轉到默認服務,因為它需要去的 IP 與網橋無關。 它在進入根命名空間時通過 iptables。

閱讀: DevOps 的先決條件:這不是你想的那樣
現在 Internet 網關只接受與虛擬機連接的 IP 地址。 而且我們口袋的源 pod 沒有與 VM 連接。 所以 iptables 做一個源 NAT 並改變數據包的源。 現在它到達 Internet 網關,在那裡它通過另一個 NAT,然後進入公共 Internet(其目的地)。
就是這樣。 現在您了解了 Kubernetes 網絡及其各種組件。
結論
如果您對網絡感興趣,Kubernetes 無疑是您應該學習的基本工具之一。 不熟悉這個領域的人不會知道它的重要性。 根據這些流量要求管理容器和路由流量可以為您提供很大幫助。 我們已盡力使本指南盡可能清晰,以幫助您了解所有內容。
如果您想學習和掌握 Kubernetes、DevOps 等,請查看 IIIT-B 和 upGrad 的軟件開發執行 PG 計劃 - 全棧開發專業化。