【ZStack】11.网络模型1-L2和L3网络

587 阅读9分钟

ZStack将网络模型抽象为L2和L3网络。L2网络提供一种二层网络隔离的方式,而L3网络主要和OSI七层模型中第4层~第7层网络服务相对应。我们的想法是使用管理员熟悉的术语和概念,来形容ZStack的网络模型,使得管理员可以方便快捷的创建网络拓扑。

注:我们将不涉及任何在Hypervisor端虚拟化技术的网络实现细节;例如,我们将不讨论ZStack如何在Linux操作系统中创造网桥或VLAN设备。这篇文章的目的是给你介绍ZStack网络模型的简要构想。如果你还没有阅读“通用插件系统”的话,我们强烈建议你去阅读一遍,因为许多和插件相关的术语将在下文被提到。

概述

云计算中最令人兴奋和最困难的部分应该是网络模型。云技术给传统的数据中心带来的最大的变革是,管理员不需要花费几天甚至几周的时间去创建或改变网络的拓扑结构,相反,他们可以几分钟就能完成以前很艰巨的任务,通过点击在IaaS软件用户界面上的一些按钮。 为了达到这种简单性,IaaS软件必须有一个清晰、灵活的网络模型,可以帮助管理员在云中建立大多数的,传统数据中心里的典型的网络拓扑。而且,更重要的是,它必须允许管理员改变已经构建好的网络,在任何必要的时候,而无需重新部署整个云。 ZStack的网络模型的整体画面就像:

一个L2网络,精确地表示了一个二层网络广播域的,是所有网络元素的基础。在L2网络之上,有各种L3网络和网络服务提供模块;一个L3网络是一个与网络服务相关的子网;尽管一个L2网络通常只包含一个L3网络,只要L3网络的IP段不冲突,多个L3网络可以并存于同一L2网络。一个L3网络可能有一个或多个属于同一子网的IP段,IP地址分段的目的是为了让用户保留一部分来自子网的IP。网络服务,类似于DHCP、DNS,由绑定到一个L2网络上的提供器提供给L3网络。

注:由于虚拟私有云(VPC)尚未在这个ZStack版本(0.6)支持,上述网络模型不显示VPC将如何工作。然而,概念是类似的,VPC只是一个为多个L3网络设计的,有编程选路功能的调度器。我们将在未来的ZStack版本中引入VPC,不久之后。

#L2网络

一个L2网络负责提供一种二层隔离方法,可以是一个纯粹的L2技术(如VLAN),或一个网络覆层(overlay)技术(如GRE隧道,VxLAN)。ZStack不关心L2网络在后端使用的技术细节,所以包含必要的L2信息的数据结构--L2NetworkInventory--是高度抽象的:

FIELDDESCRIPTION
uuidL2 network UUID
namea short name
descriptiona long description
zoneUuiduuid of zone the L2 network belongs to
physicalInterfacea string containing information necessary to implement the L2 network at the backend. for example, 'eth0'
typeL2 network type
attachedClusterUuidsa list of cluster uuid the L2 network has attached to

L2网络的子类型可能有额外的属性,例如,L2VlanNetwork有一个额外的字段的vlan。

绑定策略

在真实的数据中心中,L2网络通常代表主机之间一个的物理网络连接。例如,在同一L2交换机下的主机可能在同一个L2网络中。网络的连接不是一成不变的,它可能会在任何数据中心的物理设备改变的时候改变,例如管理员重新配置(re-wire)一个L2交换机。为了提供一种灵活的、描述主机和L2网络之间的关系的方式,ZStack采用了一种所谓的绑定策略,允许一个L2网络连接从多个集群(主机的集合)中绑定/解绑。

上图,Cluster1和Cluster2中的主机都是挂载在L2 Network1上,同时Cluster2上的主机也挂载在L2 Network2上,管理员可以同时将L2 Network1绑定两个集群,却不能仅仅把L2 Network2绑定在Cluster2上。一段时间后,如果管理员为了删除L2 Network1上的连接,重新配置在Cluster2上的主机,他们可以从Cluster2中解绑L2 Network1去反映当前的网络连接。

集群和L2网络之间的挂载关系,展示了在这些集群内的主机之间建立L2广播域的行为,这并不总是涉及到物理连接的变化。例如,连接到标记的交换机端口的主机,可以在以太网设备上使用操作系统中相同的VLAN创建网桥,用来为连接到这些网桥的虚拟机建立一个L2广播域;在这种情况下,绑定或解绑L2网络并不意味着任何物理基础设施的变化,但意味着创建或删除一个L2广播域的行为。

上图所示,一旦管理员创建一个包含VLAN 10的L2VlanNetwork,并把它挂载到cluster1和cluster2上,一个广播域在这些集群中的主机之间被创建。虚拟机管理程序可以通过各种方式来实现L2广播域,例如,KVM主机可以在它们的Linux操作系统上通过VLAN设备(VLAN 10)创建网桥;如果L2VlanNetwork解绑集群cluster2后,被解绑的集群中的主机将通过删除它们的VLAN(10)网桥的方式,从广播域中被移除。这种创建/销毁广播域的概念适用于所有L2网络类型;例如,绑定一个OvsGreL2Network到KVM集群上可能导致GRE隧道在这些主机中被创建,而将一个OvsGreL2Network解绑可能导致GRE隧道被删除。

这种绑定策略有一个额外的好处是,考虑到了限制虚拟机可以运行的主机。因为虚拟机总是和L3网络一起被创建,这些L3网络属于一些L2网络,虚拟机将只被分配给已经绑定这些L2网络的集群中的主机。通过这种方式,管理员可以通过L2网络把主机划分到不同的池中,例如,一个连接了高带宽的L2网络的集群,一个连接了公有L2网络的集群。如果管理员想把所有的主机都放在一个单一的池中,他们可以让所有的L2网络绑定所有的集群。

后端实现

通过虚拟化技术,L2网络的后端实现是高度依赖Hypervisor的。例如,在KVM主机上实现L2VlanNetwork就是创建一个VLAN设备的网桥,但对于VMWare ESXi主机则是配置vSwitch。为了让L2网络的实现和Hypervisor解耦,ZStack将实现某种类型L2网络的责任委托给Hypervisor插件。为了实现一个L2网络,定义了两个扩展点。第一个是L2NetworkRealizationExtensionPoint:

public interface L2NetworkRealizationExtensionPoint {
    void realize(L2NetworkInventory l2Network, String hostUuid, Completion completion);

    void check(L2NetworkInventory l2Network, String hostUuid, Completion completion);

    L2NetworkType getSupportedL2NetworkType();

    HypervisorType getSupportedHypervisorType();
}

当一个L2网络被绑定到一个集群,这个拓展点将被集群中的每个主机所调用,这个Hypervisor插件可以借此机会在后端主机实现网络;例如,KVM的插件同时有KVMRealizeL2NoVlanNetworkBackend和KVMRealizeL2VlanNetworkBackend,后者拓展了L2NetworkRealizationExtensionPoint,为了在Linux操作系统创造网桥。这个扩展点是非常有用的,对于不需要知道虚拟机信息的L2网络而言。L2NoVlanNetwork和L2VlanNetwork都属于这一类。 然而,一些L2网络可能只能在虚拟机被创建的时候实现,例如,一个L2VxlanNetwork可能需要查找虚拟机所有者帐户的VID,为了建立一个L2广播域;在这种情况下,Hypervisor插件可以实现另一个扩展点PreVmInstantiateResourceExtensionPoint:

public interface PreVmInstantiateResourceExtensionPoint {
    void preBeforeInstantiateVmResource(VmInstanceSpec spec) throws VmInstantiateResourceException;

    void preInstantiateVmResource(VmInstanceSpec spec, Completion completion);

    void preReleaseVmResource(VmInstanceSpec spec, Completion completion);
}

插件可以从VmInstanceSpec中获取获取目标主机和虚拟机的信息,然后在目标主机创建虚拟机之前实现一个L2网络。

L3网络

一个L3网络是创建在L2网络上的一个子网,与网络服务相关联;它可以有多个IP地址范围,只要它们属于同一个L3网络且彼此并不冲突。

在上面的图片中有两个IP范围(192.168.0.10 - 192.168.0.50)和(192.168.0.60 - 192.168.0.100),从192.168.0.51到192.168.0.59的IP被保留,这样管理员可以把它们分配给不被ZStack管理的设备。 如果没有由网络服务提供模块提供的、和底层的L2网络服务相关的网络服务,L3网络没有任何用处。网络服务提供模块可以提供一个或多个网络服务,例如,ZStack的默认虚拟路由提供模块能够提供几乎所有常见的网络服务如DHCP、DNS、NAT等,而F5提供模块可能只提供负载均衡服务。在ZStack版本(0.6)中,网络服务提供模块只能在L2网络被创建的时候和L2网络关联;例如,实现了L2NetworkCreateExtensionPoint的虚拟路由,将在任何L2网络创建后与之关联。

管理员可以将网络服务绑定到一个L3网络;对于一类服务,只有一个网络服务提供模块提供的服务可被绑定到这个L3网络;例如,你不能将来自不同提供模块的两个DHCP服务绑定到同一L3网络。在ZStack版本(0.6)中,定义了六种网络服务类型:DHCP、DNS、NAT、EIP、端口转发和安全组,提供模块只需要实现相应的后端:NetworkServiceDhcpBackend,NetworkServiceDnsBackend,NetworkServiceSnatBackend,EipBackend,PortForwardingBackend,SecurityGroupHypervisorBackend来提供这些服务。在“网络模型2:虚拟路由器的网络服务提供模块”,我们将讨论我们引用到的提供模块——虚拟路由,你可以探索更多的细节。

总结

在这片文章中,我们简要地解释了ZStack的网络模型。在没有挖掘后台Hypervisor的细节的情况下,我们演示了ZStack是如何将OSI模型抽象为L2网络(layer 2),L3网络(layer 3)以及网络服务(layer 4~7)。在下一篇文章中,我们将详细阐述网络服务提供模块的参考实现,关于它如何在虚拟机中实现DHCP、DNS、NAT、EIP和端口转发。