K8s CNI 比較:Cilium、Calico 與 Flannel

K8s CNI 比較:Cilium、Calico 與 Flannel的重點整理。

K8s CNI 比較:Cilium、Calico 與 Flannel

Bridge 與 CNI:考前先看

一句話 Bridge 是主機內的虛擬 L2 switch;CNI 是容器網路設定介面;Calico/Cilium/Flannel 是網路方案。三者不在同一個層次。

同 Node 的入門模型:Pod netns → veth → Linux bridge → 另一個 Pod。Bridge 依 MAC 轉送 frame,不能單靠一座 bridge 解決跨 Node 路由與 NetworkPolicy;實際 CNI 也不一定使用 bridge。

類別 名稱 記法
網路連接 plugin/技術 bridge 把容器介面接上 Linux bridge
網路連接 plugin/技術 vlan 使用 802.1Q VLAN 區隔 L2 網路
網路連接 plugin/技術 macvlan 在父介面建立具有各自 MAC 的虛擬介面
網路連接 plugin/技術 ipvlan 虛擬介面共用父介面的 MAC,依模式處理 L2/L3
平台 Windows 有對應 Windows 網路 plugins;不是單一 Linux plugin 的替代名稱
IPAM host-local 在本機管理 IP 配置;不是 DNS,也不自動協調全叢集位址池
IPAM dhcp 向 DHCP 服務取得租約;需相關服務配合
整體方案 Flannel/Calico/Cilium/VMware NSX 能力與支援介面依產品、版本及整合方式而異

CNI vs CNM:CNI 是容器網路設定介面,常見於 Kubernetes;CNM(Container Network Model)是 Docker libnetwork 的網路模型,以 sandbox、endpoint、network 描述連接。不是同一套規格。K8s 的 CRI runtime 通常負責呼叫 CNI 完成 Pod sandbox 網路設定。

Network addon 安裝題,就是部署讓 Pod 網路能運作的元件;若要求 NetworkPolicy,還要確認方案有政策執行能力。依題目指定的版本、CIDR、資料平面與安裝來源操作,不能只看到 Pod Running 就認定政策有效。

底層實驗見 Linux Network Namespace:netns、veth 與 Bridge;安裝與介面判讀見 K8s Calico 安裝與網路判讀小抄。

參考:CNI plugins 分類、Docker 容器網路、Kubernetes 網路模型。

先區分實作與底層技術

Cilium、Calico、Flannel 是 Kubernetes 網路方案;eBPF、VXLAN、BGP 是不同層次的技術,不能當成三個互斥選項。

名稱 解決的問題
CNI 容器網路設定介面,讓 plugin 建立/移除網路連接
eBPF 在 Linux kernel 的 hook 執行程式,可用於 policy、NAT、負載均衡與轉送
VXLAN 把內層 Ethernet frame 封裝在 UDP/IP,跨底層網路傳遞
BGP 交換可達前綴與路徑資訊,讓路由器知道網段位置
Native routing 不用 overlay 封裝,底層網路需要能轉送 Pod IP

政策 YAML、Ingress/Egress 與 selector 範例見 K8s NetworkPolicy 網路存取控制。

三種方案比較

方案 主要特性 跨 Node 網路 注意事項
Cilium eBPF 資料平面、policy、可觀測性 VXLAN/Geneve 或 native routing 可搭配 BGP 宣告 Pod/Service 路由;替代 kube-proxy 需對應設定
Calico L3 networking、NetworkPolicy 無封裝路由、VXLAN、IP-in-IP,依模式配置 BGP 不能把 Calico 等同於 BGP;也有 eBPF 資料平面選項
Flannel 提供 Pod 網路連通 VXLAN、host-gw 等 backend 單獨 flanneld 不執行 NetworkPolicy;需搭配政策控制器,官方 Helm chart 可用 netpol.enabled 整合

參考:Cilium Routing、Calico networking、Flannel。

eBPF、VXLAN 與 BGP 可以共存

Cilium + VXLAN:
Pod A → eBPF 處理 → VXLAN 封裝 → Node 網路 → 解封裝 → eBPF 處理 → Pod B

Native routing:
Pod A → Node 轉送 → 可達 Pod 網段的底層網路 → 目的 Node → Pod B

eBPF 仍然會處理封包。它可以減少某些傳統網路堆疊與規則查找的成本,但效能取決於核心、模式、policy、流量及硬體,不能直接保證所有情境都比較快。

BGP 是路由資訊交換,不是資料封包的封裝。Native routing 可搭配靜態路由或其他路由安排,並非一定要使用 BGP。

Cilium BGP Control Plane 對外宣告路由,不會替你設定整個叢集的資料平面可達性。BGP session Established 只代表鄰居建立,還要確認 advertisement、路由安裝、下一跳、回程路由與 NetworkPolicy。依據:Cilium BGP Control Plane。