目录

一:网桥bridge

二:overlay network 覆盖网络

1)Flanel UDP 模式(目前已弃用)

路由及子网信息在哪?

为什么UDP模式会被废掉?

2)Flanel Vxlan模式

什么是Flannel.1设备?

Flannel的Vxlan模式数据传输?

三:三层网络方案

1)Flannel的host-gw模式

host-gw模式传输流程

Flannel gw模式如何维护路由信息?

为什么Flannel host-gw 模式必须要求集群宿主机之间是二层连通的?

2)Calico模式

calico node-to-node插件组成部分

calico node-to-node与flannel的gw模式区别?

calico node-to-node 传输流程

calico的node-to-node模式的优缺点?


一:网桥bridge

1)在docker0 上发起一个到 docker1的网络请求

2)在docker0 上通过路由 到达宿主机 eth0网卡上

3)通过ARP(Address Resolution Protocol 是通过三层的 IP 地址找到对应的二层 MAC 地址的协议)广播,在网桥上的所有vet网卡都会收到此ARP广播,此时docker1的网卡就会收到该广播,从而将docker1的MAC地址回复给docker0

4)有了这个MAC地址就可以发送数据包了

二:overlay network 覆盖网络

覆盖网络目的为垮主机通信

1)Flanel UDP 模式(目前已弃用)

  • docker0 访问 docker3, 查询路由表发现需要通过一个叫flannel0的tun设备(在 Linux 中,TUN 设备是一种工作在三层(Network Layer)的虚拟网络设备。TUN 设备的功能非常简单,即:在操作系统内核和用户应用程序之间传递 IP 包。)
  • 这个flannel0设备是有flannel进程管理,这就决定数据流会从用户态到内核态流进流出,同时flannel进程管理pod网络划分,并把地址划分信息记录在etcd数据库中
  • 通过etcd数据库记录信息知道目标容器地址在哪个node上,通过把数据封装到UDP数据包中传输到目标node上,每台node节点上的 flanneld,都监听着一个 8285 端口,所以 flanneld 只要把 UDP 包发往目标 node 的 8285 端口即可
  • 目标node 接受到源node发送过来的UDP数据包,进行解封装,最后就是就是上面网桥网络数据通信过程

路由及子网信息在哪?

Flannel 项目里一个非常重要的概念:子网(Subnet),而这些子网与宿主机的对应关系,正是保存在 Etcd 当中。

flanneld 进程在处理由源目标传入的 IP 包时,就可以根据目的 IP 的地址从etcd中查找到子网对应的宿主机的 IP 地址

为什么UDP模式会被废掉?

因为UDP 模式有严重的性能问题,如下图一次数据传输过程要经过六次用户态到内核态装换。

在 Linux 操作系统中,上述这些上下文切换和用户态操作的代价其实是比较高的,这也正是造成 Flannel UDP 模式性能不好的主要原因。

2)Flanel Vxlan模式

VXLAN,即 Virtual Extensible LAN(虚拟可扩展局域网),是 Linux 内核本身就支持的一种网络虚似化技术。所以说,VXLAN 可以完全在内核态实现上述封装和解封装的工作,从而通过与前面相似的“隧道”机制,构建出覆盖网络(Overlay Network)。

  • 在三层网络IP之上覆盖有内核VXLAN模块负责维护的二层覆盖网络
  • 而为了能够在二层网络上打通“隧道”,VXLAN 会在宿主机上设置一个特殊的网络设备作为“隧道”的两端。这个设备就叫作 VTEP,即:VXLAN Tunnel End Point(虚拟隧道端点)这个VTEP设备在node节点上的体现就是名称为Flannel.1的网卡设备。
  • Flannel.1设备既有IP又有MAC

什么是Flannel.1设备?

Flannel.1这个设备的信息,是宿主机上的 flanneld 进程负责维护的

这个设备既有IP地址又有MAC地址,IP地址往往为此NODE节点POD 的IP段的第一个地址, 如NODE1节点的IP地址段为10.1.16.0/24 那么此NODE1上的flanneld.1的IP地址为10.1.16.0/32 这个地址也为IP地址段的网关地址

当该node1节点加入到k8s集群后,其他node节点上就会自动添加一条路由信息,路由信息内容如下:

$ route -n

Kernel IP routing table

Destination    Gateway     Genmask         Flags   Metric Ref Use  Iface
10.1.16.0      10.1.16.0   255.255.255.0   UG      0      0    0   flannel.1

凡是发往 10.1.16.0/24 网段的 IP 包,都需要经过 flannel.1 设备发出,并且被发往的网关地址是:10.1.16.0。

在flannel.1设备上会添加10.1.16.0的MAC地址,(此MAC地址已经在NODE1添加进K8S集群的时候写入到其他NODE节点里,所以根本不需要进行ARP学习)

Flannel的Vxlan模式数据传输?

VTEP设备的MAC地址:此MAC地址已经在NODE1添加进K8S集群的时候写入到其他NODE节点里,所以根本不需要进行ARP学习,直接可以查询出来

VXLAN Header: 数字1代表走的是VXLAN,需要在Flannel.1上解封装

目标主机IP地址:NODE节点的IP地址(在二层网络进行 UDP 包的转发。而在 Linux 内核里面,“网桥”设备进行转发的依据,来自于一个叫作 FDB(Forwarding Database)的转发数据库。也是 flanneld 进程负责维护的)

目标主机MAC地址:NODE的 MAC 地址。这个 MAC 地址本身,是 通过的 ARP 表要学习,无需 Flannel 维护。

三:三层网络方案

1)Flannel的host-gw模式

host-gw 模式就是路由模式,指定到目的地址的网关即下一跳地址。

host-gw 模式的工作原理,其实就是将每个 Flannel 子网(Flannel Subnet,比如:10.10.1.0/24)的“下一跳”,设置成了该子网对应的宿主机的 IP 地址。


$ ip route
...
10.10.1.0/24 via 192.168.0.3 dev eth0

这条路由规则的含义是:目的 IP 地址属于 10.10.1.0/24 网段的 IP 包,应该经过本机的 eth0 设备发出去,并且,它下一跳地址是 192.168.0.3

host-gw模式传输流程

一旦配置了下一跳地址,那么接下来,当 IP 包从网络层进入链路层封装成帧的时候,eth0 设备就会使用下一跳地址对应的 MAC 地址,作为该数据帧的目的 MAC 地址。显然,这个 MAC 地址,正是 目的node的 MAC 地址。

目的node解压数据包后发现目的地址为10.10.1.1 则会查询路由信息发现需要发送到cni0网桥,接下来就可以到目的容器

Flannel gw模式如何维护路由信息?

当然,Flannel 子网和主机的信息,都是保存在 Etcd 当中的。flanneld 只需要 WACTH 这些数据的变化,然后实时更新路由表即可。

为什么Flannel host-gw 模式必须要求集群宿主机之间是二层连通的?

host-gw 模式能够正常工作的核心,就在于 IP 包在封装成帧发送出去的时候,会使用路由表里的“下一跳”来设置目的 MAC 地址。这样,它就会经过二层网络到达目的宿主机。

2)Calico模式

Calico核心工作方式就是通过BGP(就是在大规模网络中实现节点路由信息共享的一种协议)协议,自动在各node节点添加路由信息。

calico node-to-node插件组成部分

  • Calico 的 CNI 插件。
  • Felix。它是一个 DaemonSet,负责在宿主机上插入路由规则(即:写入 Linux 内核的 FIB 转发信息库),以及维护 Calico 所需的网络设备等工作。
  • BIRD。它就是 BGP 的客户端,专门负责在集群里分发路由规则信息。

calico node-to-node与flannel的gw模式区别?

calico不会在任何node节点上创建网桥

calico node-to-node 传输流程

10.233.2.3 dev cali5863f3 scope link

直接通过routes路由表查询数据发送到哪个container

所以可以知道calico会在node节点上维护许多路由信息,意味这每个container节点都会在node上添加一条如上的路由条目。

calico这种模式也为node-to-node-mesh模式但也存在一些缺点

calico的node-to-node模式的优缺点?

优点: 

这种模式传输性能高,架构简单。

缺点:

1)随着node节点增多,路由条目就会以N的2次方数量增加,BGP路由共享协议维护就会面临巨大的压力

2)该模式只能在二层网络下运行

解决缺点1方法

增加专门负责维护路由学习的服务器,其他节点只需要跟这些专门维护路由协议的服务器同步路由信息即可。

解决缺点2方法

calico 的 IPIP模式

3)calico ipip模式

calico ipip模式跟calico 三层网络模式区别是多了一个tunl 设备,calico ipip模式里的数据需要通过路由规则后通过tunl设备封装目的node节点的IP,到达目的地址后在解封装。

缺点是会有一定的性能损耗

优点是可以垮二层网络

Logo

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

更多推荐