Calico 組網(Networking)

夜尽天明bylaw發表於2024-05-20

確定最佳網路選項

瞭解 Calico 支援的不同網路選項,以便您可以選擇最適合您需求的選項。Calico 靈活的模組化架構支援廣泛的部署選項,因此您可以選擇適合您的特定環境和需求的最佳網路方法。這包括能夠以非覆蓋或覆蓋模式、帶或不帶 BGP 執行各種 CNI 和 IPAM 外掛以及底層網路型別。

如果您想完全瞭解可用的網路選擇,我們建議您確保熟悉並理解以下概念。如果您想跳過學習並直接瞭解選擇和建議,您可以跳至網路選項。

Kubernetes 網路基礎知識

Kubernetes 網路模型定義了一個“扁平”網路,其中:

  • 每個 Pod 都有自己的 IP 地址。
  • 任何節點上的 Pod 都可以與所有其他節點上的所有 Pod 通訊,無需 NAT。

這建立了一個乾淨的、向後相容的模型,從埠分配、命名、服務發現、負載平衡、應用程式配置和遷移的角度來看,可以像虛擬機器或物理主機一樣對待 Pod。可以使用網路策略來定義網路分段,以限制這些基本網路功能內的流量。
在這個模型中,有很大的靈活性來支援不同的網路方法和環境。網路具體實現方式的細節取決於所使用的 CNI、網路和雲提供商外掛的組合。

CNI 外掛

CNI(容器網路介面)是一個標準 API,允許不同的網路實現插入 Kubernetes。每當建立或銷燬 Pod 時,Kubernetes 都會呼叫該 API。 CNI 外掛有兩種型別:

  • CNI 網路外掛:負責向 Kubernetes Pod 網路新增或刪除 Pod。這包括建立/刪除每個 Pod 的網路介面以及將其連線/斷開與網路實現的其餘部分的連線。
  • CNI IPAM 外掛:負責在建立或刪除 Pod 時為其分配和釋放 IP 地址。根據外掛的不同,這可能包括為每個節點分配一個或多個 IP 地址範圍 (CIDR),或者從底層公共雲網路獲取 IP 地址以分配給 Pod。

雲提供商整合

Kubernetes 雲提供商整合是特定於雲的控制器,可以配置底層雲網路以幫助提供 Kubernetes 網路。根據雲提供商的不同,這可能包括自動將路由程式設計到底層雲網路中,以便它本身知道如何路由 Pod 流量。

Kubenet

Kubenet 是 Kubernetes 內建的一個非常基本的網路外掛。它不實現跨節點網路或網路策略。它通常與雲提供商整合一起使用,該整合在雲提供商網路中設定路由,以便在節點之間或單節點環境中進行通訊。 Kubenet 與 Calico 不相容。

覆蓋網路

覆蓋網路是分層在另一個網路之上的網路。在 Kubernetes 環境中,覆蓋網路可用於處理底層網路頂部節點之間的 pod 到 pod 流量,該網路不知道 pod IP 地址或哪些 pod 正在哪些節點上執行。覆蓋網路的工作原理是將底層網路不知道如何處理(例如使用 Pod IP 地址)的網路資料包封裝在底層網路知道如何處理(例如節點 IP 地址)的外部資料包中。用於封裝的兩種常見網路協議是 VXLAN 和 IP-in-IP。
使用覆蓋網路的主要優點是它減少了對底層網路的依賴。例如,您可以在幾乎任何底層網路之上執行 VXLAN 覆蓋,而無需與底層網路整合或對其進行任何更改。

使用覆蓋網路的主要缺點是:

  • 對效能有輕微影響。封裝資料包的過程需要佔用少量 CPU,並且資料包中需要額外的位元組來對封裝進行編碼(VXLAN 或 IP-in-IP 標頭),從而減少了可傳送的內部資料包的最大大小,從而可以減少內部資料包的大小。意味著需要為相同數量的總資料傳送更多資料包。
  • Pod IP 地址在叢集外部不可路由。下面詳細介紹這一點!

跨子網覆蓋

除了標準 VXLAN 或 IP-in-IP 覆蓋之外,Calico 還支援 VXLAN 和 IP-in-IP 的“跨子網”模式。在此模式下,在每個子網內,底層網路充當 L2 網路。在單個子網內傳送的資料包不會被封裝,因此您可以獲得非覆蓋網路的效能。跨子網傳送的資料包被封裝,就像普通的覆蓋網路一樣,減少了對底層網路的依賴(無需與底層網路整合或對其進行任何更改)。
就像標準覆蓋網路一樣,底層網路不知道 Pod IP 地址,並且 Pod IP 地址在叢集外部不可路由。

Pod IP 在叢集外部的可路由性

不同 Kubernetes 網路實現的一個重要區別特徵是 Pod IP 地址是否可以透過更廣泛的網路在叢集外部路由。

不可路由

如果 Pod IP 地址在叢集外部不可路由,那麼當 Pod 嘗試與叢集外部的 IP 地址建立網路連線時,Kubernetes 將使用一種稱為 SNAT(源網路地址轉換)的技術來更改源 IP地址從 Pod 的 IP 地址到託管 Pod 的節點的 IP 地址。連線上的任何返回資料包都會自動對映回 pod IP 地址。因此,Pod 不知道 SNAT 正在發生,連線的目的地將該節點視為連線的源,而底層更廣泛的網路永遠不會看到 Pod IP 地址。
對於相反方向的連線,即叢集外部的東西需要連線到 Pod,這隻能透過 Kubernetes 服務或 Kubernetes 入口來完成。叢集外部的任何內容都無法直接連線到 Pod IP 地址,因為更廣泛的網路不知道如何將資料包路由到 Pod IP 地址。

可路由

如果 Pod IP 地址在叢集外部可路由,則 Pod 可以在沒有 SNAT 的情況下連線到外部世界,並且外部世界可以直接連線到 Pod,而無需透過 Kubernetes 服務或 Kubernetes 入口。

可在叢集外部路由的 pod IP 地址的優點是:

  • 避免出站連線的 SNAT 對於整合現有的更廣泛的安全要求可能至關重要。它還可以簡化除錯和操作日誌的理解。
  • 如果您有專門的工作負載,這意味著需要直接訪問某些 pod,而無需透過 Kubernetes 服務或 Kubernetes 入口,那麼可路由 pod IP 在操作上可能比使用主機聯網 pod 的替代方案更簡單。
    可在叢集外部路由的 Pod IP 地址的主要缺點是 Pod IP 在更廣泛的網路中必須是唯一的。例如,如果執行多個叢集,您將需要為每個叢集中的 Pod 使用不同的 IP 地址範圍 (CIDR)。當大規模執行時,或者企業對 IP 地址空間存在其他重大需求時,這反過來可能會導致 IP 地址範圍耗盡的挑戰。

什麼決定了可路由性?

如果您的叢集使用覆蓋網路,則 Pod IP 通常無法在叢集外部路由。
如果您不使用覆蓋網路,那麼 Pod IP 是否可在叢集外部路由取決於所使用的 CNI 外掛、雲提供商整合或(對於本地)與物理網路對等的 BGP 的組合。

BGP

BGP(邊界閘道器協議)是一種基於標準的網路協議,用於跨網路共享路由。它是網際網路的基本構建模組之一,具有卓越的擴充套件特性。
Calico 內建了對 BGP 的支援。在本地部署中,這允許 Calico 與物理網路(通常是架頂式路由器)對等以交換路由,從而形成一個非覆蓋網路,其中 pod IP 地址可在更廣泛的網路中路由,就像附加的任何其他工作負載一樣到網路。

關於 Calico Networking

Calico 靈活的網路模組化架構包括以下內容。

Calico CNI 網路外掛

Calico CNI 網路外掛使用一對虛擬乙太網裝置(veth 對)將 Pod 連線到主機網路名稱空間的 L3 路由。這種 L3 架構避免了許多其他 Kubernetes 網路解決方案中額外的 L2 橋帶來的不必要的複雜性和效能開銷。

Calico CNI IPAM 外掛

Calico CNI IPAM 外掛從一個或多個可配置的 IP 地址範圍中為 Pod 分配 IP 地址,根據需要動態為每個節點分配小塊 IP。與許多其他 CNI IPAM 外掛(包括許多網路解決方案中使用的主機本地 IPAM 外掛)相比,IP 地址空間使用效率更高。

覆蓋網路模式

Calico 可以提供 VXLAN 或 IP-in-IP 覆蓋網路,包括僅跨子網模式。

非覆蓋網路模式

Calico 可以提供在任何底層 L2 網路或 L3 網路之上執行的非覆蓋網路,該網路可以是具有適當雲提供商整合的公共雲網路,也可以是支援 BGP 的網路(通常是具有標準 Top-of 的本地網路) - 機架路由器)

網路策略執行

Calico 的網路策略執行引擎實現了全方位的 Kubernetes 網路策略功能,以及 Calico 網路策略的擴充套件功能。這與 Calico 的內建網路模式或任何其他 Calico 相容的網路外掛和雲提供商整合結合使用。

Calico 相容的 CNI 外掛和雲提供商整合

除了 Calico CNI 外掛和內建網路模式之外,Calico 還與許多第三方 CNI 外掛和雲提供商整合相容。

亞馬遜 VPC CNI

Amazon VPC CNI 外掛從底層 AWS VPC 分配 Pod IP,並使用 AWS 彈性網路介面提供 VPC 本機 Pod 網路(可在叢集外部路由的 Pod IP)。它是 Amazon EKS 中使用的預設網路,並使用 Calico 執行網路策略。

Azure CNI

Azure CNI 外掛從底層 Azure VNET 分配 Pod IP,配置 Azure 虛擬網路以提供 VNET 本機 Pod 網路(可在群集外部路由的 Pod IP)。它是 Microsoft AKS 中使用的預設網路,並使用 Calico 來實施網路策略。

Azure 雲提供商

Azure 雲提供商整合可用作 Azure CNI 外掛的替代方案。它使用主機本地 IPAM CNI 外掛來分配 Pod IP,並使用相應的路由對底層 Azure VNET 子網進行程式設計。 Pod IP 只能在 VNET 子網內路由(這通常意味著它們在叢集外部不可路由)。

谷歌雲提供商

Google 雲提供商整合使用主機本地 IPAM CNI 外掛來分配 Pod IP,並對 Google 雲網路別名 IP 範圍進行程式設計,以在 Google 雲上提供 VPC 本機 Pod 網路(可在叢集外部路由的 Pod IP)。它是 Google Kubernetes Engine (GKE) 的預設設定,並使用 Calico 執行網路策略。

主機本地 IPAM

主機本地 CNI IPAM 外掛是常用的 IP 地址管理 CNI 外掛,它為每個節點分配固定大小的 IP 地址範圍(CIDR),然後從該範圍內分配 pod IP 地址。預設地址範圍大小為 256 個 IP 地址 (a /24),但其中兩個 IP 地址保留用於特殊用途且未分配給 Pod。主機本地 CNI IPAM 外掛的簡單性使其易於理解,但與 Calico CNI IPAM 外掛相比,會導致 IP 地址空間使用效率較低。

Flannel

Flannel 使用從主機本地 IPAM CNI 外掛獲取的靜態每節點 CIDR 路由 pod 流量。 Flannel 提供了許多網路後端,但主要與其 VXLAN 覆蓋後端一起使用。 Calico CNI 和 Calico 網路策略可以與 flannel 和主機本地 IPAM 外掛相結合,為 VXLAN 網路提供策略實施。這種組合有時被稱為“運河”。
Calico 現在內建了對 VXLAN 的支援,為了簡單起見,我們通常建議優先使用 Calico+Flannel 組合。

組網選項

組網分為5個大類,包括:Policy、IPAM、CNI、是否Overlay、Routing,每個雲廠商都有自己實現,列出如下

選項 備註
Policy(calico) Kubernetes 網路策略是透過網路外掛而不是 Kubernetes 本身來實現的。簡單地建立網路策略資源而不使用網路外掛來實現它,不會對網路流量產生影響。 Calico 外掛實現了全套 Kubernetes 網路策略功能。此外,Calico 支援 Calico 網路策略,提供 Kubernetes 網路策略之外的附加特性和功能。 Kubernetes 和 Calico 網路策略無縫協作,因此您可以選擇最適合您的策略,並根據需要進行混合和匹配。
IPAM(calico) Kubernetes 如何為 Pod 分配 IP 地址由所使用的 IPAM(IP 地址管理)外掛決定。 Calico IPAM 外掛根據需要動態地將小塊 IP 地址分配給節點,以有效地整體利用可用的 IP 地址空間。此外,Calico IPAM 支援高階功能,例如多個 IP 池、指定名稱空間或 Pod 應使用的特定 IP 地址範圍的能力,甚至是 Pod 應使用的特定 IP 地址。
CNI(calico) Kubernetes 使用的 CNI(容器網路介面)外掛決定了 Pod 如何連線到底層網路的詳細資訊。 Calico CNI 外掛使用 L3 路由將 Pod 連線到主機網路,而不需要 L2 橋接器。這簡單易懂,並且比 kubenet 或 flannel 等其他常見替代方案更高效。
CNI(calico) Kubernetes 使用的 CNI(容器網路介面)外掛決定了 Pod 如何連線到底層網路的詳細資訊。 Calico CNI 外掛使用 L3 路由將 Pod 連線到主機網路,而不需要 L2 橋接器。這簡單易懂,並且比 kubenet 或 flannel 等其他常見替代方案更高效。
Overlay(NO) 在不使用覆蓋的情況下執行可提供最高效能的網路。離開 Pod 的資料包是透過網路傳輸的資料包。 相反,為了完整起見,在覆蓋網路中,不同節點上的 Pod 之間的資料包使用 VXLAN 或 IPIP 等協議進行封裝,將每個原始資料包包裝在使用節點 IP 的外部資料包中,並隱藏內部資料包的 Pod IP 。 Linux 核心可以非常有效地完成此操作,但它仍然會產生很小的開銷,如果執行特別網路密集型工作負載,您可能希望避免這種情況。
Routing(BGP) BGP(邊界閘道器協議)用於動態規劃節點之間 Pod 流量的路由。 BGP 是用於構建網際網路的基於標準的路由協議。它的擴充套件性非常好,與 BGP 可以處理的負載相比,即使是最大的 Kubernetes 叢集也只代表很小的負載。 Calico 可以以三種模式執行 BGP:全網狀 - 每個節點在底層 L2 網路之上或使用 IPIP 覆蓋相互通訊 BGP,輕鬆擴充套件到 100 個節點 - 使用路由反射器 - 每個節點與一個或多個 BGP 路由反射器通訊,可擴充套件到 100 個以上節點,位於底層 L2 網路之上或使用 IPIP 覆蓋 - 與 TOR(機架頂部)路由器對等 - 在物理資料中心中,每個節點與相應機架頂部的路由器進行通訊,從而擴充套件到物理資料中心的限制。
cross-subnet(vxlan) 使用 Calico 的跨子網 VXLAN 模式,同一子網上的 Pod 之間的流量不使用 Overlay,而不同子網上的 Pod 之間的流量將透過 VXLAN Overlay。 同一子網內節點上的 Pod 之間的資料包在不使用覆蓋的情況下傳送,以提供最佳的網路效能。 不同子網的節點上的 Pod 之間的資料包使用 IPIP 進行封裝,將每個原始資料包包裝在使用節點 IP 的外部資料包中,並隱藏內部資料包的 Pod IP。 Linux 核心可以非常有效地完成此操作,但與非覆蓋流量相比,它仍然表示很小的開銷。
cross-subnet(ipip) 使用 Calico 的跨子網 IPIP 模式,同一子網上的 Pod 之間的流量不使用 Overlay,而不同子網上的 Pod 之間的流量將透過 IPIP Overlay。 同一子網內節點上的 Pod 之間的資料包在不使用覆蓋的情況下傳送,以提供最佳的網路效能。 不同子網的節點上的 Pod 之間的資料包使用 IPIP 進行封裝,將每個原始資料包包裝在使用節點 IP 的外部資料包中,並隱藏內部資料包的 Pod IP。 Linux 核心可以非常有效地完成此操作,但與非覆蓋流量相比,它仍然表示很小的開銷。
IPAM(aws) Kubernetes 如何為 Pod 分配 IP 地址由所使用的 IPAM(IP 地址管理)外掛決定。 AWS IPAM 外掛使用底層 VPC(虛擬私有云)的 IP 地址,根據需要動態地將小塊 IP 地址分配給節點。 AWS IPAM 外掛與 Amazon VPC CNI 外掛結合使用,以提供 VPC 本機 Pod 網路。
CNI(aws) Kubernetes 使用的 CNI(容器網路介面)外掛決定了 Pod 如何連線到底層網路的詳細資訊。 AWS Amazon VPC CNI 和 IPAM 外掛為 Pod 提供來自底層 VPC(虛擬私有云)的 IP 地址,以提供 VPC 原生 Pod 網路。 AWS VPC 用於在節點之間路由 Pod 流量,並瞭解哪個 Pod IP 地址位於哪些節點上。這避免了對覆蓋的需要,並且通常具有良好的網路效能特徵。 此外,Pod IP 可以被更廣泛的 AWS 網路所理解,因此,例如,如果需要,叢集外部的虛擬機器可以直接連線到任何 Pod,而無需透過 Kubernetes 服務。
Routing(calico) Calico 路由使用其資料儲存來分配和程式設計節點之間 pod 流量的路由,而無需 BGP。 Calico 路由支援單個子網內的未封裝流量,以及跨多個子網的叢集的選擇性 VXLAN 封裝。
IPAM(Azure) Kubernetes 如何為 Pod 分配 IP 地址由所使用的 IPAM(IP 地址管理)外掛決定。 Azure IPAM 外掛使用來自底層 VNET(虛擬網路)的 IP 地址,根據需要動態地將小塊 IP 地址分配給節點。 Azure IPAM 外掛與 Azure CNI 外掛結合使用,提供 VPC 本機 Pod 網路。
CNI (Azure) Kubernetes 使用的 CNI(容器網路介面)外掛決定了 Pod 如何連線到底層網路的詳細資訊。 Azure CNI 和 IPAM 外掛為 Pod 提供來自底層 Azure VNET(虛擬網路)的 IP 地址,以提供 VPC 本機 Pod 網路。 Azure VNET 用於在節點之間路由 Pod 流量,並瞭解哪個 Pod IP 地址位於哪些節點上。這避免了對覆蓋的需要,並且通常具有良好的網路效能特徵。 此外,Pod IP 可以被更廣泛的 AWS 網路所理解,因此,例如,如果需要,叢集外部的虛擬機器可以直接連線到任何 Pod,而無需透過 Kubernetes 服務。
Routing (VPC Native) 底層雲VPC(虛擬私有云)用於路由節點之間的Pod流量,並瞭解哪些Pod IP地址位於哪些節點上。這避免了對覆蓋的需要,並且通常具有良好的效能特徵。 此外,Pod IP 可以被更廣泛的雲網路所理解,因此,例如,如果需要,叢集外部的虛擬機器可以直接連線到任何 Pod,而無需透過 Kubernetes 服務。

本地部署

Calico on-prem 最常見的網路設定是非覆蓋模式,使用 BGP 與物理網路(通常是架頂式路由器)對等,以使 Pod IP 在叢集外部可路由。 (當然,如果需要,您可以配置本地網路的其餘部分,以限制叢集外部 pod IP 路由的範圍。)此設定提供了豐富的高階 Calico 功能,包括通告 Kubernetes 服務 IP 的能力(叢集 IP 或外部 IP),以及在 Pod、名稱空間或節點級別控制 IP 地址管理的能力,以支援與現有企業網路和安全要求整合的各種可能性。

如果無法將 BGP 與物理網路對等互連,並且叢集位於單個 L2 網路內,則您還可以執行非覆蓋模式,而 Calico 僅在叢集中的節點之間對等 BGP。儘管這不是嚴格意義上的覆蓋網路,但 Pod IP 無法在叢集外部路由,因為更廣泛的網路沒有 Pod IP 的路由。
或者,您可以在 VXLAN 或 IP-in-IP 覆蓋模式下執行 Calico,並使用跨子網覆蓋模式來最佳化每個 L2 子網內的效能。
推薦:

AWS

如果您希望 Pod IP 地址可在叢集外部路由,則必須使用 Amazon VPC CNI 外掛。這是 EKS 的預設網路模式,使用 Calico 進行網路策略。 Pod IP 地址是從底層 VPC 分配的,每個節點的最大 Pod 數量取決於例項型別。

如果您希望避免對特定雲提供商的依賴,或者由於 IP 地址範圍耗盡的挑戰,從底層 VPC 分配 Pod IP 會出現問題,或者 Amazon VPC CNI 外掛支援的每個節點的最大 Pod 數量不足以滿足根據您的需求,我們建議在跨子網覆蓋模式下使用 Calico 網路。 Pod IP 無法在叢集外部路由,但您可以將叢集擴充套件到 Kubernetes 的限制,而不依賴於底層雲網路。

Azure

如果您希望 Pod IP 地址可在叢集外部路由,則必須使用 Azure CNI 外掛。這是由 AKS 支援的,並使用 Calico 進行網路策略。 Pod IP 地址是從底層 VNET 分配的。

如果想要使用 AKS,但由於 IP 地址範圍耗盡的挑戰,從底層 VNET 分配 Pod IP 會出現問題,則可以將 Calico 與 Azure 雲提供商整合結合使用。這使用主機本地 IPAM 為每個節點分配 /24,並在叢集的底層 VNET 子網內為這些 /24 程式設計路由。 Pod IP 在叢集/VNET 子網之外不可路由,因此如果需要,可以跨多個叢集使用相同的 Pod IP 地址範圍 (CIDR)。
在一些 AKS 文件中,這被稱為 kubenet + Calico,但它實際上是 Azure 雲提供商的 Calico CNI,並且不使用 kubenet 外掛。

Google Cloud

如果您希望 Pod IP 地址可在叢集外部路由,則必須將 Google 雲提供商整合與主機本地 IPAM CNI 外掛結合使用。這由 GKE 支援,並使用 Calico 進行網路策略。 Pod IP 地址是從底層 VPC 分配的,相應的 Alias IP 地址會自動分配給節點。

如果您希望避免依賴於特定雲提供商,或者由於 IP 地址範圍耗盡的挑戰,從底層 VPC 分配 Pod IP 會出現問題,我們建議在覆蓋模式下使用 Calico 網路。由於Google雲網路是純L3網路,不支援跨子網模式。 Pod IP 無法在叢集外部路由,但您可以將叢集擴充套件到 Kubernetes 的限制,而不依賴於底層雲網路。

IBM Cloud

如果您使用 IBM Cloud,那麼我們建議使用 IKS,它內建了 Calico 以提供跨子網 IP-in-IP 覆蓋。除了為 Pod 提供網路策略之外,IKS 還使用 Calico 網路策略來保護叢集內的主機節點。

任何地方

上面的環境列表顯然並不詳盡。瞭解本指南中的概念和解釋有望幫助您找出適合您環境的內容。如果您仍然不確定,可以透過 Calico 使用者的 Slack 或 Discourse 論壇尋求建議。
請記住,如果您想開始使用而不必太擔心不同的選項,那麼您幾乎可以在任何環境中以 VXLAN 覆蓋模式執行 Calico。

相關文章