CNI(Container Network Interface)意为容器网络接口,它是一种标准的设计,为了让用户在容器创建或销毁时都能够更容易地配置容器网络。
由Google和CoreOS联合定制的网络标准,是Kubernetes网络插件的基础。基于CNI标准,有如下常见的CNI网络插件产品。
目前主流的网络插件是Flannel、Calico、cillium。这些插件既可以确保满足Kubernetes的网络要求,又能为Kubernetes集群管理员提供他们所需的某些特定的网络功能。
本文讲通过Kubernetes集群中不同网络环境下,通过Pod之间流量分析来比较Flannel、Calico、cillium、canal处理网络流量的不同之处。
1. Canal网络插件介绍
2020年废弃不再维护,项目维护者认为应该将精力放在为flannel和calico项目增加功能上,而非深度整合两者。
Canal
结合Flannel
和Calico
的网络功能。将Flannel
叠加网络层和VXLAN封装
与Calico
的网络组件(如 Felix、主机代理和网络策略)集成在一起,
使用Flannel处理节点间的流量,使用 Calico 处理节点内流量和网络策略(Calico网络策略,可以在网络方面提供项目/命名空间隔离)。
总之,对于希望利用具有网络策略规则的覆盖网络模型来加强安全性的企业来说,Canal 是一个不错的选择。
优点: Flannel
叠加网络且支持网络策略、提供了统一部署Flannel
和Calico
的方法
缺点: Flannel
和Calico
之间的集成度不高
Canal 要求在节点上安装
iptables
或xtables-nft
包。
2. Calico网络插件介绍
基于BGP的纯三层网络方案,与OpenStack\k8s\aws\gce都有良好集成,默认配置不启用任何网络策略
Calico在每个计算节点上实现一个高效的vRouter
(使用Linux Kernel),负责数据转发。每个vRouter
使用BGP协议
在整个Calico网络中传播当前节点上运行的workload
的路由信息。
这确保了workload之间的数据流量通过IP路由互联,无需额外的NAT、隧道或Overlay网络。此外,Calico还基于iptables提供了丰富和灵活的网络策略,用于实现多租户隔离、安全组和其他可达性限制。
优点: 支持网络策略、网络性能高、支持 SCTP
缺点: 不支持组播
3. Flannel网络插件介绍
Flannel通过给每个宿主机分配子网的方法为容器提供虚拟网络。基于
Linux TUN/TAP
,使用UDP封装IP包来创建overlay网络,并依靠etcd来管理网络分配数据。
Flannel 是为 K8s 配置 L3 网络结构的简单方法。Flannel在每台主机上运行一个名为flanneld
的二进制 Agent,flanneld
负责从更大的预配置地址空间中为每台主机分配子网。
Flannel 通过k8s API
或直接使用etcd来存储网络配置、分配的子网、以及其他辅助数据(例如主机的公共 IP)。数据包使用某种后端机制来转发,默认封装为 VXLAN。
默认情况下,封装的流量是不加密的。Flannel 提供了两种加密方案:
- IPSec:使用 strongSwan 在 Kubernetes worker 之间建立加密的 IPSec 隧道。它是加密的实验性后端。
- WireGuard:比 strongSwan 更快的替代方案。
优点: 支持IPsec
加密、单一二进制安装和配置
缺点: 不支持网络策略、无法通过单个守护进程运行多台主机和多个网络,但可以为每台主机运行多个守护进程。
4. Weave网络插件介绍
Weave Net
是一个去中心化的容器网络方案,各个host上的wRouter间通过建立Full Mesh
的TCP连接,并通过Gossip来同步控制信息。
这种方式省去了集中式的K/V Store
,一定程度上简化了部署复杂性,Weave将其称为data centric
,而非Raft或者Paxos的algorithm centric
。
在数据平面上,Weave通过UDP封装实现L2 Overlay
,封装支持两种模式,一种是在用户空间运行的sleeve mode
(Flannel的udp),另一种是在内核空间运行的fastpath mode
(Flannel的vxlan)。
Sleeve mode
通过pcap
设备在Linux bridge
上截获数据包并由wRouter完成UDP封装,支持对L2 traffic
进行加密,还支持Partial Connection
,但是性能损失明显。Fastpath mode
通过OVS
的odp封装VxLAN
并完成转发,wRouter不直接参与转发,而是通过下发odp
流表的方式控制转发,这种方式可以明显地提升吞吐量,但是不支持加密等高级功能。
fastpass相当于vxlan overlay, sleeve相当于udp overlay, 改进点在于:1. 支持网络策略;2.去除额外的中心化容器地址分配器,将配置存储功能集成至服务内部;
优点: 内核级通信、网络策略和加密支持、提供有偿故障排除支持
缺点: 由于基于内核的路由选择,只支持 Linux 系统、默认加密标准导致网络速度降低
5. Cilium网络插件介绍
Cilium 在 Kubernetes 中启用网络和网络策略(L3、L4 和 L7)。默认情况下,Cilium 使用 eBPF 技术在节点内部路由数据包,并使用 VXLAN 将数据包发送到其他节点。也可以配置非封装的技术。
Cilium 推荐大于 5.2 的内核版本,从而充分利用 eBPF 的能力。Kubernetes worker 需要打开 TCP 端口 8472(VXLAN)和 TCP 端口 4240(健康检查)。此外,还必须为健康检查启用 ICMP 8/0。
默认情况下,Cilium 不允许 Pod 与其他节点上的 Pod 通信。要解决此问题,请启用 Ingress Controller 以使用 “CiliumNetworkPolicy” 进行跨节点路由请求。
选择 Cilium CNI 并为新集群启用项目网络隔离后,配置如下:
|
|
各个网络插件的 CNI 功能
下表总结了 Rancher 中每个 CNI 网络插件支持的不同功能:
提供商 | 网络模型 | 路由分发 | 网络策略 | 网格 | 外部数据存储 | 加密 | 加密协议 | Ingress/Egress 策略 | 企业支持 |
---|---|---|---|---|---|---|---|---|---|
Canal | 封装(UDP/VXLAN/IPIP)、未封装(host-gw/BGP) | 否 | 是 | 否 | K8s API | 是 | IPsec、WireGuard | 是 | 否 |
Flannel | 封装(UDP/VXLAN)或未封装(host-gw) | 否 | 否 | 否 | K8s API | 是 | IPsec | 否 | 否 |
Calico | 封装(VXLAN/IPIP)或未封装(BGP) | 是 | 是 | 是 | Etcd 和 K8s API | 是 | IPsec | 是 | 是 |
WeaveNet | 封装(UDP/VXLAN) | 是 | 是 | 是 | 否 | 是 | WireGuard | 是 | 是 |
Cilium | 封装(VXLAN) | 是 | 是 | 是 | Etcd 和 K8s API | 是 | IPsec | 是 | 否 |
- 网络模型:封装或未封装。如需更多信息,请参阅 CNI 中使用的网络模型。
- 路由分发:一种外部网关协议,用于在互联网上交换路由和可达性信息。BGP 可以帮助进行跨集群 pod 之间的网络。此功能对于未封装的 CNI 网络插件是必须的,并且通常由 BGP 完成。如果你想构建跨网段拆分的集群,路由分发是一个很好的功能。
- 网络策略:Kubernetes 提供了强制执行规则的功能,这些规则决定了哪些 service 可以使用网络策略进行相互通信。这是从 Kubernetes 1.7 起稳定的功能,可以与某些网络插件一起使用。
- 网格:允许在不同的 Kubernetes 集群间进行 service 之间的网络通信。
- 外部数据存储:具有此功能的 CNI 网络插件需要一个外部数据存储来存储数据。
- 加密:允许加密和安全的网络控制和数据平面。
- Ingress/Egress策略:允许你管理 Kubernetes 和非 Kubernetes 通信的路由控制。
CNI 社区人气
下表总结了不同的 GitHub 指标,了解每个项目的受欢迎程度和活动。数据收集于 2023 年 8 月
提供商 | 项目 | Stars | Forks | Contributors |
---|---|---|---|---|
Canal | https://github.com/projectcalico/canal | 704 | 104 | 21 |
Flannel | https://github.com/flannel-io/flannel | 8.2k | 2.9k | 223 |
Calico | https://github.com/projectcalico/calico | 4.9k | 1.2k | 320 |
Weave | https://github.com/weaveworks/weave/ | 6.5k | 673 | 87 |
Cilium | https://github.com/cilium/cilium | 16.3k | 2.4k | 640 |
CNI 网络性能
理论上说,这些CNI工具的网络速度应该可以分为3个速度等级。
最快的是Romana、Gateway模式的Flannel、BGP模式的Calico。
次一级的是IPIP模式的Calico、Swarm的Overlay网络、VxLan模式的Flannel、Fastpath模式的Weave。
最慢的是UDP模式的Flannel、Sleeve模式的Weave。
Bare > Flannel(host-gw) ~ Calico(bgp) > Calico(ipip) ~ Flannel(vxlan) > Flannel(udp)
测试容器网络速度的具体方法