系列导航
本系列从 Pod 网络连通入手,逐步展开到 K8s 网络全景。
① 概念 → ② Flannel → ③ Calico → ④ 流量路径 → ⑤ Cilium → ⑥ 对比 → ⑦ 排障 ‖ ⑧ 开发 → ⑨ 多网卡 → ⑩ AI 演进
| 顺序 | 文章 | 定位 |
|---|---|---|
| ① | 概念与入门 | 基础——主机网络、Docker 网络、CNI 标准、方案分类树 |
| ② | Flannel 详解 | CNI 实现——Overlay 封装(UDP/VXLAN/HostGW)与抓包 |
| ③ | Calico 详解 | CNI 实现——三层路由(BGP/IPIP)+ NetworkPolicy |
| ④ | 流量路径全解析 | 全貌——Pod/Service/Ingress/Egress,揭示 CNI 的边界 |
| ⑤ | Cilium 详解 | 超越 CNI——eBPF 统一 Pod + Service + L7 + Hubble |
| ⑥ | 插件对比与选型 | 选型——5 插件横向对比 + 决策树 |
| ⑦ | 排障思路与常用命令 | 运维——工具链 + 场景排查 + 性能 |
| — | 核心路径 ↑ | 扩展展望 ↓ |
| ⑧ | CNI 插件开发指南 | 扩展——基于 CNI 规范开发自定义插件 |
| ⑨ | 本篇 - 多网卡方案详解 | 进阶——Multus + SR-IOV/ipvlan 多网口实战 |
| ⑩ | AI 时代网络演进 | 展望——GPU 网络、eBPF 加速、未来方向 |
K8S 默认一个 Pod 一张网卡。GPU 训练、边缘计算、网络安全隔离等场景需要一个 Pod 同时接入多个网络。Multus 是 CNCF 的标准化多网卡调度器——将多个 CNI 插件串联,给 Pod 分配多张独立网卡。
1. 为什么需要多网卡
| 场景 | 网卡1(管理面) | 网卡2(数据面) |
|---|---|---|
| GPU 分布式训练 | Cilium/Flannel(Pod 互通、DNS、Pull 镜像) | SR-IOV VF(RDMA/RoCE,GPU all-reduce 通信) |
| 边缘计算 | Calico(控制面、API 调用) | ipvlan/macvlan(直通物理网络,低延迟数据采集) |
| 安全隔离 | Cilium eBPF(策略管控、可观测) | macvlan(直通 DMZ 网络,不经过集群路由) |
| NFV/SDN | Flannel(管理) | DPDK 用户态驱动(高性能包处理,绕过内核) |
核心问题: 普通 Pod 只支持一个 CNI 插件。Kubelet 在创建 Pod 时调用一次 CNI ADD,分配一个 eth0。第二张网卡需要额外的 CNI 调用——Multus 负责这件事。
2. Multus 架构
Multus 本身不是网络插件——它是一个 CNI 调度器,位于 Kubelet 和其他 CNI 之间:
Kubelet │ │ 调用 CNI ADD ▼ Multus (meta-plugin) │ │ 遍历 NetworkAttachmentDefinition 列表 │ ├─► CNI #1 (Flannel/Cilium/Calico) → eth0 ├─► CNI #2 (SR-IOV) → net1 └─► CNI #3 (ipvlan) → net2 │ ▼ Pod 拥有多张网卡
Multus 的本质:一个 meta-plugin,不做网络配置,只做调度——收到 Kubelet 的 CNI ADD 调用后,按 Pod 声明的 NAD 列表,依次委托各子 CNI 各自创建网卡、分配 IP。每个子 CNI 互不感知、独立工作,Multus 只负责"叫谁做、按什么顺序做"。最终 Pod 拥有 N 张独立网卡,各自的路由、策略、带宽由对应 CNI 管控。
统筹不同 CNI 搭配的关键:NAD 定义"用谁",Pod annotation 定义"要几个、叫什么"。Multus 不合并网络——网卡之间互不干扰,隔离性由各自 CNI 保证。
关键概念:
| 组件 | 作用 |
|---|---|
NetworkAttachmentDefinition (NAD) | CRD,定义"额外网卡"的属性——用什么 CNI 插件、配什么 IP 段、挂哪个物理网卡 |
k8s.v1.cni.cncf.io/networks | Pod annotation,指定本 Pod 需要哪些 NAD |
multus-cni | DaemonSet,每节点运行,负责按 NAD 列表依次调用各个 CNI 插件 |
| |
3. 实战方案
3.1 Cilium(管理面) + SR-IOV(RDMA 高速面)
AI 训练的标准组合。Cilium 管 eth0(普通 Pod 互通 + Service + 策略),SR-IOV 管 net1(RDMA 直通,绕过内核)。
宿主机准备:
| |
Pod 声明双网卡:
| |
验证双网卡是否就绪:
| |
3.2 Flannel(管理面) + ipvlan(数据面)
ipvlan 比 macvlan 更适合容器场景——每个 Pod 的 MAC 地址与宿主机相同,交换机只看宿主机 MAC,避免 MAC 地址表溢出。
| |
| ipvlan 模式 | 说明 | 适用场景 |
|---|---|---|
| L2 | 同网段 Pod 二层互通,跨网段需外部路由 | 同 VLAN 数据面 |
| L3 | 宿主机作为路由器,Pod 间走三层 | 跨 VLAN,需宿主机关闭 rp_filter |
| L3S | 类似 L3,额外支持 iptables/Netfilter | 需要策略/SNAT 的场景 |
3.3 macvlan(Pod 直接暴露到物理网络)
macvlan 给每个 Pod 分配独立的 MAC 地址,Pod 直接接入物理二层网络,性能最高。适合需要 Pod 独立 IP 对外暴露的场景(如 DNS 服务器、负载均衡器)。
| |
| macvlan 模式 | 说明 | 注意 |
|---|---|---|
| bridge | 同宿主机、同 VLAN 的 macvlan Pod 可以互通 | 依赖外部交换机做 MAC 学习 |
| private | Pod 只能与外部通信,不能与同宿主机其他 macvlan Pod 通信 | 最安全,适用 DMZ 场景 |
| vepa | 内部流量也经外部交换机转发 | 需交换机支持 VEPA(很少用) |
注意: macvlan Pod 和宿主机之间默认无法直接通信——可以在宿主机额外创建 macvlan 子接口来解决:
ip link add mac-host link eth1 type macvlan mode bridge。
4. NVLink / NVSwitch 与 CNI 的关系
NVLink 和 NVSwitch 是 NVIDIA 的 GPU 互联技术。在 GB200 NVL72 这一代,它们已经跨节点了——一台机柜内 72 个 B200 GPU 通过 NVSwitch 无阻塞全互联,构成一个"超节点"。
| 技术 | 是什么 | 通信范围 | 由谁管理 |
|---|---|---|---|
| NVLink | GPU 间直连总线,双向带宽 900GB/s(H100)→ 1.8TB/s(B200) | 传统:单节点内 / NVL72:跨节点(机柜内) | NVIDIA 驱动 + NVLink Fabric Manager |
| NVSwitch | 无阻塞交换芯片,连接多个 GPU | 单节点 8 GPU(H100)→ NVL72 机柜 72 GPU(B200) | NVLink Fabric Manager(不是 CNI) |
| InfiniBand | 跨机柜 RDMA 网络,延迟 < 2μs | 跨机柜、跨集群 | SR-IOV CNI + IB 子网管理器 |
| RoCE v2 | 融合以太网跑 RDMA | 跨机柜 | SR-IOV CNI + 交换机 PFC/ECN |
三层通信结构:
┌─ NVLink Switch 域(机柜内,72 GPU 全互联)───────┐
│ GPU0 ←→ GPU1 ←→ ... ←→ GPU71 │
│ 通过 NVSwitch 交换,不经过任何网络设备 │
└────────────────────────────────────────────────────┘
│
│ GPU Direct RDMA
▼
┌─ InfiniBand / RoCE 网络(跨机柜)─────────────────┐
│ SR-IOV VF → IB Switch → ... → 远端 SR-IOV VF │
│ CNI 管理:分配 VF + 分配 IP + 保证可达 │
└────────────────────────────────────────────────────┘
│
▼
┌─ 以太网(管理面)─────────────────────────────────┐
│ eth0:Cilium/Flannel(DNS、API、Pull 镜像) │
└────────────────────────────────────────────────────┘NVLink Switch 域内通信用什么? 不走任何 CNI——GPU 之间通过 NVSwitch 直接做内存访问(load/store 语义),不经过 IP 协议栈。它不是"网络",是"总线扩展"。
跨 NVSwitch 域(机柜之间)通信用什么? InfiniBand 或 RoCE。CNI 的任务是:把 SR-IOV VF 正确分配给 Pod,保证 VF 的 IP 可达、RDMA 链路畅通。GPU Direct RDMA 让 GPU 显存直接 DMA 到 VF,不经过 CPU。
NVIDIA 的"超节点"策略是把尽可能多的 GPU 放进一个 NVSwitch 域(省去昂贵的 IB 网络),域外用 CNI 管理的 RDMA 连接。
5. 多网卡排障
5.1 Pod 只有 eth0,额外网卡未出现
| |
5.2 额外网卡存在但无 IP
| |
5.3 多网卡路由冲突
Pod 有双网卡时,默认路由只能走一张网卡。需要手动指定目标网段走哪张卡:
| |
6. 总结
| 维度 | macvlan | ipvlan | SR-IOV |
|---|---|---|---|
| MAC 地址 | 每个 Pod 独立 MAC | 共享宿主机 MAC | VF 独立 MAC |
| 性能 | 高(直通物理网络) | 高 | 最高(硬件直通) |
| 交换机负载 | MAC 表项随 Pod 数增长 | 仅宿主机 MAC | VF MAC 数增长 |
| RDMA 支持 | 不支持 | 不支持 | 支持 |
| 宿主机→Pod 通信 | 需额外子接口 | 原生支持 | 不支持(VF 特性) |
| 典型场景 | 独立 IP 对外暴露 | 同网段数据面 | GPU 训练 RDMA 面 |
Multus 是多网卡的第一步——定义网卡类型、调度 IPAM、绑定到 Pod。后续的带宽、延迟、策略管控,由各 CNI 插件各自负责。