[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ]
Kubernetes 集群里常用的网络插件简述与对比
Kubernetes 需要使用网络插件来提供集群内部和集群外部的网络通信,并提供可扩展和高性能的网络架构,其核心概念如下:
核心概念
-
每个Pod有一个独立的IP地址:每个Pod在Kubernetes集群中都有一个唯一的IP地址。Pod内的容器可以通过localhost互相通信,Pod之间的通信通过Pod IP进行。
-
所有Pod在一个平面网络中:Kubernetes假设所有Pod都可以在一个平面网络中相互通信,无需NAT。
-
所有节点可以与所有Pod通信:集群中的每个节点(主机)都能与所有Pod通信,确保Pod可以与节点上的服务(如Kubelet)进行交互。
-
Service抽象:Kubernetes使用Service抽象来定义Pod的逻辑集合,并提供负载均衡和服务发现。
关键组件
-
CNI(Container Network Interface)插件:Kubernetes使用CNI插件来管理网络接口的配置。常见的CNI插件有Flannel、Calico、Weave、Cilium等。
-
Kube-proxy:Kube-proxy在每个节点上运行,负责Service的网络规则配置,执行基于iptables或IPVS的负载均衡。
-
ClusterIP:为Service分配一个集群内部IP地址,供集群内的Pod访问。
-
NodePort:通过节点的固定端口将Service暴露给集群外部。
-
LoadBalancer:在支持的云平台上,自动配置外部负载均衡器来将流量分发到Service。
并且 Kubernetes 中网络插件的功能是通过 CNI(容器网络接口)插件来管理网络接口的配置,所以 Kubernetes 集群中的网络插件需要满足 CNI 标准规范。
什么是 CNI?
CNI(容器网络接口)是一个云原生计算基金会项目,它包含了一些规范和库,用于编写在 Linux 容器中配置网络接口的一系列插件。CNI 只关注容器的网络连接,并在容器被删除时移除所分配的资源。Kubernetes 使用 CNI 作为网络提供商和 Kubernetes Pod 网络之间的接口, 有关更多信息,可访问 CNI GitHub 项目。
CNI 使用了哪些网络模型?
CNI 网络插件使用封装网络模型(例如 Virtual Extensible Lan,缩写是 VXLAN)或非封装网络模型(例如 Border Gateway Protocol,缩写是 BGP)来实现网络结构。
-
什么是封装网络?
此网络模型提供了一个逻辑二层(L2)网络,该网络封装在跨 Kubernetes 集群节点的现有三层(L3)网络拓扑上。使用此模型,你可以为容器提供一个隔离的 L2 网络,而无需分发路由。封装网络带来了少量的处理开销以及由于覆盖封装生成 IP header 造成的 IP 包大小增加。封装信息由 Kubernetes worker 之间的 UDP 端口分发,交换如何访问 MAC 地址的网络控制平面信息。此类网络模型中常用的封装是 VXLAN、Internet 协议安全性 (IPSec) 和 IP-in-IP。
简单来说,这种网络模型在 Kubernetes worker 之间生成了一种扩展网桥,其中连接了 pod, 如果你偏向使用扩展 L2 网桥,则可以选择此网络模型。使用此种网络模型的 CNI 网络插件包括 Flannel、Canal、Weave 和 Cilium。注:默认情况下,Calico 不会使用此模型,但你可以对其进行配置。
weiyigeek.top-封装网络模型图
-
什么是非封装网络?
该网络模型提供了一个 L3 网络,用于在容器之间路由数据包。此模型不会生成隔离的 L2 网络,也不会产生开销。这些好处的代价是,Kubernetes worker 必须管理所需的所有路由分发。该网络模型不使用 IP header 进行封装,而是使用 Kubernetes Worker 之间的网络协议来分发路由信息以实现 Pod 连接,例如 BGP。
简而言之,这种网络模型在 Kubernetes worker 之间生成了一种扩展网络路由器,提供了如何连接 Pod 的信息, 如果你偏向使用 L3 网络,则可以选择此网络模型。此模型在操作系统级别为 Kubernetes Worker 动态更新路由。对延迟较不敏感。使用此种网络模型的 CNI 网络插件包括 Calico 和 Cilium,注:Cilium 可以使用此模型进行配置,即使这不是默认模式。
weiyigeek.top-非封装网络模型图
Kubernetest 中的 CNI 网络插件
在生产学习环境中,通常会使用以下网络插件,前面说过在K8S集群中的网络插件需要满足CNI(容器网络接口)
标准规范,因此可以互换使用。
- Flannel:最初识时常用网络插件,它使用了虚拟网络技术来实现容器之间的通信,支持多种网络后端,如 VXLAN、UDP 和 Host-GW(
常用
)。
weiyigeek.top-Flannel 模型通信图
- Calico:基于 BGP 的网络插件,它使用路由表来路由容器之间的流量,支持多种网络拓扑结构,并提供了安全性和网络策略功能(
常用
)。
weiyigeek.top-Calico 模型通信图
- Cilium:基于
eBPF (Extended Berkeley Packet Filter)
技术的网络插件,它使用 Linux 内核的动态插件来提供网络功能,如路由、负载均衡、安全性和网络策略等(常用
)。
weiyigeek.top-Cilium 模型架构图图
- Antrea:基于
OVS (Open vSwitch)
技术的网络插件,它提供了容器之间的通信、网络策略和安全性等功能,还支持多种网络拓扑结构。
weiyigeek.top-Antrea 模型通信图
- Kube-OVN :基于
OVN/OVS
的网络插件,提供子网、静态 IP、ACL、QoS 等高级功能。
weiyigeek.top-Kube-OVN 模型通信图
下表总结了不同 CNI 插件的 GitHub 指标,让你了解当前Kubernetes中最受欢迎的四种 CNI 网络插件。
提供商 | 项目介绍 | 项目地址 | Stars |
---|---|---|---|
Flannel | Flannel 是一种简单易行的方法来配置为Kubernetes设计的第3层网络结构。 | https://github.com/flannel-io/flannel | 8.7k |
Calico | Calico 由 Tigera 创建和维护,是一个开源项目,是容器网络和安全解决方案。 | https://github.com/projectcalico/calico | 5.8k |
Cilium | Cilium 是一种网络、可观察性和安全性解决方案,具有基于 eBPF 的 数据平面,其提供了一个简单的平面第 3 层网络,具有跨度能力 处于本机路由或覆盖模式的多个集群。 | https://github.com/cilium/cilium | 19.5k |
Antrea | Antrea 是一个Kubernetes网络解决方案,它在第3/4层运行,为Kubernetes集群提供网络和安全服务,利用Open vSwitch作为网络数据平面。 | https://github.com/antrea-io/antrea | 1.6k |
Kube-OVN | Kube-OVN 是 CNCF 沙箱级别的项目 ,将基于 OVN 的网络虚拟化与 Kubernetes 集成。 | https://github.com/kubeovn/kube-ovn | 1.9k |
下面是 Flannel、Calico 和 Cilium 最常用的三个网络插件的功能、特点及应用场景的对比表格:
特性/功能 | Flannel | Calico | Cilium |
---|---|---|---|
基本原理 | 使用覆盖网络创建平面网络 | 使用BGP路由和eBPF进行高效数据包转发 | 使用eBPF进行高性能网络和安全管理 |
网络模式 | VXLAN、Host-Gateway、UDP、IPIP、AWS VPC | 纯IP、IPIP、VXLAN、BGP、WireGuard、AWS VPC、GCE | Direct Routing、VXLAN、Geneve、IPIP、Egress Gateway、Cluster Mesh、Host-Reachable Services、Transparent Encryption |
性能 | 较低 | 高 | 最高 |
复杂性 | 简单 | 中等 | 复杂 |
网络策略 | 不支持 | 支持 | 支持 |
安全性 | 基本 | 高 | 最高 |
跨子网通信 | 支持(VXLAN、IPIP) | 支持 | 支持 |
加密 | 不支持 | 支持(WireGuard) | 支持(IPsec、WireGuard) |
多集群支持 | 不支持 | 支持(使用BGP) | 支持(Cluster Mesh) |
可扩展性 | 中等 | 高 | 高 |
监控和可视化 | 基本 | 高 | 高 |
容器网络接口(CNI) | 支持 | 支持 | 支持 |
应用场景 | 简单的Kubernetes集群,小规模集群 | 中大型集群,需高性能和灵活网络策略 | 需要高性能、高安全性和可扩展性的大型集群 |
安装配置 | 简单,适用于入门用户 | 中等,适用于有一定经验的用户 | 复杂,适用于高级用户和大规模部署 |
支持的Kubernetes版本 | 广泛支持 | 广泛支持 | 广泛支持 |
调试和故障排除 | 简单 | 较复杂 | 复杂 |
社区支持 | 活跃 | 非常活跃 | 非常活跃 |
商业支持 | 基本 | 提供 | 提供 |
应用场景:
-
Flannel 适合简单的Kubernetes集群和小规模集群,优点是安装和配置简单,但缺乏高级功能如网络策略和加密。
-
Calico 适用于中大型集群,提供高性能、灵活的网络策略和良好的安全支持,适合需要高性能和灵活网络策略的环境。
-
Cilium 适合需要高性能、高安全性和可扩展性的大型集群,功能强大但配置和维护较复杂,适合高级用户和大规模部署。
若文章写得不错,不要吝惜手中关注、转发,点赞、在看,有疑问的伙伴,在评论区留言你想法哟💬!
如果此篇文章对你有帮助,请你将它转发给更多的人!
学习推荐 往期文章