Appearance
我用费曼通俗讲法+运维硬核细节,把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从创建到删除的全程:
- 创建Pod时:给Pod插虚拟网卡、分配IP、配置网关/路由
- Pod运行时:维护网络规则、路由表、网络策略(Calico/Cilium)
- 跨节点通信:打通不同节点Pod的网络(隧道/路由)
- 删除Pod时:回收IP、销毁虚拟网卡、清理路由规则
四、K8s调用CNI的完整流程(最关键,懂这个就懂K8s网络)
当kubelet要创建一个Pod时,流程是这样的:
- kubelet发现要创建Pod,读取节点
/etc/cni/net.d/目录下的CNI配置文件(比如calico.conflist) - kubelet调用对应目录
/opt/cni/bin/下的CNI二进制插件(calico、bridge、host-local等) - CNI插件执行核心操作:
- 调用IPAM模块给Pod分配全局唯一IP
- 创建veth pair虚拟网卡,一端进Pod,一端挂到节点网桥(cni0)
- 配置Pod的路由、网关,写入节点路由表
- 跨节点的话,同步路由信息(Calico BGP/Flannel VXLAN)
- 网络配置完成,Pod启动成功,拥有独立IP
- 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)的关系(彻底解开你的误区)
- CNI插件:是程序/二进制文件,负责分配IP、创建网卡、写路由
- cni0网桥:是Linux虚拟网桥(虚拟交换机),由CNI插件创建
- 职责分工:
- CNI插件:发IP、搭网络、管跨节点通信
- cni0网桥:只负责同一节点内的Pod之间转发流量,不分配IP、不跨节点通信
- 对应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内置IPAM | CNI的IPAM插件分配 |
| 转发设备 | docker0网桥 | cni0网桥/无网桥(Calico) |
| 跨节点 | 不支持,需额外配置 | 原生支持,插件实现 |
| 网络策略 | 无 | Calico/Cilium原生支持 |
| 扩展性 | 极差 | 极强,兼容所有云/物理机 |
九、面试+实操终极总结(必背)
- CNI是K8s容器网络标准规范+插件程序,是K8s网络的唯一入口,没有CNI Pod就没有网络
- K8s本身不管理网络,全靠kubelet调用CNI插件完成Pod网络配置
- Pod IP由CNI的IPAM模块分配,cni0网桥只做本地转发,不分配IP
- CNI插件决定集群网络模式(隧道/路由/eBPF),一个集群同一时间只能用一种CNI
- 生产环境优先选Calico/Cilium(性能+策略),测试环境用Flannel