[toc]
一、calico
官网:https://www.projectcalico.org/
Calico是一个纯三层的网络解决方案,为容器提供多node间的访问通信,calico将每一个node节点都作为一个路由器(router),各节点通过BGP(Border Gateway Protocol)边界网关协议学习并在node节点生成路由规则,从而将不通node节点上的pod连接起来进行通信。
1.1 calico简介
网络通过第三层路由技术(如静态路由或BGP路由分配)或第二层地址学习来感知工作负载IP地址。因此,他们可以将未封装的流量路由到作为最终目的地的端点的正确主机。但是,并非所有网络都能够路由工作负载IP地址。例如公共云环境、跨VPC子网边界的AWS,以及无法通过BGP、Calico对应到underlay网络或无法轻松配置静态路由的其他场景,这就是为什么Calico支持封装,因此可以再工作负载之间发送流量,而无需底层网络知道工作负载IP地址。
1.2 calico封装类型
Calico支持两种类型的封装:VXLAN和IP-in-IP,VXLAN的数据包开销稍高,因为报文头较大,除非运行的是网络密集型工作负载,否则通常不会注意到这种差异。另一个差异是Calico的VXLAN实现不使用BGP,Calico的IP-in-IP是在Calico节点之间使用BGP协议实现跨子网。
BGP是一个去中心化的协议,它通过自动学习和维护路由表实现网络的可用性,但是并不是所有的网络都支持BGP,另外为了跨网络实现更大规模的网络管理,calico还支持IP-in-IP的叠加模型,简称IPIP,IPIP可以实现跨不通网段建立路由通信,但是会存在安全性问题,其在内核内置,可以通过Calico的配置文件设置是否启用IPIP,在公司内部如果k8s的node节点没有跨越网段建议关闭IPIP。
IPIP是一种将各Node的路由之间做一个tunnel,再把两个网络连接起来的模式。启用IPIP模式时,Calico将在各Node上创建一个名为"tunnel0"的虚拟网络接口。
BGP模式则直接使用物理机作为虚拟路由器(vRouter),不再创建额外的tunnel。
1.3 calico核心组件
Felix:calico的agent,运行在每一台node节点上,主要是维护路由规则、汇报当前节点状态以确保pod的跨主机通信。
BGP Client:每台node都运行,其主要负责监听node节点上有felix生成的路由信息,然后通过BGP协议广播至其他node节点,从而相互学习路由实现pod通信。
Route Reflector:集中式的路由反射器,calico v3.3开始支持,当Calico BGP客户端将路由从FIB(Forward Information dataBase,转发信息库)通告到Route Reflector时,Route Reflector会将这些路由通告为部署集群中的其他节点,Route Reflector专门用于管理BGP网络路由规则,不会产生pod数据通信。
注:calico默认工作模式是BGP的node-to-node mesh,如果要使用Route Reflector需要进行相关配置。
二、flannel
2.1 flannel简介
由CoreOS开源的针对k8s的网络服务,解决k8s集群中各主机上的pod相互通信的问题,借助于etcd维护网络IP地址分配,并为每一个node服务器分配一个不同的IP地址段。
2.2 flannel网络模型
Flannel网络模型(后端):UDP、VXLAN、Host-gw
UDP:早起版本使用UDP封装完成报文的跨主机转发,安全性及性能不足。
VXLAN:linux内核再2012年底的v3.7.0之后加入VXLAN协议支持,因此新版本的flannel也由UDP转换为VXLAN,VXLAN本质上是一种tunnel(隧道)协议,用来基于三层网络实现虚拟的二层网络,目前flannel的网络模型已经是基于VXLAN的叠加(覆盖)网络,目前推荐使用VXLAN网络模型。
Host-gw:也就是Host GateWay,通过在node节点上创建到达各目标容器地址的路由表而完成报文的转发,因此这种方式要求各node节点必须处于同一个局域网(二层网络)中,不适用与网络变动频繁或比较大型的网络环境,但性能较好。
2.3 flannel组件
Cni0:网桥设备,每创建一个pod都会创建一对veth pair,其中一段是pod中的eth0,另一端是Cni0网桥中的端口(网卡),pod中从网卡eth0发出的流量都会发送到Cni0网桥设备的端口(网卡)上,Cni0设备获得的ip地址是该节点分配到的网段的第一个地址。
Flannel.1:overlay网络的设备,用来进行vxlan报文的处理(封包和解包),不同node之间的pod数据流量都从overlay设备以隧道的形式发送到对端。
三、flannel和calico网络组件对比
calico支持网络策略(NetworkPolicy),flannel不支持
calico性能优于flannel
不启用overlay:flannel host-gw(不支持网络策略),calico BGP(推荐)
启用overlay:flannel vxlan,calico IPIP
四、overlay和underlay
4.1 overlay网络
4.1.1 overlay简介
叠加网络(覆盖网络),在物理网络的基础之上叠加实现新的虚拟网络,在物理网络的基础之上叠加实现新的虚拟网络,即可使用网络中的容器相互通信
4.1.2 overlay实现方式
overlay使用VxLAN或NVGRE技术实现
- VxLAN
VxLAN全称是Visual eXtensible Local Area Network(虚拟扩展本地局域网),主要有Cisco推出,vxlan是一个VLAN的扩展协议,由IETF定义的NVO3(Network Virtualization over Layer 3)标准的技术之一,VXLAN的特点是将L2的以太帧封装到UDP报文(即L2 over L4)中,并在L3网络中传输,即使用MAC in UDP的方法对报文进行重新封装,VxLAN本质上是一种overlay的隧道封装技术,它将L2的以太网帧封装成L4的UDP数据报,然后再L3的网络中传输,效果就像L2的以太网帧在一个广播域中传输一样,实际上L2的以太网帧跨越了L3网络传输,但是不受L3网络的限制,vxlan采用24位标识vlan ID号,可以支持2^24=16777216个vlan,其扩展性比vlan强大很多,可以支持大规模数据中心的网络需求。
- VTEP
VTEP(VXLAN Tunnel Endpoint vxlan隧道端点),VTEP是VXLAN网络的边缘设备,是VXLAN隧道的起点和终点,VXLAN对用户原始数据帧的封装和解封装均在VTEP上进行,与物理网络相连,分配的地址为物理网IP地址,VXLAN报文中源IP地址为本节点的VTEP地址,VXLAN报文中目的IP地址为对端节点的VTEP地址,一对VTEP地址就对应着一个VXLAN隧道,服务器上的虚拟交换机(隧道flannel.1就是VTEP),比如一个虚拟机网络中的多个vxlan就需要多个VTEP对不同的网络报文进行封装与解封装。
- VNI
VNI(VXLAN Network Identifier):VXLAN网络标识VNI类似VLAN ID,用于区分VXLAN段,不通VXLAN段的虚拟机不能直接二层相互通信,一个VNI表示一个租户,即使多个终端用于属于同一个VNI,也表示一个租户。
- NVGRE
NVGRE(Network Virtualization using Generic Routing Encapsulation):主要支持这是Microsoft,与VXLAN不通的是,NVGRE没有采用标准传输协议(TCP/UDP),而是借助通用路由封装协议(GRE),NVGRE使用GRE头部的低24位作为租户网络标识符(TNI),与VXLAN一样可以支持1777216个vlan。
4.2 underlay网络
4.2.1 undelay简介
underlay网络就是传统IT基础设施网络,由交换机和路由器等设备组成,借助以太网协议、路由协议和VLAN协议等驱动,它还是overlay网络的底层网络,为overlay网络提供数据通信服务。容器网络中的underlay网络是借助驱动程序将宿主机的底层网络接口直接暴露给容器使用的一种网络构建技术,较为常见的解决方案有MAC VLAN、IP VLAN和直接路由等。underlay依赖于网络进行跨主机通信。
4.2.1 underlay实现方式
- Bridge:桥接模式
- MAC VLAN:支持在同一个以太网接口上虚拟出多个网络接口(子接口),每个虚拟接口都拥有唯一的MAC地址并配置网卡子接口IP。
- IP VLAN:类似于MAC VLAN,它同样创建新的虚拟网络接口并为每个接口分配唯一的IP地址,不同之处在于,每个虚拟接口将共享使用物理接口的MAC地址,从而不再违反防止MAC欺骗的交换机的安全策略,且不要求在物理接口上启用混杂模式。
IP VLAN有L2和L3两种模型,其中IP VLAN L2的工作模式类似于MAC VLAN被用作网桥或交换机,而IP VLAN L3模式中,子接口地址不一样,但是共用宿主机的MAC地址。虽然支持多种网络模型,但MAC VLAN和IP VLAN不能同时在同一物理接口上使用。
一般使用MAC VLAN。
Linux内核从4.2版本后支持IP VLAN。
4.3 overlay和underlay区别
overlay容器有独立的子网,跨主机通信需要依赖隧道,报文做封装和解封,而underlay不需要,underlay容器和宿主机是同一个子网,跨主机通信不需要隧道封装,所以underlay性能更高一些;但是underlay需要占用宿主机网络的ip,overlay横向扩展性能要好,可以扩相同网络的主机,也可以扩不通网段的主机。
五、node节点的iptables规则
5.1 iptables四表五链
5.1.1 四表
filter、nat、mangle、raw
优先级由高到低:raw -> mangle -> nat -> filter
5.1.2 五链
- PREROUTING:规则可存在于raw表,mangle表,nat表。
- INPUT:规则可存在于mangle表,filter表,nat表(CentOS 7中有,CentOS 6没有)。
- FORWARD:规则可存在于mangle表,filter表。
- OUTPUT:规则可存在于raw表,mangle表,nat表,filter表。
- POSTROUTING:规则可存在于mangle表,nat表。
5.2 PREROUTING链
5.2.1 匹配PREROUTING链raw表
使用raw表解决ip_conntrack、table full、dropping packet等场景
raw表可以在那些不需要nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度。
raw表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一旦用户使用了raw表,在某个链上,raw表处理完后,将跳过nat表和ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了。
如果PREROUTING链上,既有mangle表,也有nat表,那么优先由mangle表处理,然后由nat表处理
PREROUTING链的raw表主要是对报文进行打标记,没有执行访问转发操作,然后继续向下。
5.2.2 匹配PREROUTING链mangle表
mangle表的主要功能是根据规则修改数据包的一些标志位,以便其他规则或程序可以利用这种标志对数据包进行过滤或策略路由。
PREROUTING链的mangle表主要是对报文添加注释和打标记,并没有执行访问转发操作,然后继续向下。
5.2.3 匹配PREROUTING链nat表
PREROUTING链的nat表,如需要就要做目的地址转换(DNAT)
报文被PREROUTING链中的匹配规则通过之后,就会到达本机路由阶段,本机路由匹配去往目的pod的路由,如果pod在本机,则本机转发至本机,如果目的pod不在本机,则基于本机路由表,转发至指定目的node节点。
5.3 INPUT链
对目的地之为本机的报文进行规则匹配
5.3.1 匹配INPUT链mangle表
规则默认为空,默认放行
5.3.2 匹配INPUT链nat表
为空,不需要在INPUT的阶段做NAT
5.3.3 匹配INPUT链filter表
filter表是iptables的默认操作的表,用于对访问地址为本机的报文进行匹配和执行下一步动作。