3. CNI 插件架构:CNI 规范、插件链与常见 CNI 插件对比
CNI(Container Network Interface)是 Kubernetes 网络插件的核心接口规范。本章深入解析 CNI 的架构设计、插件链执行机制,并对 Calico、Flannel、Cilium 三大主流插件进行系统性对比,为后续蓝绿发布中的网络准入控制与回滚策略奠定基础。
3.1 CNI 规范核心模型
CNI 规范定义了一个 容器运行时 ↔ 网络插件 的二进制协议。其核心设计原则是:插件可执行、配置可组合、网络可叠加。
| 组件 | 职责 | 交互方式 |
|---|---|---|
| 容器运行时(如 containerd、CRI-O) | 调用 CNI 插件,传递网络配置与容器信息 | 通过 stdin/stdout 传递 JSON 配置 |
| CNI 插件(二进制文件) | 执行网络配置(创建/删除网络接口、分配 IP、配置路由) | 返回 JSON 结果(IP、MAC、DNS 等) |
| CNI 配置(.conf / .conflist) | 定义网络名称、类型、IPAM、DNS 等参数 | 由运行时读取并传递给插件 |
关键规范要点:
- ADD / DEL / CHECK / VERSION 四个标准操作命令。
- 插件必须是无状态的,每次调用独立执行。
- 网络配置支持 插件链(Plugin Chaining),多个插件按顺序执行。
- IPAM(IP Address Management)作为独立插件,可被链式调用。
3.2 CNI 插件链执行机制
CNI 插件链允许将多个网络功能拆分为独立插件,按顺序组合执行。这种设计实现了网络功能的 解耦与复用,例如:先分配 IP(IPAM),再配置网络接口(main),最后应用网络策略(meta)。
设计启示: 插件链机制使得网络功能可以像乐高积木一样组合。在蓝绿发布场景中,我们可以通过插入自定义的 准入控制插件 到链中,实现流量染色、网络策略动态切换等能力,而无需修改主网络插件。
3.3 常见 CNI 插件对比
当前 Kubernetes 生态中,Calico、Flannel、Cilium 是最具代表性的三种 CNI 插件。它们在网络模型、性能、安全能力上各有侧重。
| 维度 | Calico | Flannel | Cilium |
|---|---|---|---|
| 网络模型 | 纯三层 BGP 路由 | Overlay(VXLAN / host-gw) | eBPF 数据面 + Overlay / 原生路由 |
| 数据面 | iptables / eBPF(可选) | 内核路由 / VXLAN 隧道 | eBPF(内核态) |
| 网络策略 | 原生 Kubernetes NetworkPolicy + 扩展 | 不支持 | 原生 + L7 HTTP/gRPC 策略 |
| 性能 | 高(直接路由) | 中(Overlay 开销) | 极高(eBPF 绕过 iptables) |
| 可观测性 | 基础(Felix 指标) | 弱 | 强(Hubble 可视化 + 服务拓扑) |
| IPAM 模式 | IPPool / 跨子网 | host-local / 简单 | CRD-backed / 灵活 |
| 蓝绿发布适配 | 强(策略隔离 + 路由控制) | 弱(无策略能力) | 极强(eBPF 动态流量切换) |
3.4 三大插件架构对比图
以下对比图展示了三种插件在 Kubernetes 节点上的核心组件与数据流差异,帮助理解它们在蓝绿发布场景中的适用性。
3.5 蓝绿发布场景下的选型建议
关键决策点: 在蓝绿发布中,网络准入控制需要动态切换流量、隔离新旧版本、支持快速回滚。以下是对比结论:
- Flannel: 不推荐用于需要网络策略的蓝绿发布。无 NetworkPolicy 支持,无法实现版本间的网络隔离。
- Calico: 推荐。通过 IPPool 隔离 + 策略规则,可以实现新旧版本的网络隔离。配合 BGP 路由控制,可精细管理流量路径。
- Cilium: 强烈推荐。eBPF 技术允许在数据面动态注入网络准入逻辑,支持基于标签的 L7 流量切换,回滚时无需重建网络栈,延迟极低。
本课程后续章节将基于 Cilium 实现蓝绿发布的网络准入控制与回滚,原因如下:
- eBPF 动态编程能力:可在不重启 Pod 的情况下修改网络策略。
- Hubble 可观测性:实时监控流量切换状态,辅助回滚决策。
- L7 策略支持:可对 HTTP/gRPC 请求进行版本路由,实现精细化蓝绿切换。