Skip to content

我用费曼通俗讲法+运维硬核细节,把CNI(Container Network Interface) 彻底讲透,结合你之前混淆的Docker、网桥、IP分配问题,一次性打通K8s网络核心逻辑👇

一、先一句话说清:CNI到底是什么? ​

CNI 不是某一个软件,也不是网桥,而是K8s 制定的「容器网络标准规范」 + 一堆遵循这个规范的二进制插件程序。 K8s 自己完全不负责Pod的网络创建,它只定规矩,所有Pod的网卡、IP、路由、跨节点通信,全交给CNI插件来干。

简单类比:

  • K8s是「房东」,只负责盖房子(创建Pod)
  • CNI是「装修行业标准」,规定了怎么给房子拉网线、装网关
  • Calico/Flannel/Cilium是「装修公司」,遵循CNI标准,实际干活

二、为什么K8s非要搞CNI?(核心意义) ​

Docker的网络是闭源、私有、绑定自身的(docker0、bridge模式),只能自己用,没法扩展。 而K8s要兼容各种云、物理机、不同网络方案,所以制定了CNI开放标准: 只要你写的插件符合CNI规范,就能接入K8s,不管你是用隧道、路由、eBPF,都能跑。 CNI让K8s网络实现了「插拔式替换」,想用Calico就装Calico,想用Flannel就装Flannel,不用改K8s核心代码。

三、CNI的核心工作:管Pod网络的全生命周期 ​

CNI插件只干4件核心事,覆盖Pod从创建到删除的全程:

  1. 创建Pod时:给Pod插虚拟网卡、分配IP、配置网关/路由
  2. Pod运行时:维护网络规则、路由表、网络策略(Calico/Cilium)
  3. 跨节点通信:打通不同节点Pod的网络(隧道/路由)
  4. 删除Pod时:回收IP、销毁虚拟网卡、清理路由规则

四、K8s调用CNI的完整流程(最关键,懂这个就懂K8s网络) ​

当kubelet要创建一个Pod时,流程是这样的:

  1. kubelet发现要创建Pod,读取节点/etc/cni/net.d/目录下的CNI配置文件(比如calico.conflist)
  2. kubelet调用对应目录/opt/cni/bin/下的CNI二进制插件(calico、bridge、host-local等)
  3. CNI插件执行核心操作:
    • 调用IPAM模块给Pod分配全局唯一IP
    • 创建veth pair虚拟网卡,一端进Pod,一端挂到节点网桥(cni0)
    • 配置Pod的路由、网关,写入节点路由表
    • 跨节点的话,同步路由信息(Calico BGP/Flannel VXLAN)
  4. 网络配置完成,Pod启动成功,拥有独立IP
  5. Pod删除时,kubelet再次调用CNI插件,回收IP、清理网络资源

重点:kubelet是CNI的调用方,CNI插件是执行者,全程K8s核心不参与网络配置

五、CNI的两大核心组成部分(必懂) ​

1. 网络插件(主插件) ​

负责实际搭建网络,决定网络模式,就是我们常说的Calico、Flannel、Cilium、Bridge。

  • 干的活:虚拟网卡、网桥、隧道、路由、网络策略

2. IPAM插件(IP地址管理) ​

负责分配/回收Pod IP,是专门管IP的子模块,独立于主插件:

  • 常见IPAM:host-local(本地分配)、calico-ipam(Calico全局分配)、dhcp
  • 这就是你之前问的:Pod IP是CNI的IPAM模块分配的,不是网桥!

六、CNI 和 CNI网桥(cni0)的关系(彻底解开你的误区) ​

  1. CNI插件:是程序/二进制文件,负责分配IP、创建网卡、写路由
  2. cni0网桥:是Linux虚拟网桥(虚拟交换机),由CNI插件创建
  3. 职责分工:
    • CNI插件:发IP、搭网络、管跨节点通信
    • cni0网桥:只负责同一节点内的Pod之间转发流量,不分配IP、不跨节点通信
  4. 对应Docker:
    • CNI插件 = Docker daemon的IPAM+网络模块
    • cni0网桥 = docker0网桥

七、常见CNI插件分类(按能力分级) ​

1. 基础入门型(只打通网络,无策略) ​

  • Flannel:简单、轻量,仅实现Pod互通,无网络策略
  • Bridge:最基础的CNI,仅本地Pod通信,不支持跨节点

2. 生产级高性能型(带网络策略) ​

  • Calico:纯三层BGP路由,性能强,原生支持NetworkPolicy
  • Cilium:基于eBPF,性能天花板,支持安全、可观测性,下一代主流CNI

3. 云厂商专属型 ​

  • Terway(阿里云)、VPC-CNI(AWS)、Azure CNI:直接对接云厂商VPC网络,性能最优

4. 混合型 ​

  • Canal:Flannel(网络)+ Calico(策略),兼顾简单和安全

八、CNI 和 Docker网络的本质区别 ​

维度Docker网络K8s CNI网络
设计私有闭源,绑定Docker开放标准,插拔式
IP分配Docker daemon内置IPAMCNI的IPAM插件分配
转发设备docker0网桥cni0网桥/无网桥(Calico)
跨节点不支持,需额外配置原生支持,插件实现
网络策略无Calico/Cilium原生支持
扩展性极差极强,兼容所有云/物理机

九、面试+实操终极总结(必背) ​

  1. CNI是K8s容器网络标准规范+插件程序,是K8s网络的唯一入口,没有CNI Pod就没有网络
  2. K8s本身不管理网络,全靠kubelet调用CNI插件完成Pod网络配置
  3. Pod IP由CNI的IPAM模块分配,cni0网桥只做本地转发,不分配IP
  4. CNI插件决定集群网络模式(隧道/路由/eBPF),一个集群同一时间只能用一种CNI
  5. 生产环境优先选Calico/Cilium(性能+策略),测试环境用Flannel

用 VitePress 构建