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对一端接入该网桥。容器通过网桥与宿主机及其他本地容器互通,形成一个扁平的二层网络。
# 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分配状态丢失 |
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,粒度精细
- 性能特征: 接近宿主机网络性能,延迟低
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) | 无 | 内置 |
| 性能 | ★★★★★ | ★★★☆☆ | ★★★☆☆ |
| 运维复杂度 | 中高 | 低 | 高 |
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列表与默认优先级 |
3.4 本章小结
CNI插件生态呈现出“基础插件奠基、第三方插件百花齐放、多CNI管理工具整合”的层次化格局。基础插件是理解CNI规范的起点,第三方插件提供了生产环境所需的跨节点通信与网络策略能力,而CNI-Genie则解决了多网络共存与灵活选择的实际运维需求。在实际架构选型中,应根据集群规模、性能要求、安全策略与运维能力综合权衡,避免盲目追求功能堆叠。