3. 容器网络基础:CNI插件原理、容器网络模型与常见CNI

3.1 容器网络模型:从单机到集群的抽象

容器网络的核心挑战在于:如何为动态创建、销毁的容器提供一致的网络标识(IP地址)和连通性。Kubernetes 采用 IP-per-Pod 模型,即集群中每个 Pod 都拥有一个独立的、可路由的 IP 地址,Pod 内的所有容器共享该 IP 和网络命名空间。这一模型简化了端口映射和容器间通信,但要求底层网络基础设施必须支持大规模、高动态的 IP 分配与路由。

关键概念: Pod 网络命名空间共享意味着 Pod 内的容器可以通过 localhost 互相访问,而 Pod 之间的通信必须通过真实的网络接口(通常是 veth pair 桥接到宿主机网络)。

3.2 CNI 插件原理:标准接口与生命周期

容器网络接口(Container Network Interface, CNI)是 Kubernetes 与网络实现之间的标准协议。它定义了一组规范,用于配置容器网络。CNI 插件本质上是可执行文件,由容器运行时(如 containerd、CRI-O)在创建或删除 Pod 时调用。

CNI 核心操作流程:

  1. ADD 操作: 运行时调用 CNI 插件,传入网络配置(JSON)和容器 ID。插件负责创建 veth pair,一端放入容器网络命名空间,另一端连接到宿主机网络(如 bridge、overlay 隧道)。插件还需分配 IP 地址并设置路由。
  2. DEL 操作: 删除 Pod 时,运行时调用 CNI 插件清理网络资源,释放 IP 地址,拆除 veth pair。
  3. CHECK 操作: 可选操作,用于验证容器网络状态是否符合预期。
CNI 配置示例(JSON 格式):
{
  "cniVersion": "0.4.0",
  "name": "my-cni-net",
  "type": "bridge",
  "bridge": "cni0",
  "isGateway": true,
  "ipMasq": true,
  "ipam": {
    "type": "host-local",
    "ranges": [
      [{"subnet": "10.244.0.0/16"}]
    ],
    "routes": [{"dst": "0.0.0.0/0"}]
  }
}
CNI 插件生命周期与调用流程 容器运行时 (containerd/CRI-O) CNI 插件 (calico/flannel) 网络后端 (bridge/overlay) ADD/DEL/CHECK 配置网络 CNI 插件执行步骤详解: 1. 容器运行时解析 CNI 配置(JSON),确定插件类型和 IPAM 策略。 2. 运行时调用 CNI 插件的可执行文件,传递容器 ID、网络命名空间路径等参数。 3. CNI 插件创建 veth pair,一端放入容器 netns,另一端连接到宿主机网络设备。 4. CNI 插件调用 IPAM 模块分配 IP 地址,设置路由规则。 5. 插件将结果(IP、MAC、路由)以 JSON 格式返回给运行时。 6. 删除 Pod 时,运行时调用 DEL 操作,插件释放 IP 并清理网络设备。 注:CNI 插件必须是无状态的,每次调用独立执行。

3.3 容器网络模型:Overlay vs Underlay

根据网络封装与路由方式,容器网络模型主要分为 Overlay 和 Underlay 两种。选择哪种模型取决于性能要求、网络基础设施和运维复杂度。

特性 Overlay 网络 Underlay 网络
封装方式 在宿主机网络之上构建虚拟网络(如 VXLAN、IPIP、Geneve) 直接使用宿主机物理网络或底层 SDN 网络
性能开销 较高(封装/解封装消耗 CPU,MTU 减少约 50 字节) 较低(接近裸机网络性能)
网络隔离 天然支持多租户隔离(VNI 标识) 依赖底层网络 VLAN/VxLAN 配置
IP 地址管理 独立于物理网络,可自定义 IP 段 必须与物理网络 IP 规划一致
运维复杂度 较低,无需修改物理网络设备 较高,需要网络团队配合配置交换机/路由器
典型场景 公有云、跨数据中心、多租户集群 高性能计算、裸金属集群、已有 SDN 环境
性能权衡: Overlay 网络虽然方便,但封装带来的性能损失在高速网络(25Gbps+)场景下不可忽视。建议在性能敏感场景下使用 Underlay 或支持硬件卸载的 Overlay 方案(如 Calico 的 eBPF 模式)。

3.4 常见 CNI 插件对比:Calico / Flannel / Weave

Kubernetes 生态中有数十种 CNI 插件,其中 Calico、Flannel 和 Weave 是最具代表性的三种。它们在设计哲学、网络模型和功能特性上各有侧重。

特性 Calico Flannel Weave
网络模型 纯三层路由(BGP),支持 Overlay(IPIP/VXLAN) Overlay(VXLAN、host-gw、UDP) Overlay(VXLAN、fastdp)
数据面 Linux 内核路由 + iptables / eBPF 内核 VXLAN 隧道 / host-gw 直连 用户态封装(Weave Router)
网络策略 原生支持 Kubernetes NetworkPolicy,粒度细 不支持 NetworkPolicy(需额外组件) 支持 NetworkPolicy,但功能有限
性能 高(BGP 直连模式接近物理网络) 中(VXLAN 模式有封装开销) 中低(用户态封装增加延迟)
部署复杂度 中(需 BGP 配置或 IPIP 隧道) 低(一键部署,无需额外依赖) 低(DaemonSet 自动组网)
多集群互联 支持(BGP 跨集群路由) 不支持原生 支持(Weave Cloud 或手动配置)
加密通信 支持(WireGuard 集成) 不支持 支持(内置加密)
三种常见 CNI 插件网络架构对比 Calico 纯三层 BGP 路由 • 每个节点运行 BGP 客户端 • 直接路由,无封装开销 • 支持 eBPF 加速数据面 • 原生 NetworkPolicy 支持 • 适合大规模、高性能场景 Flannel Overlay 隧道封装 • 默认 VXLAN 隧道 • 简单易用,无需额外配置 • host-gw 模式性能较好 • 无原生 NetworkPolicy • 适合中小规模集群 Weave 用户态封装 + 加密 • 用户态 Weave Router • 内置加密通信 • 自动组网,多集群互联 • 支持 NetworkPolicy • 适合跨云、加密场景 选型建议: • 性能优先 + 网络策略需求 → Calico(BGP 模式或 eBPF 模式) • 快速部署 + 简单场景 → Flannel(VXLAN 模式,配合 host-gw 提升性能) • 跨云互联 + 加密通信 → Weave(内置加密,自动组网) • 混合场景:Calico 作为网络策略引擎 + Flannel 作为数据面(需配置) • 注意:Flannel 和 Weave 在 500 节点以上集群中可能遇到性能瓶颈 • 建议在测试环境中使用真实流量压测,验证网络延迟和吞吐量。

3.5 网络策略与安全准入

容器网络不仅仅是连通性,还包括安全隔离。Kubernetes NetworkPolicy 是一种资源对象,用于控制 Pod 之间的网络流量。CNI 插件必须实现 NetworkPolicy 才能生效。

NetworkPolicy 示例(拒绝所有入站流量,仅允许特定来源):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-ingress
  namespace: production
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  ingress: []

网络策略最佳实践:

  • 默认拒绝: 创建默认的 Deny-All 策略,然后按需开放白名单规则。
  • 最小权限: 只允许必要的端口和协议(如 TCP 80、443),避免使用 0.0.0.0/0。
  • 命名空间隔离: 使用命名空间级别的策略,防止跨命名空间未授权访问。
  • 审计与监控: 结合网络流量日志(如 Calico 的 FlowLogs)进行策略效果验证。
SBOM 关联: 在准入评审中,NetworkPolicy 应作为安全基线的一部分纳入 SBOM 证据。例如,记录每个命名空间的网络策略规则、生效的 CNI 插件版本、以及策略变更历史。