云原生网络:CNI 容器网络、Overlay/Underlay 与 Service Mesh 数据面

深度讲解云原生环境下的网络模型与工程实践:容器网络模型(bridge/host/overlay)、CNI 插件(Flannel/Calico/Cilium)、VXLAN/Geneve 隧道与 Overlay/Underlay、eBPF 与 Cilium 的现代网络、Service Mesh 数据面(Envoy)、网络策略与常见坑。

在 Kubernetes 和云原生的世界里,网络不再是"配个 IP、拉根网线",而是由软件定义的、与工作负载生命周期的网络模型。一个 Pod 可能在任何节点漂移,服务要能被跨节点、跨集群稳定访问,安全策略要跟着工作负载走。本文讲透容器网络模型、CNI 插件、Overlay/Underlay、eBPF 与 Service Mesh 数据面,给你一张云原生网络的完整地图。

关键概念:云原生网络要解决三件事:连通性(任意两个工作负载能互通,无论在哪台机器)、服务发现与负载均衡(Service/ClusterIP)、安全策略(NetworkPolicy/服务网格)。核心组件是 CNI 插件,它负责在 Pod 创建时把网络打通。


一、容器网络模型

1.1 从 Docker 到 K8s 的演进

Docker 单机网络(早期):
  bridge(默认):容器连到 docker0 网桥,NAT 出网
  host:容器直接用宿主机网络栈
  none:无网络

K8s 的核心要求(CNI 模型):
  - 每个 Pod 一个独立 IP(Pod 内容器共享该 IP)
  - 任意节点上的 Pod 都能直接互通(扁平网络)
  - 不通过 NAT 做 Pod 间通信(与 Docker 不同)
  → 这要求"跨节点的网络打通"由 CNI 解决

1.2 CNI 工作机制

CNI(Container Network Interface)是一套标准接口:
  add / del / check
  由容器运行时(containerd/cri-o)在创建 Pod 时调用

CNI 职责:
  1. 为 Pod 创建 veth 对(一头进 Pod netns,一头连宿主)
  2. 分配 IP(IPAM 插件)
  3. 配置路由(本机 + 跨节点)
  4. 可选:下发网络策略

一次 Pod 创建的网络流程:
  runtime → CNI add → 分配 IP → 建 veth → 配置路由 → Pod 可通信

二、主流 CNI 插件

2.1 Flannel:简单 Overlay

Flannel 特点:
  - 最常用、最简单,适合中小集群
  - 默认 VXLAN 隧道:每节点一个网段,跨节点走隧道
  - 只有连通性,没有 NetworkPolicy 能力(早期)

局限:
  - 性能一般(隧道封装开销)
  - 无内置网络策略
  - 大规模集群扩展性有限

2.2 Calico:三层路由 + 策略

Calico 特点:
  - 基于三层路由(BGP 交换路由),不走隧道 → 性能好
  - 原生支持 NetworkPolicy(K8s 标准网络策略)
  - 也支持 IPIP/VXLAN 隧道模式(跨云环境)
  - 适合:生产集群、需要网络策略、混合云

两种模式:
  - BGP 模式(纯三成):跨节点直连,性能最优
  - IPIP/VXLAN 模式:封装跨云,配置简单

2.3 Cilium:eBPF 加持的现代选择

Cilium 特点:
  - 基于 eBPF 在内核态实现转发,性能极佳
  - 深度集成 K8s:Service/NetworkPolicy/可观测性
  - 支持 L7 协议感知(HTTP/gRPC/Kafka)的安全策略
  - 与 Service Mesh 数据面天然协同
  - 支持多集群、Hubble 可视化

适用:
  - 需要高性能 + 细粒度安全策略
  - 大规模生产集群
  - 需要丰富的可观测性
CNI模式性能策略适用
FlannelVXLAN中无(早期)中小集群、入门
Calico三层路由高强(NetworkPolicy)生产、需策略
CiliumeBPF极高强 + L7高性能、大规模

ℹ️ 选型直觉:入门用 Flannel 理解模型;生产要策略用 Calico;追求性能与云原生深度集成用 Cilium。规模越大、安全要求越高,越偏向 Cilium。


三、Overlay 与 Underlay

3.1 概念对比

Underlay:依赖底层物理/虚拟网络,直接用真实 IP
  - 例:每个 Pod 拿真实 IP(vSphere/云厂商直连)
  - 优点:性能好;缺点:受底层网络限制

Overlay:在底层网络上封装一层虚拟网络(隧道)
  - 例:VXLAN/Geneve 把报文封装进 UDP
  - 优点:跨任何网络(二层隔离也能打通)、IP 规划自由
  - 缺点:封装开销、MTU 变小

隧道开销:
  VXLAN 加 50 字节头 → MTU 需减到 ~1450
  大包不调 MTU → 碎片/黑洞(回到 MTU 话题)

3.2 VXLAN 与 Geneve

VXLAN:
  - 最普及的 overlay 隧道
  - 外层 UDP 4789,24bit VNI 标识虚拟网络
  - 内核原生支持,兼容性好

Geneve:
  - VXLAN 的进化,灵活可变头
  - OpenStack/K8s 新兴场景使用
  - 主要被 OVS 与较新 Cilium 采用

隧道与 MTU:
  配 overlay 时务必把 Pod/容器 MTU 调成 1450
  否则大包 DF=1 → MTU 黑洞(见网络排障专题)
# 查看本机隧道 / veth(诊断 Pod 网络)
ip link show            # 找 veth / vxlan / cilium_ 接口
ip -d link show vxlan0  # 看隧道类型与 VNI
route -n                # 看 Pod 网段路由到哪

四、eBPF 与 Cilium 的现代网络

4.1 eBPF 是什么

eBPF(extended Berkeley Packet Filter):
  - 允许在内核挂载受限的、经安全验证的程序
  - 网络路径上:转发、负载均衡、策略直接在数据面执行
  - 无需加载内核模块,性能接近原生

相比 iptables 的优势:
  - 不用每包走线性规则链(iptables 规则多时慢)
  - 更细粒度的观测(每个流、每包)
  - 策略内联到转发路径,延迟低

Cilium 利用 eBPF:
  - Service 负载均衡(替代 kube-proxy iptables)
  - NetworkPolicy 内核态执行
  - Hubble 流日志 / 指标(可观测性)

4.2 eBPF 网络 vs 传统 CNI

传统(iptables + Overlay):
  Pod 流量 → 路由 → tunnel → iptables NAT → 转发
  每一跳都有内核规则链开销

Cilium/eBPF:
  Pod 流量 → 在内核 eBPF 程序直接决策(转发/负载均衡/策略)
  规则内联,减少拷贝与规则遍历 → 延迟更低、PPS 更高

典型收益:
  高并发场景 PPS 提升明显
  连接建立延迟更低(对长连接服务更友好)
  复杂策略组合不再拖慢转发

五、Service Mesh 数据面:Envoy

5.1 从 CNI 到服务网格

CNI 解决"Pod 到 Pod 连通";
服务网格解决"应用到应用的流量治理":
  - 服务发现与负载均衡
  - 重试、超时、熔断
  - 灰度(流量比例)、故障注入
  - 双向 TLS、细粒度授权
  - 全链路可观测

两种形态:
  边车(Sidecar)模式:每个 Pod 带一个 Envoy,流量都经它
  无代理(eBPF)模式:Cilium 直接把治理下放到内核

5.2 Envoy 数据面要点

Envoy 是 Istio 的数据面(Sidecar 代理):
  入口:进入 Pod 的流量先到 Envoy(iptables 重定向)
  出口:Pod 发出的流量也经 Envoy 出去
  → 应用无感,但所有流量可控、可观测

核心能力(由控制面下发配置,xDS):
  - Listener/Route/Cluster 三级结构定义流量路径
  - 负载均衡、健康检查、熔断、重试
  - TLS 终止/发起、授权(RBAC)
  - 分布式追踪(请求上下文传递)

与 CNI 的关系:
  CNI 管"通不通",Mesh 管"怎么走、走多好"
  两者叠加使用(Cilium 也能与 Mesh 整合)

六、网络策略:安全跟随工作负载

6.1 NetworkPolicy

# K8s 网络策略示例(Calico/Cilium 支持)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
spec:
  podSelector:
    matchLabels:
      app: backend
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: frontend
      ports:
        - port: 8080
          protocol: TCP
NetworkPolicy 语义:
  - 选择目标 Pod(podSelector)
  - 定义 ingress / egress 规则(谁可以进 / 谁可以出)
  - 端口级、命名空间级、IP 段级控制
  - 白名单模型:默认拒绝 + 显式放行

要点:
  - 只有支持策略的 CNI(Calico/Cilium)才生效
  - Flannel 默认无策略
  - 策略冲突排查比防火墙更麻烦 → 先看 CNI 是否支持

6.2 安全建议

□ 默认拒绝 + 最小放行(纵深防御)
□ 命名空间作为安全边界,跨命名空间需显式策略
□ 敏感服务(DB/内部 API)加网络白名单
□ 审计策略变更,与审计专题配合
□ 东西向流量加密(服务网格 mTLS)

七、常见避坑

坑现象对策
忘调容器 MTU隧道后大包黑洞Overlay 下 Pod MTU 设 1450
iptables 规则过多高并发转发慢切 eBPF(Cilium)
Flannel 无策略安全策略不生效换 Calico/Cilium
轮询 Service 打散连接有状态服务失效用 SessionAffinity / 自定义路由
隧道封装开销高吞吐场景吞吐低用 Calico BGP / Cilium
忽略 NetworkPolicy 兼容策略看似配上不生效确认 CNI 支持策略
Pod IP 变化直接依赖 IP 的调用失效用 Service/DNS,别用 Pod IP
eBPF 与旧内核新功能无法用确认内核版本与 Cilium 要求

八、最佳实践清单

□ 按集群规模选 CNI:入门 Flannel / 生产 Calico / 高性能 Cilium
□ Overlay 场景统一调小 MTU(1450),避免隧道黑洞
□ 默认拒绝 + 最小放行配置 NetworkPolicy
□ 服务调用走 Service/DNS,别依赖 Pod IP
□ 高并发关键路径考虑 eBPF 方案(Cilium)
□ 服务网格与 CNI 职责分清:CNI 管连通、Mesh 管治理
□ 用 Hubble/流量日志做网络可观测性
□ 多集群/多云场景规划好网络策略边界

一句话原则

云原生网络 = CNI 打通 Pod(连通) + 策略控制流量(安全)
+ Service Mesh 治理流量(质量);性能不够时用 eBPF。

小结

云原生网络从"配 IP 拉网线"进化成了"软件定义 + 策略驱动"的体系。CNI 插件(Flannel/Calico/Cilium)解决了 Pod 跨节点连通的核心问题,Overlay/Underlay 决定了性能与灵活性,eBPF 让转发与策略进入内核态、性能直追原生,Service Mesh 数据面把流量治理从应用代码里剥离出来。落地记住五件事:按规模选 CNI、Overlay 调 MTU、默认拒绝加最小放行、服务走 Service 别用 Pod IP、关键路径考虑 eBPF。理解这四层(连通→隧道→策略→治理),云原生网络就不再是玄学,而是你可以设计、调优与排障的工程领域。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「network」更多文章

  1. SSE 与实时通信方案:Server-Sent Events、WebSocket 对比与选型实战
  2. 网络故障排查实战:tcpdump/Wireshark/ss/iperf 工具链与分层诊断方法论
  3. Socket 编程与连接管理深度:状态机、超时、长连接、心跳与连接池