一、前言
Kubernetes作为一个高度模块化的开源项目,在网络实施方面提供了很大的灵活性。在Kubernetes生态系统中出现了许多项目,使容器之间的通信变得简单、一致和安全。
CNI是容器网络接口的缩写,是这些项目中的一个,它支持基于插件的功能,以简化Kubernetes的网络。CNI背后的主要目的是为管理员提供足够的控制,以监控通信,同时减少手动生成网络配置的开销。
通过CNI,通信是通过一个集成的插件发生的,该插件旨在通过允许Kubernetes供应商实现自定义的网络模型,为你的所有pod提供一个一致和可靠的网络。
CNI插件分配了命名空间隔离、流量和IP过滤等功能,在默认情况下,Kubernetes Kube-Net插件不提供这些功能。假设一个开发者想要实现这些高级网络功能。在这种情况下,他们必须使用带有容器网络接口(CNI)的CNI插件,使网络的创建和管理更容易。
市场上有各种CNI插件。但是对于这个博客,我们将讨论最流行的开源的,如Flannel、Calico、WeaveNet、Cilium和Canal。在我们开始讨论不同的CNI插件列表之前,让我们先快速了解一下CNI。
二、什么是容器网络接口(CNI)?
CNI是一个网络框架,它允许通过一组去编写的规范和库来动态配置网络资源。插件提到的规范概述了一个接口,它将配置网络,提供IP地址,并保持多主机连接。
在Kubernetes背景下,CNI与kubelet无缝集成,允许使用 underlay 或 overlay 网络在pod之间自动配置网络。底层网络被定义在由路由器和交换机组成的网络层的物理层面。相比之下,overlay 网络使用VxLAN等虚拟接口来封装网络流量。
一旦指定了网络配置类型,运行时就会定义一个供容器加入的网络,并调用CNI插件将接口添加到容器命名空间,并通过调用IPAM(IP地址管理)插件来分配链接的子网络和路由。
除了Kubernetes网络,CNI还支持基于Kubernetes的平台,如OpenShift,通过软件定义的网络(SDN)方法提供整个集群的统一容器通信。
2.1. Flannel
由CoreOS开发的Flannel是目前Kubernetes最成熟的开源CNI项目之一。Flannel提供了一个易于使用的网络模型,可以部署覆盖基本的Kubernetes网络配置和管理用例。
Flannel通过配置一个overlay网络运行,为每个Kubernetes集群节点分配子网,用于内部IP地址分配。子网的租赁和管理是通过一个名为flanneld的守护神代理完成的,它被打包成一个二进制文件,以便在Kubernetes集群和发行版上轻松安装和配置。
在分配IP地址后,Flannel利用Kubernetes、etcd集群或API来存储主机映射和其他与网络有关的配置,并通过封装的数据包维持主机/节点之间的通信。
默认情况下,Flannel使用VXLAN配置进行封装和通信,但也有几种不同类型的后端可用,如host-gw、UDP。使用Flannel,还可以启用VxLAN-GBP进行路由,当几个主机在同一个网络上时,就需要这样做。
对于封装流量的加密,Flannel默认没有实现任何机制。不过,它还是提供了对IPsec加密的支持,它可以在Kubernetes集群的工作节点之间建立加密的隧道。
对于那些想从集群管理员角度开始Kubernetes CNI之旅的初学者来说,Flannel是一个很好的CNI插件。它简单的网络模型在用于控制主机之间的流量运输之前并没有缺点。
优点
- 支持IPsec加密
- 单一的二进制安装和配置
缺点
- 不支持网络策略
- 不能通过一个守护程序运行多个主机、多个网络,而为每个主机运行多个守护程序是可能的。
2.2. Calico
Calico是另一个流行的开源CNI插件,可用于Kubernetes生态系统。Calico由Tigera维护,定位于对网络性能、灵活性和功率等因素至关重要的环境。与Flannel不同,Calico提供先进的网络管理安全功能,同时提供主机和pod之间连接的整体概述。
在一个标准的Kubernetes集群上,Calico可以作为一个DaemonSet轻松地部署在每个节点上。集群中的每个节点都会安装三个Calico组件: Felix、BIRD和confd用于管理几个网络任务。Felix作为Calico代理处理节点路由,BIRD和confd管理路由配置的变化。
对于节点之间的路由数据包,Calico利用BGP路由协议而不是overlay网络。通过IP-IN-IP或VXLAN可以使用overlay网络模式,它可以像overlay网络一样封装跨子网发送的数据包。
Calico BGP协议使用未封装的IP网络结构,不需要用封装层包裹数据包,从而提高了Kubernetes工作负载的网络性能。簇内的pod流量使用Wireguard进行加密,Wireguard在节点之间创建和管理隧道,以提供安全的通信。
有了Calico,跟踪和调试比其他工具容易得多,因为没有操作数据包的包装器。开发人员和管理员可以很容易地理解数据包行为,并使用策略管理和访问控制列表等高级网络功能。
Calico中的网络策略实现了deny/match规则,可以通过清单应用,将入口策略分配给pod。用户可以定义全局范围的策略,并与Istio服务网整合,以控制pods流量,提高安全性并治理Kubernetes工作负载。
总的来说,对于希望控制其网络组件的用户来说,Calico是一个很好的选择。Calico可以很容易地与不同的Kubernetes平台(如kops、Kubespray)一起使用,并通过Calico企业提供商业支持。
优点
- 支持网络策略
- 网络性能高
- 支持SCTP
缺点
- 不支持组播
2.3. Cilium
Cilium是一个由Linux内核开发人员开发的开源、高度可扩展的Kubernetes CNI解决方案。Cilium通过增加利用eBPF过滤技术的高级应用规则,确保Kubernetes服务之间的网络连接安全。Cilium作为一个守护进程`cilium-agent’部署在Kubernetes集群的每个节点上,以管理操作并将网络定义转化为eBPF程序。
Pods之间的通信是通过 overlay 网络或利用路由协议进行的。IPv4和IPv6地址都支持。overlay 网络的实现利用VXLAN隧道进行数据包封装,而本地路由则通过未封装的BGP协议发生。
Cilium可以与多个Kubernetes集群一起使用,并可以提供多CNI功能,高水平的检查,跨所有集群的pod-to-pod连接。
它的网络和应用层意识管理着数据包检查,以及应用协议数据包的使用。
Cilium还通过HTTP请求过滤器支持Kubernetes网络策略。政策配置可以写入YAML或JSON文件,并提供入口和出口执行。管理员可以根据请求方法或路径头接受或拒绝请求,同时将策略与Istio等服务网整合。
优点
- 支持多个集群
- 可与其他CNI一起使用
缺点
- 可能需要与其他CNI配对使用BGP
- 为多个集群进行设置很复杂
2.4. WeaveNet
Weave Net由Weavescope开发,是一个具有CNI能力的网络解决方案,可以在Kubernetes集群中灵活联网。WeaveNet最初是为容器开发的,但后来演变成了Kubernetes网络插件。Weavenet可以很容易地在Kubernetes集群上安装和配置,作为一个daemonset在每个节点上安装必要的网络组件。
WeaveNet的工作原理是创建一个网状overlay网络,负责连接集群中的所有节点。在网络内部, Weave Net利用一个内核系统在节点之间进行数据包传输。内核所利用的协议被称为快速数据路径,它可以将数据包直接传输到目标 pod,而无需多次进出用户空间。
如果快速数据路径不起作用,或者数据包必须传送到另一台主机。Weavenet利用慢速套接协议进行传输。主机名解析、负载平衡和容错等功能是通过Weavenet的DNS服务器WeaveDns提供的。
对于数据包的封装和加密,WeaveNet为Kubernetes使用VxLAN,并为快速数据通路和套接字流量使用NaCl和IPsec加密。
Weavenet不使用etcd来存储网络配置。设置被持久化在一个数据库文件中,由DaemonSet创建的每个pod共享。
在网络策略支持方面,WeaveNet使用weave-npc容器来管理Kubernetes网络策略。该容器是默认安装和配置的,只需要网络规则来保证主机之间的通信。
优点
- 内核级通信
- 网络策略和加密支持
- 提供付费支持以排除故障
缺点
- 由于基于内核的路由,只支持Linux
- 由于默认的加密标准,网络速度有所下降
2.5. Canal
Canal是一个CNI供应商,它结合了Flannel和Calico的网络功能,为Kubernetes集群提供一个统一的网络解决方案。Canal将Flannel overlay 网络层和VXLAN封装与Calico的网络组件(如Felix、主机代理和网络策略)整合在一起。总的来说,对于想要利用overlay网络模型和网络策略规则来实现更严格的安全的组织来说,Canal是一个很好的选择。
优点
- 使用Flannel叠加网络的网络策略支持
- 为部署Flannel和Calico提供了一个统一的方式。
缺点
- 两个项目之间没有那么多的深度整合
2.6. 对比总结
Flannel | Calico | Cilium | Weavenet | Canal | |
---|---|---|---|---|---|
部署方式 | DaemonSet | DaemonSet | DaemonSet | DaemonSet | DaemonSet |
封装和路由 | VxLAN | IPinIP,BGP,eBPF | VxLAN,eBPF | VxLAN | VxLAN |
是否支持网络策略 | 否 | 是 | 是 | 是 | 是 |
数据存储 | Etcd | Etcd | Etcd | 否 | Etcd |
加密 | 是 | 是 | 是 | 是 | 否 |
支持Ingress | 否 | 是 | 是 | 是 | 是 |
企业支持 | 否 | 是 | 否 | 是 | 否 |
三、选择一个CNI供应商
没有一个CNI供应商能满足所有的项目需求。对于简单的设置和配置,Flannel和Weavenet提供了很好的功能。Calico的性能更好,因为它通过BGP使用底层网络。Cilium通过BPF利用完全不同的应用层过滤模型,更倾向于企业安全。
此外,没有必要倾向于单一的供应商,因为运营需求可能因项目而大不相同。使用和测试多种解决方案将满足复杂的网络需求,同时提供更可靠的网络体验。