跳至主要内容

容器網路介面 (CNI) 提供者

什麼是 CNI?​

CNI (Container Network Interface,容器網路介面) 是一個 Cloud Native Computing Foundation 專案,包含用於編寫外掛程式以設定 Linux 容器中網路介面的規範和函式庫,以及許多外掛程式。CNI 僅關注容器的網路連線性,以及在刪除容器時移除分配的資源。

Kubernetes 使用 CNI 作為網路提供者和 Kubernetes pod 網路之間的介面。

CNI Logo

如需更多資訊,請造訪 CNI GitHub 專案。

CNI 使用哪些網路模型?​

CNI 網路提供者使用封裝網路模型 (例如 Virtual Extensible Lan (VXLAN)) 或未封裝網路模型 (例如 Border Gateway Protocol (BGP)) 來實作其網路架構。

什麼是封裝網路?​

此網路模型提供一個邏輯第 2 層 (L2) 網路,封裝在橫跨 Kubernetes 叢集節點的現有第 3 層 (L3) 網路拓撲之上。使用此模型,您可以為容器提供隔離的 L2 網路,而無需路由分發,但代價是在處理和增加的 IP 封包大小方面有最小的開銷,這來自於覆蓋封裝產生的 IP 標頭。封裝資訊透過 Kubernetes worker 之間的 UDP 連接埠分發,交換有關如何到達 MAC 位址的網路控制平面資訊。此類網路模型中使用的常見封裝包括 VXLAN、Internet Protocol Security (IPSec) 和 IP-in-IP。

簡單來說,此網路模型產生一種在 Kubernetes worker 之間延伸的網路橋接器,pod 連接到該橋接器。

當偏好延伸的 L2 橋接器時,會使用此網路模型。此網路模型對 Kubernetes worker 的 L3 網路延遲敏感。如果資料中心位於不同的地理位置,請確保它們之間的延遲較低,以避免可能的網路分段。

使用此網路模型的 CNI 網路提供者包括 Flannel、Canal、Weave 和 Cilium。預設情況下,Calico 不使用此模型,但可以設定為使用。

Encapsulated Network

什麼是未封裝網路?​

此網路模型提供 L3 網路來路由容器之間的封包。此模型不會產生隔離的 L2 網路,也不會產生開銷。這些好處的代價是 Kubernetes worker 必須管理所需的任何路由分發。此網路模型不使用 IP 標頭進行封裝,而是使用 Kubernetes worker 之間的網路協定來分發路由資訊以到達 pod,例如 BGP。

簡單來說,此網路模型產生一種在 Kubernetes worker 之間延伸的網路路由器,提供有關如何到達 pod 的資訊。

當偏好路由的 L3 網路時,會使用此網路模型。此模式在 OS 層級為 Kubernetes worker 動態更新路由。它對延遲不太敏感。

使用此網路模型的 CNI 網路提供者包括 Calico 和 Cilium。Cilium 可以設定為使用此模型,儘管這不是預設模式。

Unencapsulated Network

Rancher 提供哪些 CNI 提供者?​

RKE2 Kubernetes 叢集​

開箱即用,Rancher 為 RKE2 Kubernetes 叢集提供以下 CNI 網路提供者:Calico、Canal、Cilium 和 Flannel。

您可以在從 Rancher 建立新的 Kubernetes 叢集時選擇您的 CNI 網路提供者。

Calico​

Calico Logo

Calico 在跨雲端的 Kubernetes 叢集中啟用網路和網路策略。預設情況下,Calico 使用純粹的、未封裝的 IP 網路架構和策略引擎為您的 Kubernetes 工作負載提供網路。工作負載能夠使用 BGP 透過雲端基礎設施和本地端進行通訊。

Calico 還提供無狀態的 IP-in-IP 或 VXLAN 封裝模式,可以在必要時使用。Calico 還提供策略隔離,允許您使用進階的入口和出口策略來保護和管理您的 Kubernetes 工作負載。

如果使用 BGP,Kubernetes worker 應開啟 TCP 連接埠 179,如果使用 VXLAN 封裝,則應開啟 UDP 連接埠 4789。此外,使用 Typha 時需要 TCP 連接埠 5473。有關更多詳細資訊,請參閱使用者叢集的連接埠需求。

重要:

在 Rancher v2.6.3 中,Calico 探測在 RKE2 安裝時在 Windows 節點上失敗。請注意,此問題已在 v2.6.4 中解決。

  • 要解決此問題,請先導航至 https://<rancherserverurl>/v3/settings/windows-rke2-install-script。

  • 在那裡,將當前設定: https://raw.githubusercontent.com/rancher/wins/v0.1.3/install.ps1 變更為此新設定: https://raw.githubusercontent.com/rancher/rke2/master/windows/rke2-install.ps1。

Calico Diagram

如需更多資訊,請參閱以下頁面:

Canal​

Canal Logo

Canal 是一個 CNI 網路提供者,為您提供 Flannel 和 Calico 的優點。它允許使用者輕鬆地將 Calico 和 Flannel 網路一起部署為統一的網路解決方案,將 Calico 的網路策略執行與 Calico (未封裝) 和/或 Flannel (封裝) 網路連線選項的豐富超集相結合。

在 Rancher 中,Canal 是預設的 CNI 網路提供者,與 Flannel 和 VXLAN 封裝結合使用。

Kubernetes worker 應開啟 UDP 連接埠 8472 (VXLAN) 和 TCP 連接埠 9099 (健康檢查)。如果使用 Wireguard,您應開啟 UDP 連接埠 51820 和 51821。有關更多詳細資訊,請參閱使用者叢集的連接埠需求。

如需更多資訊,請參閱 Canal GitHub 頁面。

Cilium​

Cilium Logo

Cilium 在 Kubernetes 中啟用網路和網路策略 (L3、L4 和 L7)。預設情況下,Cilium 使用 eBPF 技術在節點內路由封包,並使用 VXLAN 將封包傳送到其他節點。也可以設定未封裝的技術。

Cilium 建議核心版本大於 5.2,以充分利用 eBPF 的全部潛力。Kubernetes worker 應為 VXLAN 開啟 TCP 連接埠 8472,為健康檢查開啟 TCP 連接埠 4240。此外,必須啟用 ICMP 8/0 進行健康檢查。有關更多資訊,請查看 Cilium 系統需求。

Cilium 中跨節點的 Ingress 路由​

預設情況下,Cilium 不允許 pod 與其他節點上的 pod 聯繫。要解決此問題,請啟用 ingress 控制器以使用 CiliumNetworkPolicy 跨節點路由請求。

選擇 Cilium CNI 並為新叢集啟用專案網路隔離後,請進行以下設定:

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: hn-nodes
namespace: default
spec:
endpointSelector: {}
ingress:
- fromEntities:
- remote-node

Flannel​

Flannel Logo

Flannel 是一種為 Kubernetes 設計的設定 L3 網路架構的簡單易用方法。Flannel 在每個主機上執行一個名為 flanneld 的單一二進位代理,負責從較大的預配置位址空間為每個主機分配子網路租約。Flannel 使用 Kubernetes API 或直接使用 etcd 來儲存網路配置、分配的子網路和任何輔助資料 (例如主機的公共 IP)。封包使用幾種後端機制之一進行轉發,預設封裝為 VXLAN。

預設情況下,封裝的流量未加密。Flannel 提供兩種加密解決方案:

  • IPSec,它使用 strongSwan 在 Kubernetes worker 之間建立加密的 IPSec 隧道。這是一個實驗性的加密後端。
  • WireGuard,這是 strongSwan 的效能更快的替代方案。

Kubernetes worker 應開啟 UDP 連接埠 8472 (VXLAN)。有關更多詳細資訊,請參閱使用者叢集的連接埠需求。

Flannel Diagram

如需更多資訊,請參閱 Flannel GitHub 頁面。

各提供者的 CNI 功能​

下表總結了 Rancher 提供的每個 CNI 網路提供者可用的不同功能。

提供者網路模型路由分發網路策略Mesh外部資料儲存加密Ingress/Egress 策略
Canal封裝 (VXLAN)否是否K8s API是是
Flannel封裝 (VXLAN)否否否K8s API是否
Calico封裝 (VXLAN,IPIP) 或 未封裝是是是Etcd 和 K8s API是是
Weave封裝是是是否是是
Cilium封裝 (VXLAN)是是是Etcd 和 K8s API是是
  • 網路模型: 封裝或未封裝。有關更多資訊,請參閱 CNI 使用哪些網路模型?

  • 路由分發: 一種外部閘道協定,旨在在網際網路上交換路由和可達性資訊。BGP 可以協助叢集之間的 pod 到 pod 網路。此功能在未封裝的 CNI 網路提供者上是必須的,通常由 BGP 完成。如果您計劃建置跨網路區段的叢集,路由分發是一個很好的功能。

  • 網路策略: Kubernetes 提供使用網路策略強制執行有關哪些服務可以相互通訊的規則的功能。此功能從 Kubernetes v1.7 開始穩定,並且可以與某些網路外掛程式一起使用。

  • Mesh: 此功能允許不同 Kubernetes 叢集之間的服務到服務網路通訊。

  • 外部資料儲存: 具有此功能的 CNI 網路提供者需要外部資料儲存來儲存其資料。

  • 加密: 此功能允許加密和安全的網路控制和資料平面。

  • Ingress/Egress 策略: 此功能允許您管理 Kubernetes 和非 Kubernetes 通訊的路由控制。

CNI 社群熱門度​

下表顯示了基於 GitHub 星數和社群採用度的 Kubernetes 社群中 CNI 網路提供者的相對流行度:

CNI 提供者GitHub 星數活躍貢獻者社群採用度
CalicoHighHighVery High
FlannelHighMediumVery High
CanalN/A*N/A*High
CiliumVery HighVery HighHigh
WeaveMediumLowMedium

*Canal 是 Flannel 和 Calico 的組合,因此沒有單獨的指標。

備註

這些指標會隨著 Kubernetes 生態系統的演進而變化。如需最新資訊,請參閱各自的 GitHub 儲存庫和 CNCF 專案統計資料。

我應該使用哪個 CNI 提供者?​

這取決於您的專案需求。有許多不同的提供者,每個提供者都有各種功能和選項。沒有一個提供者能滿足每個人的需求。

Canal 是預設的 CNI 網路提供者。我們建議在大多數使用案例中使用它。它為容器提供使用 Flannel 的封裝網路,同時新增 Calico 網路策略,可以在網路方面提供專案/命名空間隔離。

如何設定 CNI 網路提供者?​

請參閱叢集選項以了解如何為您的叢集設定網路提供者。有關更進階的設定選項,請參閱如何使用設定檔設定您的叢集。