3. CNI 网络基础回顾:CNI 插件架构、Pod 网络模型、网络命名空间与 veth pair

在深入集群升级场景下的镜像拉取优化之前,必须重新夯实 CNI 网络的核心基础。本章将聚焦三个关键层次:CNI 插件架构(控制面与数据面的解耦)、Pod 网络模型(每个 Pod 拥有独立 IP 的扁平网络)、以及网络命名空间与 veth pair(实现容器与宿主机网络互通的基本单元)。理解这些基础,才能准确诊断升级过程中因 CNI 插件重启、路由表刷新或 veth 重建引发的镜像拉取延迟。

3.1 CNI 插件架构:从 kubelet 到网络配置的标准化接口

CNI(Container Network Interface)是 Kubernetes 与网络插件之间的契约接口。它定义了 kubelet 如何调用插件为 Pod 配置网络,以及插件应返回哪些信息。其核心架构遵循“调用-配置-返回”的线性模型,不涉及守护进程或长期运行的 agent(部分插件如 Calico 的 Felix 除外,但 CNI 接口本身是无状态的)。

关键设计原则: CNI 插件是可执行二进制文件,kubelet 在每次 Pod 创建/删除时直接 fork/exec 调用。这意味着插件必须快速完成网络配置并退出,不能阻塞 kubelet 的 Pod 生命周期管理。

下图展示了 kubelet 通过 CNI 接口调用插件为 Pod 配置网络的标准流程:

CNI 插件调用流程(kubelet → CNI → 网络后端) kubelet CNI 配置目录 CNI 插件二进制 网络后端 读取配置 调用二进制 API/系统调用 返回网络配置结果(IP、路由、DNS) CNI 插件架构要点 • 插件类型:bridge(基础桥接)、macvlan/ipvlan(性能)、Calico(BGP/策略)、Flannel(overlay)、Cilium(eBPF) • 配置来源:/etc/cni/net.d/ 目录下的 .conf 或 .conflist 文件 • 标准操作:ADD(添加网络)、DEL(删除网络)、CHECK(检查网络)、VERSION(版本查询)
升级影响提示: 集群升级时,如果 CNI 插件二进制文件被替换或配置目录被修改,kubelet 在创建新 Pod 时会使用新配置。若新配置与旧 Pod 的网络命名空间状态不兼容(例如路由表格式变化),可能导致已有 Pod 网络中断或新 Pod 网络配置失败,进而影响镜像拉取时的网络连通性。

3.2 Pod 网络模型:每个 Pod 一个 IP 的扁平网络

Kubernetes 的 Pod 网络模型遵循以下核心原则:

  • 每个 Pod 拥有一个独立的 IP 地址,该 IP 在集群内全局可达(无需 NAT)。
  • Pod 内的所有容器共享同一个网络命名空间,包括 IP、端口、路由表。
  • Pod 之间可以直接通信,无论它们位于同一节点还是不同节点。
  • Pod 与宿主机之间也可以直接通信(通过宿主机 IP 或 Pod IP)。

下表对比了不同 CNI 插件实现 Pod 网络模型的方式:

CNI 插件 网络模型 跨节点通信方式 性能特点 典型场景
Flannel Overlay(VXLAN / host-gw) VXLAN 隧道封装或直接路由 封装开销约 5-10% 简单、易部署,适合中小集群
Calico 纯三层(BGP 路由) BGP 路由分发,无封装 接近原生性能 大规模集群、网络策略严格
Cilium eBPF 原生 / Overlay eBPF 直接转发或 VXLAN 极低延迟,高吞吐 云原生、安全敏感、可观测性
Weave Overlay(fastdp / weave) UDP 封装或快速数据路径 中等,支持加密 跨云、混合环境
升级风险点: 如果集群升级过程中 CNI 插件版本变更导致网络模型切换(例如从 Flannel VXLAN 切换到 Calico BGP),所有现有 Pod 的 IP 地址段可能发生变化,导致 kubelet 无法通过旧 IP 访问镜像仓库,或镜像拉取流量被错误路由。务必在升级前确认 CNI 插件的网络模型兼容性。

3.3 网络命名空间与 veth pair:容器网络的基石

每个 Pod 拥有独立的网络命名空间(netns),其中包含自己的网络栈(lo 接口、路由表、iptables 规则等)。Pod 内的容器共享这个 netns,而 Pod 与宿主机之间通过 veth pair(虚拟以太网对)连接。

veth pair 是一对虚拟网卡,数据包从一端进入会直接从另一端出来,类似于一根虚拟网线。一端放在 Pod 的 netns 中(通常命名为 eth0),另一端放在宿主机的根网络命名空间中(通常命名为 vethXXXXX),并连接到 CNI 创建的网桥(如 cni0)或直接配置路由。

核心数据流: Pod 内进程发送数据 → Pod netns 中的 eth0 → veth pair → 宿主机根 netns 中的 veth 端 → 网桥/路由 → 物理网卡 → 目标。

下图展示了 Pod 网络命名空间与宿主机通过 veth pair 连接的详细结构:

Pod 网络命名空间与 veth pair 连接结构 Pod 网络命名空间 容器 A(共享 netns) 容器 B(共享 netns) eth0 (10.1.1.2) 宿主机根网络命名空间 vethXXXXX cni0 网桥 eth0 veth pair veth pair 关键特性 • 数据包从 Pod eth0 发出,直接出现在宿主机 vethXXXXX 端,无需 NAT 或代理。 • 宿主机端 veth 接口通常连接到 CNI 网桥(cni0/docker0)或配置路由策略。 • 升级过程中,如果 CNI 插件重建 veth pair 或修改网桥配置,Pod 网络会短暂中断(通常 < 1s)。

3.4 网络命名空间操作与调试命令

在集群升级前后,运维人员需要频繁检查 Pod 的网络命名空间状态。以下命令是必备技能:

# 查看 Pod 的网络命名空间(在 Pod 所在节点执行)
# 方法1:通过 crictl 获取 Pod 的 netns 路径
crictl inspectp <POD_ID> | grep -i netns

# 方法2:通过 /proc 文件系统直接查看
PID=$(crictl inspectp <POD_ID> | grep -i pid | awk '{print $2}' | tr -d ',')
ls -l /proc/$PID/ns/net

# 进入 Pod 的网络命名空间执行命令
nsenter -t $PID -n ip addr
nsenter -t $PID -n ip route
nsenter -t $PID -n iptables -t nat -L -n

# 查看宿主机上的 veth pair 对应关系
ip link show type veth
ethtool -S vethXXXXX  # 查看 veth 接口统计信息(丢包、错误等)
升级调试技巧: 在升级前,记录关键 Pod 的 veth 接口名称和网桥状态。升级后,对比 ip link show 输出,确认 veth pair 是否被重建、网桥 MAC 地址是否变化。如果镜像拉取超时,优先检查 Pod netns 内的路由表是否包含正确的默认网关(通常是网桥 IP)。

3.5 本章小结