2. 容器网络基础:Docker网络模型、CNI插件原理与Pod网络命名空间

容器网络是蓝绿发布流量切换与故障排查的底层基础设施。本章深入剖析Docker原生网络模型、Kubernetes CNI插件机制以及Pod网络命名空间的核心原理,为后续自动化诊断与流水线集成奠定理论基础。

2.1 Docker网络模型

Docker提供多种网络驱动,每种驱动对应不同的隔离级别与性能特征。在生产环境中,Bridge与Overlay是最常用的两种模式。

网络模式 隔离级别 跨主机通信 典型场景
Bridge 单主机 不支持 开发环境、单机部署
Host 无隔离 依赖主机网络 性能敏感型应用
Overlay 跨主机 支持(VXLAN) Swarm集群、多节点服务
Macvlan 物理网卡级 支持 需要独立MAC地址的场景
None 完全隔离 不支持 自定义网络栈

2.1.1 Bridge模式

Docker默认模式。容器通过虚拟网卡对(veth pair)连接到宿主机上的docker0网桥,通过NAT实现对外通信。容器间可直接通过IP互通,但无法被宿主机外部直接访问(需端口映射)。

2.1.2 Host模式

容器直接使用宿主机网络栈,不进行网络隔离。性能最高,但存在端口冲突风险,且容器内应用与宿主机共享同一网络命名空间。

2.1.3 Overlay模式

基于VXLAN封装技术,在宿主机之间建立二层隧道,使跨主机的容器如同在同一子网内通信。Docker Swarm模式下默认使用此模型,也是Kubernetes早期网络方案的基础。

排查要点: 蓝绿发布中,若流量无法正确路由到新版本容器,首先检查Overlay网络隧道状态(docker network inspect)以及宿主机之间的VXLAN端口(UDP 4789)是否可达。

2.2 CNI插件原理

Kubernetes不内置网络实现,而是通过CNI(Container Network Interface)标准接口与第三方插件交互。CNI插件负责为Pod分配IP、配置网络接口并维护网络策略。

2.2.1 CNI工作流程

  1. ADD操作: kubelet调用CNI插件,传入容器ID、网络命名空间路径及网络配置。
  2. IP分配: 插件从IPAM(IP Address Management)模块获取可用IP地址。
  3. 接口创建: 创建veth pair,一端放入Pod命名空间,另一端连接到宿主机网桥或Overlay隧道。
  4. 路由配置: 在宿主机和Pod内分别添加路由规则,确保数据包正确转发。
  5. DEL操作: Pod删除时,插件释放IP并清理网络接口。

2.2.2 主流CNI插件对比

插件 数据平面 网络策略支持 性能特征
Calico BGP / eBPF 原生支持 高吞吐,低延迟
Flannel VXLAN / Host-GW 需额外组件 简单易用,性能适中
Cilium eBPF 原生支持 极高性能,可观测性强
Weave VXLAN / FastDP 原生支持 加密通信,自动拓扑
故障排查关键: 蓝绿发布中,若新版本Pod无法接收流量,优先检查CNI插件是否成功执行ADD操作。查看kubelet日志(journalctl -u kubelet)以及CNI插件二进制文件是否存在(/opt/cni/bin/)。
CNI插件ADD操作流程 kubelet CNI插件 IPAM模块 调用ADD 请求IP 返回IP 创建veth pair 配置网络命名空间 添加路由规则 Pod网络就绪 说明:CNI插件在ADD阶段完成IP分配、接口创建与路由配置,Pod网络才真正可用

2.3 Pod网络命名空间

Kubernetes中每个Pod拥有独立的网络命名空间(Network Namespace),包含自己的网络栈:网卡、路由表、iptables规则等。Pod内所有容器共享此命名空间,通过localhost互相通信。

2.3.1 网络命名空间结构

  • eth0: Pod主网卡,由CNI插件创建,连接至宿主机网桥或Overlay网络。
  • lo: 回环接口,用于Pod内部容器间通信。
  • 路由表: 包含默认网关(通常指向宿主机网桥IP)及集群CIDR路由。
  • iptables规则: 由kube-proxy或网络策略控制器注入,实现Service负载均衡与访问控制。

2.3.2 与Docker网络命名空间的差异

维度 Docker容器 Kubernetes Pod
命名空间粒度 每个容器独立 Pod内所有容器共享
IP分配 Docker daemon分配 CNI插件通过IPAM分配
网络策略 无原生支持 通过NetworkPolicy对象实现
生命周期 随容器启停 随Pod启停,与容器解耦
蓝绿发布关联: 在蓝绿发布切换时,新版本Pod的网络命名空间必须与Service的标签选择器匹配,否则流量无法路由。排查时使用kubectl exec -it <pod> -- ip addr查看Pod内网卡状态,确认IP是否在Service的Endpoint列表中。
Pod网络命名空间内部结构 Pod网络命名空间 容器A (业务进程) 容器B (Sidecar代理) localhost通信 eth0(主网卡) 路由表 iptables规则 说明:Pod内所有容器共享同一网络命名空间,通过localhost通信,对外统一使用eth0

2.4 网络故障排查基础命令

掌握以下命令,可在蓝绿发布网络异常时快速定位问题根因。

命令 作用 排查场景
ip netns list 列出所有网络命名空间 确认Pod命名空间是否存在
nsenter -t <pid> -n ip addr 进入Pod命名空间查看网卡 检查eth0是否获取到IP
bridge fdb show 查看Overlay隧道转发表 确认跨主机MAC地址学习是否正常
iptables -t nat -L -n 查看NAT规则 检查Service DNAT规则是否生效
tcpdump -i any port 4789 抓取VXLAN封装包 验证Overlay隧道是否通
实战建议: 在蓝绿发布流水线中,建议在部署新版本后自动执行网络连通性检查(如curl测试Service IP),并将结果输出到流水线日志。若网络异常,立即触发回滚并调用上述排查命令生成诊断报告。