` k8s(九) | 听云轩

k8s(九)

flannel 和calico网络

flannel

flannel的功能简单来说就是让集群中的不同节点的主机创建的docker都具有全集群唯一的虚拟ip地址,但是无法做到pod与pod之间通信的安全隔离,如果在caas公有云上,用flannel的话两个用户的pod之间能够互相访问。

在默认的docker配置中,每个节点上的docker服务会分别负责所在节点容器的IP分配,这样导致的一个问题就是,不同节点上容器可能会获得相同的内外IP地址。所以flannel设计目的就是为集群中的所有节点重新规划IP地址使用规则,从而使得不同节点上的容器能够获得“同属一个内网,但是不重复的IP地址,并且不同节点上的容器能够直接通过内网IP通信”。

flannel实质上是一种overlay网络,也就是将TCP数据包装在另一种网络包里面进行路由转发和通信,默认是采用UDP转发。

特点:
  • 使集群中的不同node主机创建的docker容器都具有全集群唯一的虚拟IP地址

  • 通过overlay网络将一个分组封装在另一个分组内来将网络服务与底层基础设施分离,再将封装的数据包转发到端点后,将其解封装

  • 创建一个新的虚拟网卡flannel0接收docker网桥的数据,通过维护路由表,对接收到的数据进行封包和转发(VXLAN)

  • etcd保证了所有node上flannel所看到的配置是一样的,同时每个node上的flannel监听etcd的数据变化,实时感知集群中node的变化。

组件:
  • cni0:网桥设备,每创建一个pod都会创建一对veth pair。其中一段是pod中的eth0,另一端是cni0网桥中的端口,pod中从网卡eth0发出的流量都会发送到cni0网桥设备的端口上,cni0设备获得的ip地址是该节点分配的网段的第一个地址。

  • flannel.1:overlay网络的设备,用来进行vxlan报文的处理(封包和拆包)。不同node之间的pod数据流量都从overlay设备以隧道的形式发送到对端。

  • flanneld:flannel在每个主机中运行flanneld作为agent,它会为所在主机从集群的网络地址空间中,获取一个小的网段subnet,本主机内所有容器的IP地址都将从中分配,同时flanneld监听k8s集群数据库,为flannel.1设备提供封装数据时必要的mac,ip等网络数据信息。

通信流程:
  • pod中产生数据,根据pod的路由信息,将数据发送到cni0。

  • Cni0根据节点的路由表,将数据发送到隧道设备flannel.1

  • Flannel.1查看数据包的目的IP,从flanneld获得对端隧道设备的必要信息,封装数据包

  • Flannel.1将数据包发送到对端设备。对端节点的网卡接收到数据包,发现数据包为overlay数据包,解开外层封装,并发送内层封装到flannel.1设备

  • Flannel.1设备查看数据包,根据路由表匹配,将数据发送到cni0设备

  • Cni0匹配路由表,发送数据给网桥上对应的端口。

flannel可以指定不同的转发后端网络

1、hostGW

原理很简单,直接添加路由,将目的主机当做网关,直接路由原始封包。例如,我们从etcd中监听到一个EventAdded事件subnet为10.1.15.0/24被分配给主机Public IP 192.168.0.100,hostgw要做的工作就是在本主机上添加一条目的地址为10.1.15.0/24,网关地址为192.168.0.100,输出设备为上文中选择的集群间交互的网卡即可。

优点:简单,直接,效率高

缺点:要求所有的pod都在一个子网中,如果跨网段就无法通信。

2、UDP

如果需要pod不在同一个子网内,需要将pod的网络包作为一个应用层的数据包,使用UDP封装之后再集群里传输,即overlay。

3klOWn.png

包的封装:

3k1VQx.png

当容器进行跨主机通信时:

  • 因为该封包的目的地不在本主机subnet内,因此封包会首先会通过网桥转发到主机中。

  • 在主机上经过路由匹配,进入网卡flannel.1(flannel.1是一个三层的虚拟tun设备,而flanneld是一个proxy,它会监听flannel.1并转发流量)

  • 当封包进入flannel.1时,flanneld就可以从flannel.1中将封包读取出,由于flannel.1是三层设备所以读取出的封包仅仅是包含IP层的报头及其负载。

  • 最后flanneld会将获取的封包作为负载数据通过udp socket发往目的主机。

  • 在目的主机的flanneld会监听public IP所在设备,从中读取udp封包的负载,并将其放入到flannel.1设备内。

  • 容器网络封包到达目的主机,之后就可以通过网桥转发到目的容器了。

优点:Pod能够跨网段访问

缺点:隔离性不够,udp不能隔离两个网段。

3、vxlan

包类型:

3k3ggI.png

事实上,flannel只使用了vxlan的部分功能,由于VNI被固定为1,本质上工作方式和udp backend是类似的,区别无非是将udp的proxy换成了内核中的vxlan处理模块。而原始负载由三层扩展到了二层,但是这对三层网络方案flannel是没有意义的,这么做也仅仅只是为了适配vxlan的模型。

flannel缺点:

1、不支持pod之间的网络隔离,它设计思想就是将所有的pod都放在一个大二层网络中,所以pod之间没有隔离策略。

2、设备复杂,效率不高,流量经过多种设备的封装、解析会造成传输效率的下降。

calico

calico是一种容器之间互通的网络方案。在虚拟化平台中,比如OpenStack、docker等都需要实现workloads之间互联,但同时也需要对容器做隔离控制,就像在Internet中的服务仅开放80端口一样,提供隔离和管控机制。而在多数的虚拟化平台实现中,通常都使用二层隔离技术来实现容器的网络,这些二层的技术有一些弊端,比如需要依赖VLAN、bridge和隧道技术,其中bridge带来了复杂性,VLAN隔离和tunnel隧道则消耗更多的资源并对物理环境有要求。我们尝试把host当做Internet中的路由器,同样适用BGP同步路由,并使用iptables来做安全访问策略,设计出来了calico方案。

适用场景

k8s环境中的pod之间需要隔离

设计思想

calico不使用隧道或者NAT来实现转发,而是巧妙的把所有的二三层流量转换成三层流量,并通过host上路由配置完成跨host转发。

设计的优势:

1、更优的资源利用

二层网络通讯需要依赖广播消息机制,广播消息的开销与host 的数量呈指数级增长,calico使用的三层路由方法,则完全抑制了二层广播,减少了资源开销。

另外,二层使用VLAN隔离技术,天生有数量限制,即使用vxlan解决,但是会带来隧道开销问题。calico会使资源利用率更高。

2、可扩展性

calico使用与Internet类似的方案,它的网络比任何数据中心都大,calico同样天然具有可扩展性。

3、更容易debug

因为没有隧道,所以意味着workloads之间路径更短更简单,配置更少,在host上更容易进行debug调试。

4、更少的依赖

仅依赖三层路由可达

架构

3k5B4O.png

工作组件

1、felix:运行在每一台host的agent进程,主要负责网络接口管理和监听、路由、ARP管理、ACL管理和同步、状态上报等。

它会监听etcd中心的存储,从它获取事件,比如说用户在这台机器上加了一个IP,或者是创建了一个容器等等。用户创建pod后,felix负责将其网卡、IP、MAC都设置好,然后在内核的路由表里面写一条,注明这个IP应该到这张网卡,同样如果用户制定了隔离策略,felix同样将该策略创建到ACL中,以实现网络隔离。

2、etcd:分布式键值存储,主要负责网络元数据一致性,确保calico网络状态的准确性,可以与k8s共用。

3、BGP client(BIRD):calico为每一台host部署了一个BGP client,使用BIRD实现,BIRD是一个单独的项目,实现了众多动态路由协议比如BGP、OSPF、RIP等。在calico的角色是监听host上由felix注入的路由信息,然后通过BGP协议广播告诉剩余节点,从而实现网络互通。

从内核里面获取哪一些IP的路由发生变化,然后通过标准BGP的路由协议扩散到整个其他的宿主机上,让外界都知道这个IP在这里,你们路由的时候到这里来。

4、BGP router reflector:在大型网络规模中,如果仅仅使用 BGP client 形成 mesh 全网互联的方案就会导致规模限制,因为所有节点之间俩俩互联,需要 N^2 个连接,为了解决这个规模问题,可以采用 BGP 的 Router Reflector 的方法,使所有 BGP Client 仅与特定 RR 节点互联并做路由同步,从而大大减少连接数。

架构特点:

由于calico是一种纯三层的实现,因此可以避免与二层方案相关的数据包封装的操作,中间没有任何NAT,没有任何的overlay,所以他的转发效率可能是所有方案中最高的。因为它的包直接走原生的TCP/IP协议栈,它的隔离也因为这个栈而变得好做。因为TCP/IP协议栈提供了一整套的防火墙的规则,所以他可以通过iptables的规则达到比较复杂的隔离逻辑。

node之间的两种网络:

1、ipip

从字面意思来说就是把一个IP数据包又套在一个IP包里面,即把IP层封装到IP层的一个tunnel。它的作用其实基本上就相当于一个基于IP层的网桥。不同于传统网桥是基于mac层的,ipip通过两端的路由做一个tunnel,把两个本来不通的网络通过点对点连接起来了。

2、BGP

------ 本文结束 ------
您的支持将鼓励我继续创作