1. 程式人生 > 其它 >【K8s網路】確定最佳網路選項

【K8s網路】確定最佳網路選項

參考:https://docs.projectcalico.org/networking/determine-best-networking

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

相關概念

Kubernetes 網路基礎

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

  • 每個 pod 都有自己的 IP 地址。
  • 任何節點上的 Pod 都可以在沒有 NAT 的情況下與所有其他節點上的所有 Pod 通訊。

這建立了一個乾淨的、向後相容的模型,從埠分配、命名、服務發現、負載平衡、應用程式配置和遷移的角度來看,Pod 可以像 VM 或物理主機一樣對待。 可以使用網路策略來定義網路分段,以限制這些基本網路功能內的流量。

在這個模型中,有很大的靈活性來支援不同的網路方法和環境。 網路具體如何實施的細節取決於所使用的 CNI、網路和雲提供商外掛的組合。

CNI外掛

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

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

覆蓋網路

覆蓋網路是分層在另一個網路之上的網路。 在 Kubernetes 的上下文中,覆蓋網路可用於處理底層網路之上的節點之間的 Pod 到 Pod 流量,該網路不知道 Pod IP 地址或哪些 Pod 正在哪些節點上執行。 覆蓋網路的工作原理是將底層網路不知道如何處理的網路資料包(例如使用 pod IP 地址)封裝在底層網路知道如何處理的外部資料包中(例如節點 IP 地址)。 用於封裝的兩種常見網路協議是 VXLAN 和 IP-in-IP。

使用覆蓋網路的主要優點是它減少了對底層網路的依賴。 例如,您可以在幾乎任何底層網路之上執行 VXLAN 覆蓋,而無需與底層網路整合或對底層網路進行任何更改。

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

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

跨子網(Cross-subnet)覆蓋

除了標準的 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 與物理網路(通常是 Top 或 Rack 路由器)對等交換路由,形成一個非覆蓋網路,其中 pod IP 地址可在更廣泛的網路中路由,就像附加的任何其他工作負載一樣到網路。

關於 Calico 網路

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 外掛

Host local 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 網路。 這種組合有時被稱為“Canal”。

注意 :Calico 現在內建了對 VXLAN 的支援,為了簡單起見,我們通常建議優先使用 Calico+Flannel 組合。

作者:Varden 出處:http://www.cnblogs.com/varden/ 本文內容如有雷同,請聯絡作者! 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。