参考:kubernetes(k8s)网络插件Flannel/Calico对比介绍

  Kubernetes网络CNI(Container NetworkInterface)意为容器网络接口,它是一种标准的设计,为了让用户在容器创建或销毁时都能够更容易地配置容器网络。由GoogleCoreOS联合定制的网络标准,是Kubernetes网络插件的基础。基于CNI标准,有如下常见的CNI网络插件产品。

主要是Flannel和Calico。这些插件既可以确保满足Kubernetes的网络要求,又能为Kubernetes集群管理员提供他们所需的某些特定的网络功能。本文讲通过Kubernetes集群中不同网络环境下,通过Pod之间流量分析来比较Flannel和Calico处理网络流量的不同之处。

1、Flannel网络插件介绍

  Flannel是由CoreOS开发出来的,可能算是最直接和最受欢迎的CNI插件;它是容器编排系统中最成熟的网络结果示例之一,旨在实现更好的容器和主机间的网络;许多常见的Kubernetes集群部署工具和许多Kubernetes发行版都可以默认安装Flannel;Flannel可以使用Kubernetes集群的现有etcd集群来使用API存储其状态信息,因此不需要专用的数据存储。
  Flannel配置第3层IPv4 Overlay网络。它会创建一个大型内部网络,跨越集群中每个节点。在此Overlay网络中,每个节点都有一个子网,用于在内部分配IP地址。在配置Pod时,每个节点上的网桥接口都会为每个新容器分配一个地址。同一主机中的Pod可以使用网桥进行通信,而不同主机上的Pod会使用flanneld将其流量封装在UDP数据包中,以便路由到适当的目标。
  Flannel有几种不同类型的后端可用于封装和路由。默认和推荐的方法是使用VXLAN,因为VXLAN性能更良好并且需要的手动干预更少。

1.1、Flannel的几种模式

  Flannel通过在每一个节点上启动一个叫flannel的进程,负责为每一个节点上的子网划分,并将相关配置信息(如各节点的子网网段、外部IP等)保存到etcd中,而具体的网络报文转发交给backend实现。
  flanneld可以在启动时通过配置文件指定不同的backend进行网络通信,目前比较成熟的backend有 UDPVXLANhost-gateway三种。目前,VXLAN是官方比较推崇的一种backend实现方式。
  UDP模式和VXLAN模式基于三层网络层即可实现,而host-gateway模式就必须要求集群所有机器在同一个广播域,也就是需要在二层网络同一个交换机下才能实现。
  host-gateway一般用于对网络性能要求比较高的场景,但需要基础网络架构的支持;UDP则用于测试及一般比较老的不支持VXLAN的Linux内核。

1.2、Flannel网络环境中实验过程

  测试环境中,使用Flannel默认的VxLAN模式worknode节点信息及部署的pod:

  登陆节点xworker1,查看veth pair对及网桥配置。

  Flannel网络插件自动维护Pod CIDR的路由信息。

  xworker1 节点路由信息显示目的地址为10.244.0.0/24和10.244.2.0/24的请求流量要通过 flannel.1路由到xworker1上的eth1网络接口。

  通过kubectl 命令查看部署在flannel网络中的Pod IP。

  查看部署到kubernetes集群的测试服务, xworker2节点上Pod IP为10.244.2.2,xworker1节点上Pod IP为10.244.1.2。

  接着尝试在节点xworker2上访问节点xworker1上的服务,并用tshark工具捕捉网络请求。

  可以看到网络请求最终通过flannel.1到达了POD的目的地址10.244.1.2并最终返回。

  通过xworker1节点上的网络抓包,可以看到Flannel使用默认的VxLan协议封装。

2、Calico网络插件介绍

  Calico是Kubernetes生态系统中另一种流行的网络选择。虽然Flannel被公认为是最简单的选择,但Calico以其性能、灵活性而闻名。Calico的功能更为全面,不仅提供主机和pod之间的网络连接,还涉及网络安全和管理。Calico CNI插件在CNI框架内封装了Calico的功能。
  除了网络连接外,Calico还以其先进的网络功能而闻名。网络策略是其最受追捧的功能之一。此外,Calico还可以与服务网格Istio集成,以便在服务网格层和网络基础架构层中解释和实施集群内工作负载的策略。这意味着用户可以配置强大的规则,描述pod应如何发送和接受流量,提高安全性并控制网络环境。如果对你的环境而言,支持网络策略是非常重要的一点,而且你对其他性能和功能也有需求,那么Calico会是一个理想的选择。
  尽管部署Calico所需的操作看起来相当简单,但它创建的网络环境同时具有简单和复杂的属性。与Flannel不同,Calico不使用overlay网络。相反,Calico配置第3层网络,该网络使用BGP路由协议在主机之间路由数据包。这意味着在主机之间移动时,不需要将数据包包装在额外的封装层中。BGP路由机制可以本地引导数据包,而无需额外在流量层中打包流量。

2.1、Calico的几种模式

  IPIP模式:把 IP 层封装到IP 层的一个 tunnel。作用其实基本上就相当于一个基于IP层的网桥!一般来说,普通的网桥是基于mac层的,根本不需 IP,而这个ipip 则是通过两端的路由做一个 tunnel,把两个本来不通的网络通过点对点连接起来。
  BGP 边界网关协议(Border Gateway Protocol, BGP):是互联网上一个核心的去中心化自治路由协议。BGP不使用传统的内部网关协议(IGP)的指标。
  Route Reflector 模式(RR)(路由反射):Calico维护的网络在默认是(Node-to-Node Mesh)全互联模式,Calico集群中的节点之间都会相互建立连接,用于路由交换。但是随着集群规模的扩大,mesh模式将形成一个巨大服务网格,连接数成倍增加。这时就需要使用 Route Reflector(路由器反射)模式解决这个问题。
2.2、Calico网络环境中实验过程

  在测试环境中,使用Calico默认的VxLan模式。workernode节点信息及部署的Pod示意如下:

  在worker node节点上插卡veth对及IPIP tunnel配置信息。

  Calico网络插件自动维护workernode节点路由表。对于非本机节点的Pod通过tunnel0进行转发。

  通过kubectl 命令查看部署在Calico网络中的Pod IP。

  查看部署到kubernetes集群的测试服务, xworker2节点上Pod IP为10.244.61.196, xworker1节点上Pod IP为10.244.174.197

  尝试在节点xworker2上访问节点xworker1上的服务, 并用tshark工具捕捉网络请求。

  可以看到网络请求最终通过tunnel0到达了POD的目的地址10.244.174.197并最终返回。

  通过xworker1节点上的网络抓包,可以看到Calico使用默认的IPIP协议,没有使用Overylay网络。

  Calico 提供管理工具,对网络中中的节点状态接节点配置进行管理,可以看到节点之间使用的是node-to-node的full mesh模式。

3、总结

  kubernetes采用的 CNI标准,让kubernetes生态系统中的网络解决方案百花齐放。也可以有更多的选择,这意味着大多数用户将能够找到适合当前需求和部署环境的CNI插件,同时还可以在环境发生变化时也能找到其他的解决方案。
  Kubernetes网络模型本身对某些特定的网络功能有一定要求,但在实现方面也具有一定的灵活性。因此,业界已有不少不同的网络方案,来满足特定的环境和要求。不同企业之间的运营要求差异很大,因此拥有一系列具有不同复杂程度和功能丰富性的成熟解决方案,大大有助于Kubernetes在满足不同用户独特需求的前提下,仍然能够提供一致的用户体验。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐