3、CNI插件类型:基础插件(bridge、host-local)、第三方插件(Calico、Flannel、Weave)、CNI-Genie多CNI管理

在Kubernetes网络架构中,CNI插件是连接容器运行时与底层网络基础设施的核心组件。根据功能定位与生态归属,CNI插件可划分为基础插件、第三方插件以及多CNI管理工具三大类。理解这些插件的设计哲学与适用场景,是构建生产级容器网络的关键前提。

3.1 基础插件:bridge与host-local

基础插件由CNI官方维护,提供最朴素的单机容器网络能力。它们不涉及跨节点通信,仅负责解决“容器如何获得网络命名空间”与“容器如何分配IP地址”这两个基本问题。

3.1.1 bridge插件:虚拟网桥与veth对

bridge插件在宿主机上创建一个Linux网桥(通常命名为cni0),并将每个容器的veth对一端接入该网桥。容器通过网桥与宿主机及其他本地容器互通,形成一个扁平的二层网络。

核心流程: 容器创建 → 创建veth对 → 一端放入容器netns → 另一端接入cni0网桥 → 配置容器内接口IP → 设置默认路由。
# bridge插件典型配置示例
{
  "cniVersion": "0.4.0",
  "name": "mybridge",
  "type": "bridge",
  "bridge": "cni0",
  "isGateway": true,
  "ipMasq": true,
  "ipam": {
    "type": "host-local",
    "subnet": "10.22.0.0/16",
    "routes": [
      { "dst": "0.0.0.0/0" }
    ]
  }
}

3.1.2 host-local插件:本地IP地址管理

host-local是bridge最常用的IPAM(IP Address Management)搭档。它将IP地址段存储在宿主机本地文件系统中,通过简单的“分配-释放”机制管理IP池,不依赖外部数据库。

特性 说明
存储方式 本地文件系统(/var/lib/cni/networks/)
分配策略 顺序分配,支持预留IP与范围排除
适用场景 单节点测试、边缘节点、无需跨节点IP协调的环境
局限性 无持久化保障,节点重启后IP分配状态丢失
实践建议: 基础插件适合快速验证CNI规范与调试网络问题。在生产环境中,它们通常被更强大的第三方插件替代,但理解其原理是排查复杂网络故障的必备技能。
基础插件 bridge + host-local 工作流程 容器A eth0: 10.22.0.2 容器B eth0: 10.22.0.3 vethA vethB cni0 网桥 10.22.0.1/16 MAC学习 + ARP代理 host-local 本地文件系统 IP池: 10.22.0.0/16 说明: bridge插件创建veth对并接入网桥,host-local从本地文件系统分配IP。两者配合实现单节点容器网络连通。

3.2 第三方插件:Calico、Flannel、Weave

第三方插件解决了基础插件无法处理的跨节点容器通信问题。它们各自采用不同的数据平面与控制平面策略,在性能、安全性与运维复杂度之间做出取舍。

3.2.1 Calico:基于BGP的纯三层网络

Calico将每个节点视为一个BGP路由器,通过BGP协议在节点间分发容器路由。它不依赖隧道封装,直接利用宿主机内核路由表转发数据包,配合iptables或eBPF实现网络策略。

  • 数据平面: Linux内核路由 + iptables/eBPF
  • 控制平面: BGP(Bird或Calico自研Felix)
  • 封装方式: 无封装(纯路由),可选IPIP或VXLAN
  • 网络策略: 原生支持Kubernetes NetworkPolicy,粒度精细
  • 性能特征: 接近宿主机网络性能,延迟低
注意事项: Calico要求底层网络支持BGP路由交换,在公有云环境中可能需要配合IPIP模式或使用Calico Cloud的云集成模式。大规模集群(>100节点)建议启用Route Reflector。

3.2.2 Flannel:简单高效的覆盖网络

Flannel是CoreOS推出的覆盖网络方案,通过VXLAN或host-gw等后端在节点间建立隧道。它不提供网络策略,专注于“让容器能通信”这一核心目标。

后端类型 封装方式 性能 适用场景
VXLAN UDP封装(VTEP) 中等 跨子网、公有云、混合网络
host-gw 无封装,直接路由 高 同子网、物理机集群
WireGuard 加密隧道 中等 安全敏感、跨公网

3.2.3 Weave:内置DNS与加密的网状网络

Weave在节点间建立全连接网状拓扑,每个节点运行Weave Router守护进程,通过UDP封装转发数据。其特色在于内置DNS解析与可选的加密通信。

  • 拓扑结构: 全连接网状(每个节点与所有其他节点建立隧道)
  • 封装方式: 自定义UDP封装(Weave Fast Datapath)
  • 特色功能: 内置DNS(容器名解析)、加密(NaCl加密库)
  • 网络策略: 支持基础NetworkPolicy
  • 运维复杂度: 较高,全连接在节点数增多时连接数呈平方增长

3.2.4 三大插件对比

维度 Calico Flannel Weave
数据平面 内核路由 VXLAN/host-gw UDP封装
控制平面 BGP etcd/API Server 自发现+gossip
网络策略 原生支持(强) 不支持 基础支持
加密 可选(WireGuard) 无 内置
性能 ★★★★★ ★★★☆☆ ★★★☆☆
运维复杂度 中高 低 高
三大第三方CNI插件架构对比 Calico — 纯三层路由 Node1 Node2 Node3 Node4 BGP路由分发 无隧道封装 iptables/eBPF策略 Flannel — 覆盖网络 Node1 Node2 Node3 Node4 VXLAN/host-gw隧道 etcd存储分配信息 无网络策略 Weave — 网状网络 Node1 Node2 Node3 Node4 全连接UDP隧道 内置DNS+加密 gossip协议发现

3.3 CNI-Genie:多CNI管理利器

CNI-Genie是华为开源的Kubernetes CNI多路复用方案,允许在同一个集群中同时部署多个CNI插件,并根据工作负载需求动态选择或组合使用。

3.3.1 核心能力

  • 多CNI共存: 同时安装Calico、Flannel、Weave等插件,Pod可按需选择
  • 网络选择注解: 通过Pod注解cni-genie.io/networks指定使用的CNI
  • 网络优先级: 支持定义网络选择策略(顺序、权重、随机)
  • 多网络接口: 一个Pod可接入多个CNI网络,实现多网卡场景
# 使用CNI-Genie为Pod指定多个网络
apiVersion: v1
kind: Pod
metadata:
  name: multi-net-pod
  annotations:
    cni-genie.io/networks: "calico,flannel"
spec:
  containers:
  - name: app
    image: nginx

3.3.2 架构原理

CNI-Genie作为CNI链中的“调度器”,拦截Kubelet的CNI调用,根据Pod注解或默认策略,依次调用底层多个CNI插件,并将多个网络接口注入同一个Pod的网络命名空间。

组件 职责
genie-cni-plugin CNI链入口,解析注解,分发调用
genie-controller 监听Pod事件,维护网络策略缓存
network-config 定义可用CNI列表与默认优先级
适用场景: 多CNI管理在混合云、多租户隔离、特殊性能需求(如DPDK加速网卡与普通管理网卡分离)等场景中具有重要价值。但需注意,多CNI叠加会增加运维复杂度与故障排查难度。

3.4 本章小结

CNI插件生态呈现出“基础插件奠基、第三方插件百花齐放、多CNI管理工具整合”的层次化格局。基础插件是理解CNI规范的起点,第三方插件提供了生产环境所需的跨节点通信与网络策略能力,而CNI-Genie则解决了多网络共存与灵活选择的实际运维需求。在实际架构选型中,应根据集群规模、性能要求、安全策略与运维能力综合权衡,避免盲目追求功能堆叠。