在 Kubernetes 中,Pod 網絡 是實現容器間通信的核心機制,每個 Pod 擁有獨立的 IP 地址,可直接跨節點通信。CNI(Container Network Interface) 是 Kubernetes 的網絡插件標準,負責為 Pod 分配 IP、配置網絡規則,并確保 Pod 間的連通性。常見的 CNI 插件(如 Calico、Flannel)通過不同技術實現這一目標。
CNI 的核心作用
-
IP 地址管理(IPAM)
-
為每個 Pod 分配唯一的 IP 地址,確保集群內無沖突。
-
-
網絡連通性
-
實現同一節點內的 Pod 通信(通過網橋或虛擬設備)。
-
實現跨節點 Pod 的通信(通過 Overlay 網絡或路由規則)。
-
-
網絡策略支持
-
部分插件(如 Calico)支持定義網絡策略(NetworkPolicy),控制 Pod 間的流量。
-
常見 CNI 插件對比
插件 | 實現原理 | 特點 | 適用場景 |
---|---|---|---|
Flannel | Overlay 網絡(如 VXLAN)或 Host-GW | - 簡單易用 - 默認使用 VXLAN 封裝跨節點流量 - 性能中等 | 中小規模集群、快速部署 |
Calico | BGP 路由 + IPIP 封裝 | - 高性能(直接路由,避免 Overlay 開銷) - 支持網絡策略 - 復雜度較高 | 大規模集群、需要安全策略的環境 |
Cilium | eBPF 技術 | - 高性能和可觀測性 - 支持 L7 網絡策略 - 內核要求較高 | 云原生、安全敏感型應用 |
Pod 間通信原理
1. 同一節點內的 Pod 通信
-
通信流程:
-
Pod A 發送數據包到 Pod B 的 IP。
-
節點上的 CNI 網橋(如
cni0
) 根據 ARP 表找到 Pod B 的 MAC 地址。 -
數據包直接通過網橋轉發到 Pod B 的虛擬網卡(veth pair)。
-
-
示意圖:
Pod A (eth0) <--> veth pair <--> cni0 <--> veth pair <--> Pod B (eth0)
2. 跨節點的 Pod 通信
不同 CNI 插件的實現方式:
Flannel(VXLAN 模式)
-
原理:
-
Pod A 發送數據包到目標 Pod C 的 IP。
-
源節點通過 Flannel 的 VXLAN 隧道 封裝數據包,目標地址為 Pod C 所在節點的 IP。
-
目標節點解封裝數據包,通過本地網橋轉發到 Pod C。
-
-
特點:
-
依賴 Overlay 網絡,適用于不支持 BGP 的網絡環境。
-
因封裝開銷,性能略低于直接路由方案。
-
Calico(BGP 路由模式)
-
原理:
-
每個節點作為 BGP Speaker,通過 BGP 協議向其他節點宣告本機 Pod 的 IP 段。
-
Pod A 發送數據包到 Pod C 的 IP,節點根據路由表直接通過物理網絡轉發到目標節點。
-
目標節點通過本地網橋將數據包送達 Pod C。
-
-
特點:
-
無 Overlay 封裝,性能接近物理網絡。
-
需要網絡設備支持 BGP 或配置 IPIP 隧道(兼容非 BGP 環境)。
-
示例:Calico 的跨節點通信(BGP 模式)
-
節點路由表(查看節點路由規則):
ip route show # 輸出示例: # 10.244.1.0/24 via 192.168.1.102 dev eth0 # 目標節點 IP 為 192.168.1.102
-
數據包路徑:
-
Pod A(IP
10.244.0.10
)→ 節點 A 路由 → 節點 B(IP192.168.1.102
)→ Pod C(IP10.244.1.10
)。
-
CNI 插件選型建議
-
Flannel:
-
適合快速部署、無需復雜策略的小型集群。
-
缺點:缺乏網絡策略支持(需結合其他工具如 Calico)。
-
-
Calico:
-
適合中大規模集群,尤其是需要高性能和網絡策略的場景。
-
缺點:BGP 配置需網絡設備支持,復雜度較高。
-
-
Cilium:
-
適合云原生環境,需要 L7 策略和深度可觀測性的場景。
-
網絡策略(NetworkPolicy)示例
Calico 支持通過 NetworkPolicy 限制 Pod 流量:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: allow-frontend
spec:podSelector:matchLabels:role: frontendingress:- from:- podSelector:matchLabels:role: backendports:- protocol: TCPport: 80
-
作用:僅允許帶有
role: backend
標簽的 Pod 訪問role: frontend
Pod 的 80 端口。
總結
-
CNI 插件是 Kubernetes 網絡的核心,決定 Pod 通信的性能和功能特性。
-
Flannel 簡化部署,適合基礎場景;Calico 提供高性能和策略控制,適合生產環境。
-
Pod 間通信通過網橋(同節點)或 Overlay/路由(跨節點)實現,不同插件采用不同技術。