一,首先谈谈云计算网络虚拟化的需求
注:
- 跨节点网路隔离化和网络节点的高可用问题在后面将会单独讲解,在本节不进行单独讨论。
首先先说说应用场景
- 1,云计算环境中会有很多用户,这些用户可能是个人用户(拥有少量的虚拟机),或者企业用户(拥有很多的虚拟机)。
- 2,每个用户随时都可能根据需要申请多个虚拟机,或者释放多个虚拟机。
- 3,云计算环境中有很多宿主机,用来生成所需要的云主机,每个宿主机的承载能力有限。
- 4, 用户的云主机随机分配,每个用户的虚拟机可能分布在不同的物理机上,每个物理机也可能承载着不同用户的虚拟机。
对于用户的网络虚拟化我们有以下需求
- 1,同一个用户的所有云主机2层互通,如果一个虚拟机发送2层广播报文,用户的所有虚拟机应该能收到。
- 2,不同用户的虚拟网络应该完全隔离,互相不能感知对方的存在。
- 3,不同用户的虚拟私有网络的网络地址空间可能重读,比如大家都用的192.168.1.0/24网段。
- 4,需要给用户提供直接接入到虚拟网络之中的通道。
- 5,用户的虚拟机需要与外部连通。
接下来我们来设计这个虚拟网络环境。
首先我们先特殊化一这个场景
- 1,假设一个用户的所有虚拟机都在一台物理宿主机上。
- 2,假设每个宿主物理机上都只有一个用户的虚拟机。
- 3,假设用户能直接使用物理机的外网出口。
如上,HOST-1 的所有虚拟机都属于A租户,HOST-2的所有虚拟机都属于租户B,实现方案如下:
1,所有虚拟机的tap设备全部裸露到宿主机中, 互相的2层直接就能互相感知。
2,不同用户的虚拟机在不同的宿主机中,互相不互相感知。
3,由于2条件,用户的地址空间可以重复。
4,宿主机开一个vpn_service服务,为用户提供接入通道。
5,虚拟机的IP通过宿主机的iptables的SNAT服务连通外面。
6,虚拟内部提供一个轻量级的dhcp服务来提供ip分配服务。
相比大家对这个方案比较熟悉,如果把大学的宿舍比作一个宿主机,每个宿舍入住一个用户,宿舍中的所有虚拟机为用户的资源,相必每个用户都是用的192.168.XXX.XXX的网段,上网使用的一台小型路由器提供,大家网费平分。非常符合我们现在的云计算环境的一个特殊例子。
复杂的情况。
接下来我们将,对云计算中与这儿特殊环境进行逐项对比,并一步一步解决这些问题。
- 1,一个用户的虚拟机可能存在多个物理机中,如下图所示。
这个场景就像别的宿舍想连到你们宿舍的局域网一块玩游戏一样,这时候我们就要为该同学拉一根“网线”
此时对于HOST-2中,所有的虚拟机的tap设备就不应该裸露了,否则租户A在HOST-2上面的虚拟机将能监听租户B的网络通信内容,造成网络的不安全。
解决方案:
1,首先在宿主物理机上建一个虚拟bridge,
2,使用不同的tag把不同的租户的虚拟2层网络进行隔离。
3,使用GRE通道把HOST-1上的和HOST-2上的bridge进行连通。
请参考blog
《1》虚拟机与宿主机包连通,
《2》openvswitch中bridge的TAG使用
《3》跨物理节点的2层隔离网络–GRE通道
《4》 生产环境中跨节点隔离网络构架解析
- 2,为用户提供私有的dhcp服务,用户的网络地址空间可能重复。
这个场景就像每个宿舍都使用的192.168.XXX.XXX的网络地址空间,我们需要为每个用户提供私有的dhcp服务器,由于每个用户所使用的网络地址都是重复的,故需要在namespace里面为提供该服务。
解决方案:
1,在bridge中添加type为internal的port,然后添加namespace,把这不同用户的port导入到不同的namespace中。
2,为每个namespace添加dhcp服务器。
请参考blog
《5》为每个网络添加DHCP服务。
- 3,提供私有网络接入服务。
这个场景是这样的,我们可以在云环境中为不同的用户单独创建私有网络,在此我们需要为用户提供一个方法让用户可以接入该虚拟网络,由于需要将不同用户的vpn进行隔离,故我们也需要将vpn放入namespace中。
解决方案:
1,使用成熟的vpn技术。
请参考blog
《6》用vpn打通虚拟私有网络。
- 4,连接外网的需求。
我们应该为每个用户的每台虚拟机都默认提供外网服务,让其可以访问外部网络,由于每个用户所使用网络地址空间可能重复的问题,故我们需要使用SNAT把其源地址进行反射,这部分逻辑看起来也只能放到namespace中,在每个namespace中为用户做SNAT,这样就产生一个问题,每个用户都需要一个namespace,每个namespace的SNAT都需要一个外网地址,如果用户量比较大,这个将是一笔很大的成本开支,为了节约成本,我们对每个用户namespace中的SNAT后的网络包进行二次SNAT,这次我们就可以使用一个外部网络地址为用户提供服务(当然如果有必要,你也可以进行第多次的SNAT)。
解决方案:
1,在namespace中使用iptables的SNAT映射。
2,在宿主机中对所有的用户的网络包进行二次SNAT。
请参考blog
虚拟隔离网络外网访问(SNAT)
整体规划
到这,我们基本把云计算中虚拟化网络的各种组件说完了,接下来我们来对这些组件的部署进行规划。
- 1,在此我们把承载虚拟机的节点称之为计算节点,把部署各种各样的namespace的节点和外网出口,vpn链接,dhcp节点称之为网络节点。
- 2,从规划上来说我们需要将网络节点与普通的计算节点进行分开部署,计算节点可能有很多个,用户的虚拟机可能分布在不同的计算节点。
- 3,最后的 整体规划与图解将在这些都进行完毕进行讲解。
部署图样如下:
注: 在此我们没有进行网络隔离,真实环境中的比较复杂,后面我们会对真实环境进行分析。
在这个图中,我们把计算节点和网络节点进行了单独部署,其中HOST-1和HOST-2属于计算节点,HOST-3属于网络节点。
在下一个阶段将讲述跨接点网络隔离与L3节点的高可用问题。敬请期待。